Navigation β€” reference wiki

Lookup reference for mechanics, numbers, fields and terminology. New here? Read the Tutorial first; this page is for when you need the exact figure or definition.

Glossary

Leg
One turn's flight: a great-circle arc of fixed length along your chosen heading. Leg i is 20 Mm / Ο†i.
Heading
The bearing you submit, in degrees clockwise from north. The only quantity you control.
Deviation
A random Cauchy-distributed angle (scale 7.5Β°) added to your heading before the leg is flown.
Beacon
A single point inside the target territory. Your reports give a coarse distance to it.
Fuel
The ratio of your beacon distance to your remaining travel budget. Below 1 the beacon is reachable; at or above 1 it isn't. Reported in golden-ratio steps as lphi_fuel. (Key jargon.)
Target territory
The region you must reach to land and win.
Land
To reach the target territory (usually you must be on dry land). First to land wins.
Strand
To be unable to reach the target β€” you're out, but still eligible for the closest-to-beacon rule.
Seed
The value that seeds the round's random generator β€” a formatted Oslo-timestamp string. Recover it and every deviation becomes known.
Tape
The radio's currency, a fixed budget per round. One unit β‰ˆ one recorded sextet (omnidirectional).
Sextet
Six recorded bits = one base-64 character; the radio's atom of recording.
Mm
Megametre = 1000 km = 106 m. Convenient because leg 1 β‰ˆ 12.36 Mm.
Ο† (phi)
The golden ratio, β‰ˆ 1.6180339887. Legs shrink by this factor each turn.
Annulus
A ring between two radii β€” the shape your distance clues carve out as your possible location.

Geometry & legs

The board is a WGS84 ellipsoid Earth; legs are geodesic (great-circle-like) arcs.

  • Leg length: Li = 20 Mm / Ο†i.
  • First leg: L1 = 20 Mm / Ο† β‰ˆ 12.3607 Mm.
  • Total travel budget (from the start, over all legs): Ξ£iβ‰₯1 Li = 20Β·Ο† β‰ˆ 32.3607 Mm.
  • Remaining budget from leg i onward: 20Β·Ο†2βˆ’i. After leg 1 it is exactly 20 Mm.
Leg iLi (Mm)Remaining after (Mm)
112.360720.0000
27.639312.3607
34.72147.6393
42.91804.7214
51.80342.9180
61.11461.8034
70.68881.1146
80.42570.6888
Reachability
You can only land if the target is within your remaining budget. Since leg 1 almost always overshoots, the earliest possible landing is usually turn 2 or later, and often only once the seed is known.

Golden-ratio (Fibonacci) identities

Because the legs are a geometric series in Ο†, and Ο† obeys φ² = Ο† + 1 and 1/Ο† = Ο† βˆ’ 1 β‰ˆ 0.618, the leg and budget sequences satisfy the same Fibonacci-style recurrence. These are worth memorising β€” they turn budget questions into one-line mental arithmetic:

  • Each leg equals the sum of the next two: Li = Li+1 + Li+2. (The same recurrence as Fibonacci numbers, run on the shrinking side.)
  • Your total remaining travel is always φ² β‰ˆ 2.618 Γ— the next leg. Whatever next_leg_dist is, everything you have left to fly (this leg included) is 2.618 times it. So the reach edge sits at 2.618 next-leg-lengths away.
  • Everything still ahead after you finish leg i sums to Liβˆ’1 β€” exactly the length of the leg you just flew before it. Equivalently, the remaining-budget sequence is the same golden series shifted by two (remaining from leg i onward = Liβˆ’2; e.g. from leg 3 onward = L1 = 12.36 Mm).

One consequence connects straight to lphi_fuel: if the beacon lies exactly on your next-leg ring (distance = next_leg_dist), then it sits at 1/φ² of your remaining travel β€” which is precisely why lphi_fuel = βˆ’2 marks β€œbeacon reachable in a single leg”.

The heading deviation

Each turn, before flying, the game adds a random angle to your submitted heading:

deviation = 7.5 Β· tan(Ο€ Β· (random() βˆ’ 0.5))   # degrees

This is a Cauchy distribution with scale 7.5Β°. It is symmetric about 0 and heavy-tailed β€” it has no finite mean or variance, so β€œexpected value” reasoning fails and large excursions are routine.

