World-Map Scale: a realism audit

In the Mountains — are the proportions of the soldiers, the outpost, the villages, the terrain, and the distances between them true to the real Korengal?

2026-06-06 · seed korengal · measured on HEAD · model numbers from the live game, real-world numbers from a cited 13-agent research pass

The short answer: your instinct is right — and the loudest problem is the easiest to fix.

At the default zoom the game paints each soldier ≈21 m wide on the ground — 36× too big — so men visually dominate a 170 m outpost and a squad standing at textbook spacing fuses into a single blob. That is a rendering bug, not a simulation bug. Strip it away and the underlying sim is, in most dimensions, already authentic: the elevation, the 1,368 m of relief, the ridge-crest heights, the engagement ranges, the 9-man squad, even the 5.5 m man-to-man spacing all check out against doctrine and the real valley.

The deeper geometry drifts — the map is one short, square slice of a long narrow slot; a "village" is drawn as one building instead of a hamlet of ~90; the garrison is a touch under-strength — are real, but they are contained, deliberate design choices. Two buckets, and Bucket 1 is cheap.

MODEL vs REALITY — THE SCALE SCORECARDhow many times each dimension is off from the real Korengal — bars on a log scale10×50×100×Buildings drawn per village90.0× off · 1 compound → ~90 housesSoldier size on map (default zoom)36.0× off · ≈21 m → 0.6 mValley length (along-axis)3.8× off · 2.56 km → ~9.7 kmValley floor width (too WIDE)3.4× off · 2.56 km → ~0.75 kmWeapons squad3.0× off · 3 → 9COP wall extent (small OP)2.6× off · ~220 m → ~85 mSquad dispersion (in 1–10 m band)✓ authentic · 5.5 m → ~10 mMax engagement range✓ authentic · 620 m → ~800 mPlatoon strength1.20× off · 35 → 39–42Ridge crest elevation✓ authentic · 2,780 m → 2,854 mValley floor elevation✓ authentic · 1,550 m → ~1,500 mRifle squad size✓ authentic · 9 → 9RENDER (cheap fix)SIM-GEOMETRYORGALREADY AUTHENTIC

Every dimension we could pin to a number, ranked by how far it is from reality. The two giant bars are a render bug and a render+sim bug; below them a short cascade of genuine geometry drifts; and a reassuring cluster of green — things that are already right.

BUCKET 1 — Representation (render only, do first). The sim's numbers are mostly correct; the renderer misreports them. Low-risk, high-impact, fixes ~90% of the "feels wrong." Touches only lib/render/ + components/world/.
BUCKET 2 — Simulation scale (worldgen, do second). Genuine model choices about valley size, village structure, roster, and standoff. Higher blast radius; each is a realism-vs-playability call and must respect the determinism contract.

How scale works here (60-second primer)

The world is a 512 × 512 grid at 5 m per cell — a 2.56 km square (lib/sim/terrain.ts:118). The camera carries a single scalar, ppmpixels per metre — that defaults to 0.7 (WorldView.tsx:103) and ranges 0.3–8.0. The pipeline is honest by construction: the pure simulation works in metres; the renderers multiply metres by ppm to get pixels. A building's footprint in metres × ppm = its size on screen. That is faithful.

Soldiers are the exception. A man is not drawn from his footprint. He is drawn at figurePx = clamp(ppm × 7, 15, 40) (lib/render/draw.ts:19) — a fixed pixel size with a 15 px floor, divorced from his real 0.6 m width. Divide that by ppm and you recover how many metres of ground the game is implicitly claiming the man covers. That single line is the source of the headline problem.

Finding 1 — Soldiers are painted as giants RENDER · highest impact

Because figurePx has a pixel floor, the more you zoom out the larger the soldier becomes relative to the ground. At the default zoom he is 21.4 m across; he is never smaller than 5 m at any zoom the game allows. A real soldier is 0.6 m.

TO SCALE: A SOLDIER AND HIS OUTPOSTevery shape below drawn at one consistent scale — 2.6 px = 1 metreCOMBAT OUTPOST — 170 m acrossqalat 30 msoldier AS DRAWN(default zoom): 21 mreal soldier: 0.6 m(the speck — 1.7 px here)100 mTHE MISMATCHDrawn soldier : 21 mReal soldier : 0.6 m→ 36× too large at the default zoom.A man is painted as wideas 2/3 of a compound.
THE CLAMP NEVER LETS A SOLDIER LOOK REALground width of the drawn soldier figure vs. zoom — it floors at 5 m and never reaches the 0.6 m truth1 m2 m5 m10 m20 m50 m0.30.50.71248camera zoom (pixels per metre →)a real soldier: 0.6 m50m30m21m15m8m7m5mdefault zoom

The same story in hard numbers, straight from the live renderer's own formulas (the ◄ default row is what you see on load):

zoom (ppm)figure pxground widthvs real 0.6 m% of COP width9-man squadscreen covers
0.31550 m83× oversized29.4%blob4800 × 3000 m
0.51530 m50× oversized17.6%blob2880 × 1800 m
0.7 ◄ default1521.4 m36× oversized12.6%blob2057 × 1286 m
11515 m25× oversized8.8%blob1440 × 900 m
2157.5 m13× oversized4.4%blob720 × 450 m
4287 m12× oversized4.1%blob360 × 225 m
8405 m8× oversized2.9%blob180 × 113 m

At the default zoom a single soldier spans 12.6% of the entire outpost's width. A real soldier spans 0.35% — a 36× exaggeration. (Even the low-zoom NATO dot, the r = clamp(0.95·ppm, 4.5, 13) marker at draw.ts:96, is ~13 m wide at default — a ~21× exaggeration on its own.) Here it is on the live map, with a trustworthy 100 m scale bar:

The COP at the default zoom (ppm 0.7). The garrison reads as a chunky cluster of figures piled on the outpost — each figure is drawn ~21 m wide. Scale bar = 100 m. 100 m
The COP at the default zoom (ppm 0.7). The garrison reads as a chunky cluster of figures piled on the outpost — each figure is drawn ~21 m wide. Scale bar = 100 m.
Why it exists, and why the fix isn't "1:1." Drawing a man at his true 0.6 m would make him a sub-pixel speck at operational zoom — invisible. The renderer over-corrects with a fixed floor. The right answer is the standard operational-wargame convention (NATO APP-6 / MIL-STD-2525; Command Ops, Combat Mission, Steel Beasts all do this): one small unit icon per element when zoomed out, individual figures at near-true footprint when zoomed in. The codebase already has the instinct — it hides the garrison entirely below ppm 0.5 (WorldView.tsx:342); fix R2 just generalizes that all-or-nothing cull into a per-squad icon. See R1 and R2 in the change brief.

Finding 2 — A squad at correct spacing renders as one blob RENDER

This is the subtle one, and it explains why the spacing feels wrong even though the sim spaces men correctly. The simulation disperses a moving squad at 5.5 m between men (range 4–12 m, formation.ts) — squarely inside the doctrinal 1–10 m wedge band (FM/ATP 3-21.8: "normally 10 metres," tightening in close terrain). But at the default zoom, 5.5 m on screen is only 3.85 px, while each figure is drawn 15 px wide. The figures are four times wider than the gap between them, so they overlap at every zoom the game offers — the spacing you set can never be seen.

SQUAD DISPERSION — GROUND TRUTH vs WHAT YOU SEEthe model's real 5.5 m spacing, drawn at default zoom — magnified 11× so the eye can read itGROUND TRUTH9 men · 5.5 m apart44 m of front — nine distinct soldiersAS RENDEREDdefault zoom (ppm 0.7)figure (15 px) is 4× the 3.85 px gap → the nine men fuse into one blob
A 9-man squad placed at the model 100 m
A 9-man squad placed at the model's real 5.5 m spacing, default zoom. Nine men — but you see a clump. Scale bar = 100 m.
Same squad at tactical zoom (ppm 2.0). The outpost is at left; the squad on the apron is still an unresolved cluster. Scale bar = 50 m. 50 m
Same squad at tactical zoom (ppm 2.0). The outpost is at left; the squad on the apron is still an unresolved cluster. Scale bar = 50 m.

The squadFiguresOverlap column in the table above is blob at every single zoom level. Fix this with the same R1/R2 changes — once a man is drawn near his true size and a squad collapses to one icon when zoomed out, real dispersion becomes visible.

Finding 3 — A "village" is one building, not a hamlet RENDER + SIM · biggest geometry error

The research is unambiguous (confidence 0.75): a real Korengal village — Babiyal, Aliabad, Loy Kalay — is a cluster of ~80–100 mud-and-stone houses stacked on hillside terraces, housing 650–830 people. The game models a village as a single walled compound: WorldView.tsx:198 draws exactly one qalat sprite (widthM 24/36/50 m by population) over a single map pin. A whole settlement is rendered as one box.