Quantiles of the wobble β€” the half-width your deviation stays within, with the stated probability (two-sided). Note how fast the tail runs away past the median:

P(|deviation| < x)x
0.101.19Β°
0.253.11Β°
0.507.50Β°= the scale Ξ³
0.7518.1Β°
0.9047.3Β°
0.9595.3Β°a quarter-turn
0.99477Β°> one full turn
0.999β‰ˆ 4780Β°β‰ˆ 13 full turns

The last rows are not typos. Because tan diverges near Β±90Β°, roughly 1 in 100 draws exceeds a full 360Β° rotation, and 1 in 1000 spins the heading around a dozen times. The flown bearing is (heading + deviation) mod 360, so a large kick simply wraps β€” a big enough wobble points your leg in an essentially unrelated direction, anywhere on the compass. You cannot bound where a single leg lands.

On a 12.36 Mm leg, 1Β° β‰ˆ 216 km of cross-track error, so even a β€œtypical” few degrees is hundreds of kilometres. This is why knowing the deviation in advance (via the seed) is decisive: submit heading = intended_bearing βˆ’ known_deviation and the flown bearing is exact.

Curse and blessing
The heavy tail cuts both ways. Curse: no plan survives a wild kick, and you can't reliably land on a big leg. Blessing: your opponent flies the same deviation sequence, so it never favours them; once you recover the seed you cancel the wobble entirely and steer perfectly; the wide spread makes candidate seed paths fan out fast, which speeds up recovery; and an occasional big kick can fling you straight onto useful, identifiable land you'd never have reached by aiming.

Location report β€” field reference

The location event each turn. Geographic-layer fields are present only where they apply.

FieldTypeMeaning
statusstringplaying, landed or stranded.
next_leg_distfloatLength of the next leg, metres.
deadlinestringUTC instant by which this turn's move must be committed.
incrementfloatFischer-clock increment: seconds added to your time bank after you commit this turn's move. Constant across the round.
localtimestringLocal wall-clock time at your position.
utc_offsetintOffset from UTC, seconds.
timezonestringIANA zone (e.g. Europe/Oslo on land/territorial waters; Etc/GMT-1 in international waters).
ln_distintRounded natural log of distance (m) to the beacon.
lphi_fuelintFloored golden-ratio log of (beacon distance / remaining travel). β‰₯ 0 β‡’ beacon out of reach.
inferred_bounds[float, float]Near/far radii of the annulus implied by the two logs above.
opponentsdictPer-opponent info β€” see Opponent info.
esristringCountry by highly detailed shapes; also primary-landmass / island-size info.
natural_earthstringCountry (Swedish POV), sometimes a subcountry; generalised shapes, often closest to the game master's definitions.
disputedstringDisputed territories.
antarcticstringAntarctic territorial claims.
*_municipal, *_postalstringDanish/Finnish/Norwegian/Swedish municipalities; Faroese/Norwegian postal areas.
maritime_zonestringTerritorial waters, EEZs, seabed claims.
iho_seastringIHO sea area.
image_*stringPresent when a location image is attached.

Distance signals β€” ln_dist, lphi_fuel, inferred_bounds

ln_dist is round(ln(distance_to_beacon_in_metres)). Because it's rounded in log space, each value is a factor-of-e (β‰ˆ 2.718) band. A reference:

ln_distβ‰ˆ centre distanceband (eΒ±0.5)
130.44 Mm0.27 – 0.73 Mm
141.20 Mm0.73 – 1.98 Mm
153.27 Mm1.98 – 5.39 Mm
168.89 Mm5.39 – 14.7 Mm
1724.2 Mm14.7 – 39.9 Mm

Consequence: far readings barely constrain the beacon (band thousands of km wide); a close reading pins it tightly. To locate the beacon, triangulate from several readings taken at known positions β€” and weight the close ones.

Fuel and lphi_fuel

Fuel is the ratio of your beacon distance to your remaining travel budget: fuel = beacon_distance / remaining_travel. Fuel < 1 means the beacon is within reach; fuel β‰₯ 1 means it isn't. lphi_fuel reports this in golden-ratio steps:

lphi_fuel = floor(log_Ο†(fuel))