The COP (left) and the nearest village (right) in one frame at ppm 1.6, with a soldier placed beside the compound. The 50 m
The COP (left) and the nearest village (right) in one frame at ppm 1.6, with a soldier placed beside the compound. The 'village' is a lone structure — not the dozens of stacked houses a real hamlet holds. Scale bar = 50 m.

A single Afghan family qalat at 20–60 m per side is itself plausible (the model's 40–80 m compound sits at the upper end of that) — the error is that one compound stands in for the entire village. Fix R3 scatters a population-scaled cluster of sub-compounds for a render-only win; a deeper Bucket-2 version stamps real multi-compound footprints into the terrain.

Finding 4 — The valley is one short, square slice of a long, narrow slot SIM

The real Korengal runs ~9.7 km along its axis and is only ~0.5–1.0 km wide on the floor — roughly a 10:1 slot (confidence 0.92 on length, 0.85 on width; Wikipedia campaign article + FDD + cross-checks). The game's map is a 2.56 km square: about 3.8× too short along-axis and ~3.4× too wide for the floor, and a square simply cannot hold the real long-narrow geometry.

THE MAP IS ONE SEGMENT OF A LONG, NARROW VALLEYreal Korengal floor (≈10:1 slot) vs the game's 2.56 km square, drawn to one scaleREAL KORENGAL: ~9.7 km × ~0.5–1.0 kmGAME MAP2.56 km square≈ 1 / 3.8 of the valley's length1 kmnote: the model's floor gradient also runs the wrong way (real Korengal drains north)

The most honest framing is that the map represents one ~2.56 km segment of the valley, not the whole thing — which is a defensible tactical-slice choice. Two smaller notes: the floor's elevation gradient runs the wrong way (the real Korengal drains north into the Pech, so the low end should be north, not south), and the 5 m cell resolution is actually finer than public 30 m DEMs — appropriate for a tactical sim.

Finding 5 — The garrison is a satellite OP, and slightly under-strength ORG + SIM

The 35-man platoon maps cleanly onto a forward observation post (Restrepo held ~15 men at a time, a platoon-affiliated ~30–35) — not the company-HQ Korengal Outpost, which held ~100–150 men across the valley. That is "right echelon, wrong node," and entirely defensible: you command a platoon, so a platoon-sized post is the correct scope.

Two concrete drifts worth fixing:

What is already authentic (leave it alone)

A realism audit that only lists faults is crying wolf. These dimensions check out against doctrine and the real valley — changing them would make the sim less true:

How this was verified did an AI really do this?

Nothing here is a guess; every number is either read from the running game or sourced to a citation.

Honest confidence & caveats. The strongest findings (valley length, ridge heights, doctrinal org/dispersion, engagement ranges, the render math) are multiply-sourced or directly measured. The softest are the valley floor elevation (encyclopedic figures conflict with the DEM; reconciled as lower-valley vs mid-valley) and the per-village footprint & house counts (derived from population arithmetic, not measured). A few primary PDFs (the CSI Wanat study, RAND, Wesley Morgan's The Hardest Place) returned 403 or snippet-only. The direction and order of magnitude of every finding are robust; the exact per-village figures are estimates.

The fix, in priority order

The full, agent-ready brief — doctrinal basis → exact file:line → concrete parameter values → integration seam → verification metric, for each change — is in AGENT-BRIEF.md beside this report. In short:

  1. R1 · Stop drawing 5–50 m soldiers. Replace figurePx = clamp(ppm·7, 15, 40) with a footprint-tracking size and a small legibility floor; push the figure-LOD band to genuinely tactical zoom. render
  2. R2 · One icon per squad when zoomed out. Below ~ppm 2.5, draw a single NATO unit symbol per squadId at the squad centroid instead of 35 stacked men; crossfade to individual figures above it. render
  3. R3 · Villages as clusters. Scatter a population-scaled ring of sub-compounds per village instead of one monolithic qalat. render
  4. Bucket 2 · Sim geometry. Restore the 9-man weapons squad (→ 39–42 platoon); reshape the COP from a circle to a terrain-conforming, shorter-walled position; and treat the map explicitly as one segment of a 10:1 valley (or stretch the long axis). All with determinism preserved (serialize()/loadWorld(), smoke.ts). sim

Doing R1 + R2 alone — a few lines in draw.ts plus one squad-aggregation pass in the WorldView render loop — resolves the soldier-giant and squad-blob problems that drive almost all of the "doesn't feel true to life," at near-zero risk to the simulation.

Sources


Generated for In the Mountains · all model figures measured on HEAD at seed korengal · diagrams and screenshots reviewed and revised before publication.