Using the identity remaining travel = φ² Β· next_leg (see Geometry), this is the same as floor(log_Ο†(beacon_distance / next_leg_dist) βˆ’ 2) β€” so each unit of lphi_fuel is one golden step measured against your next leg:

lphi_fuelbeacon distance is…
β‰₯ 0β‰₯ remaining travel β€” beacon out of reach (territory may still be reachable)
βˆ’1between about φ× and φ²× the next-leg ring
βˆ’2on the next-leg ring β€” i.e. the beacon is a single leg away (distance β‰ˆ next_leg_dist)
≀ βˆ’3well inside the next-leg ring β€” you're close

inferred_bounds hands you the near/far radii directly so you don't recompute the logs by hand.

Geographic layers

The report stacks several overlapping geographic sources. They don't always agree β€” they use different shapes and viewpoints β€” so use them together:

  • esri β€” highly detailed shapes, closest to ground truth for coastlines and international borders, plus whether you're on the primary landmass or a small island. This is the most reliable layer for judging landfall β€” is this point actually on land, and inside which country's borders.
  • natural_earth β€” more generalised shapes from a Swedish point of view, so it reflects different political recognitions (e.g. it recognises Kosovan sovereignty). Often closest to how the game master defines a target territory, so it's a good tie-breaker for β€œdoes this count as the target?” β€” but trust esri for the physical coastline.
  • disputed and antarctic are also sourced from Natural Earth (disputed territories and Antarctic claims respectively).
  • maritime_zone / iho_sea β€” which waters you're over (territorial waters, EEZ, named sea). Tells you you're at sea, and roughly where.
  • National subdivisions (*_municipal, *_postal) β€” fine-grained locality where available, useful for pinning a landing.

For seed recovery, the useful distilled signal each turn is (on land?, which country if land, UTC offset). For landing, use esri for the coastline/border and cross-check natural_earth for whether the game master would call it the target.

Win conditions & tie-breaks

  1. First to land wins outright. Landing one turn earlier beats any tie-break consideration.
  2. Same-turn landing β†’ furthest from the beacon wins. If several land on the same turn, the one farthest from the beacon takes it.
  3. Everyone strands β†’ closest to the beacon wins. If nobody reaches the target, the closest to the beacon wins the consolation.

Details worth knowing:

  • You must usually land on land within the territory, unless the round says otherwise.
  • A player who resigns (declares stranded) still competes for the closest-to-beacon rule.
  • Each player begins the next round from their end position this round β€” so even a lost round positions you for the next.
  • You and your opponent share the same deviation sequence each round, but (after round 1) start from different positions. It's a race over identical wobbles from different starting points.

Seed & seed recovery

The round's generator is seeded like this:

timestamp = int(random.normalvariate(seed_mean, seed_std))
dt = datetime.fromtimestamp(timestamp, tz=utc)
seed = format_time(dt)   # Oslo-local, Norwegian weekday/month names

So the seed is a formatted timestamp string drawn from a Gaussian around seed_mean with spread seed_std (both given at round start). The string is then used as CPython's string seed. Recovery exploits that there are only a bounded number of candidate timestamps:

  • Enumerate every whole-second timestamp within a few Οƒ of the mean (~360 candidates at Οƒ = 60 s, ~3600 at Οƒ = 300 s).
  • Reproduce each candidate's deviation stream and thus its predicted path.
  • Filter candidates against your reports. Recommended order:
    1. Free per-turn signature β€” (land/sea, country, UTC offset). Costs nothing, works everywhere, often pins the seed by turn 3–4.
    2. Distance bands β€” the ln_dist annulus each turn filters candidates even over open ocean.
    3. Radio tie-break β€” only when a couple of candidates share identical free signals; a single fix over dense airport country separates them.

Candidate landing points for a given heading are spaced on the order of ~11 km, so a radio fix under ~5 km can single one out β€” but the free channels usually get there first without spending any tape. Larger seed_std β‡’ more candidates β‡’ lean harder on distance bands and radio.

After recovery
Your position becomes exact (start known to a couple of km), every future deviation is known, and the whole trajectory is deterministic. You steer by cancelling each turn's known deviation and land precisely. Use the Seed recovery tool to do the enumeration and scoring in-browser.

The radio

7884 airports act as stations, each transmitting at 1 watt. A station's signal at your location attenuates with distance d as

strength = exp(βˆ’dΒ² / (2 Β· rangeΒ²))

plus a constant noise floor of 1 milliwatt acting as one extra β€œstation”. When recording, the radio repeatedly samples one station at a time, chosen with probability proportional to its strength at your true position, and encodes the identities into a bit-stream.

The radio form draws great-circle rings at 1Γ—, 2Γ— and 3Γ— your range. Those rings are iso-strength contours β€” a station's raw strength depends only on how many range-lengths away it is:

distancestrengthvs. noise (1 mW)
0 (right on top)1.0001000Γ—
1Γ— range0.607β‰ˆ 600Γ—
2Γ— range0.135β‰ˆ 135Γ—
3Γ— range0.011β‰ˆ 11Γ—
β‰ˆ 3.7Γ— range0.0011Γ— β€” drops into the noise

So stations inside the first ring are all loud and hard to tell apart (little gradient); stations out past the third ring are essentially inaudible. The useful, discriminating band is roughly the 1×–3Γ— annulus β€” tune range so several airports fall in it at different bearings.

Range β€” the free, decisive knob

range costs no tape but decides whether your tape buys anything. A station discriminates your location best when your distance to it is comparable to range (that's where the Gaussian has steep gradient). Tune it to the spacing of your nearby airports so several sit at different bearings and audible strengths. Too small β‡’ one station dominates (you learn a distance, not a fix); too large β‡’ everything sounds alike.

Tape & sextets

  • You record a whole number of sextets (6 bits each). Omnidirectionally, cost = sextets tape units.
  • With h harmonics (directional antenna), cost = sextets Β· (1 + h).
  • sextets = 0 is a free dry run: it returns the expected nearby stations without spending tape. Always scout first.
  • Smaller range β‡’ lower entropy β‡’ more complete observations per sextet β‡’ a sharper fix. In dense areas the radio can reach ~5 km; sparse areas force a larger range and a coarser fix.
  • Precision improves like 1/√N: halving your error costs 4Γ— the tape. The first fix that turns β€œsomewhere in this sea” into β€œthis blob” is the valuable one; over-refining is the worst buy.

Directional antenna (harmonics)

By default the antenna is omnidirectional (gain ≑ 1). Supply harmonics β€” a list of complex coefficients β€” to shape a directional gain pattern. The radio forms c = [1, *harmonics], L2-normalises it, and multiplies each station's strength by

G(Ο†) = |Ξ£_k c_k Β· e^(βˆ’ikΟ†)|Β²

where Ο† is the bearing to the station. Because c is normalised, total gain is conserved β€” a beam redistributes sensitivity, it doesn't add any. Some patterns:

  • [] (or omitted): omnidirectional, G ≑ 1.
  • [1]: a cardioid, lobe facing north, null due south.
  • c₁ = e^(iΞ²) steers the lobe to bearing Ξ² (e.g. [1j] faces east).
  • Contiguous higher harmonics narrow the lobe; gaps produce multiple symmetric lobes.

Each harmonic multiplies the tape cost, so directionality is worth it only when bearing is the binding constraint: collapsing an elongated (β€œbanana”) fix by adding the missing bearing dimension, or steering a null onto one dominant station to bearing-find it. Few stations β‡’ directional; many stations β‡’ omni.

The Huffman codec & reading the tape

To pack observations into as little tape as possible, the radio builds a Huffman code over the stations, tuned to their expected frequencies at the point you tune to (tune_lat/tune_lon). Huffman gives the loud, likely stations short bit-codes and rare ones long codes, so the common case is cheap. It then draws observations from your true location and writes their codes into the bitstream until the requested sextets (6-bit characters) are filled.

  • The stream is cut at a fixed length, so the last symbol is usually chopped mid-code; total_obs counts only the complete observations.
  • expected_bits_per_obs is the entropy of the tuned distribution β€” the average code length. Fewer expected bits per obs β‡’ more complete observations fit in the same tape. A concentrated distribution (small range, or a dominant nearby station) has low entropy β†’ short codes β†’ many observations per sextet; a spread-out one costs more bits each and yields fewer.
  • Tuning accuracy matters for efficiency: the code is optimal only for the tuned point. Tune far from your true location and the average code runs longer (you spend more bits per obs and get fewer of them) β€” but the observations themselves still come from the true location, so the fix is unbiased, just noisier per unit of tape.
  • The report gives each station's code as a bitstring and the raw tape, so you can decode the tape yourself β€” verify the counts, or pull out detail the summary omits (e.g. exactly where the stream was cut).

The radio report

A call returns the top-10 expected stations plus any other actually observed: expected and observed frequencies, distance and bearing from the tuning point, each station's Huffman code, the total complete observations, the expected bits per observation, the coefficients used, and the raw tape. The noise floor appears as a station with IATA ---.

Budget discipline
Radio information is only worth its tape if it changes a decision β€” and a heavy-tailed deviation can waste a perfect fix. Save tape for the one or two turns where geometry is rich (dense airports) and stakes are high (a seed tie-break, or endgame landfall). Lean on seed recovery the rest of the time.

Opponent information

Each opponents entry, keyed by name:

FieldMeaning
closer_to_beaconTrue if their distance to the beacon is less than yours β€” i.e. they'd win a same-turn tie as things stand now.
within_leg_dist_of_meTrue if the distance between you and them is less than the next leg β€” i.e. they're within one leg of you (not of the beacon), so they could plausibly reach your vicinity this turn.
headingTheir direction from you, as a 32-point compass bearing.
statusplaying, landed or stranded.

Because you share the deviation sequence, their relative bearings over several turns can be back-solved into an estimate of their position and their likely landing β€” letting you plan to beat their beacon distance on a shared-turn landing.

closer_to_beacon is a snapshot, not a verdict
It compares distances right now. It flips easily β€” if your next leg overshoots the beacon and comes down the far side, you can go from farther to closer (or vice versa) in one turn. Don't treat a current tie-break advantage as banked; re-check it at the turn you actually land.

Moves & the move budget

The move clock is a Fischer (chess-style) clock, not a fresh allowance each turn. You start the round with a time bank (the round base); when you commit a move, an increment of seconds is added to the clock, and any time you didn't use carries over to the next turn. So banking time by moving quickly early leaves you more for a hard turn later β€” and dawdling eats into that reserve. The deadline field gives you the concrete commit-by instant each turn; increment is constant across the round (the protocol could vary it, but it doesn't). The key mechanism for using the clock safely is the provisional move:

  • A submit_flight may carry an optional valid_from timestamp. Until that instant the move stays pending and freely editable; the game only acts on it once valid_from passes.
  • So the intended pattern is: post a safe fallback heading immediately with valid_from near the deadline, then overwrite it in place as your analysis improves. You never risk missing a turn.
  • You may edit or withdraw any pending message; there's at most one submit_flight per turn (edit it rather than posting again).

Other move types: request_radio, request_clarification (asks the game master a question, shared with all players), message_request (a direct message), and declare_stranded (resign the round).

Built-in tools

  • Seed recovery β€” sweeps seed_mean Β± NΟƒ, reproduces each candidate's PRNG stream in-browser, and scores candidates against the timestamp prior and your per-leg deviation observations. Enter each leg's observed deviation (or mark it blank to consume the draw without constraining it); the candidates table shows the surviving seeds and their neighbouring deviations. Observations persist within a round.
  • Map β€” a Leaflet scratch map with geodesic range circles that snap to the golden-ratio leg lengths, per-circle bearing ticks (for planning headings and reading off realised deviations), drag-to-move centres, and GeoJSON export. In effect it's a straightedge-and-compass kit: the leg-length circles are your compass arcs and the bearing ticks your straightedge, so you can construct a whole trajectory β€” or a landing geometry β€” by hand, without any code.
  • Control room β€” the live player page: turn cards, the move-deadline countdown, the provisional-move toggle, and the radio form with range rings and a directional-gain plot.

Protocol summary

Two kinds of object are exchanged, both carrying round and turn:

Messages (you β†’ game master): submit_flight (heading, optional valid_from), request_radio (sextets β‰₯ 0, range, tune_lat, tune_lon, optional harmonics), request_clarification, message_request, declare_stranded.

Events (game master β†’ you): location (the masked report), flight (heading confirmation), radio (a print-out), clarification, direct_message, landed / stranded (terminal, with coordinates), new_round (target_territory, seed_mean, seed_std, tape, opponents), and game_ended (winner, and which rule decided it).

This page summarises the mechanics that matter at the table. The authoritative, exhaustive protocol lives in the project's docs/protocol.md.