Skip to content

DRIFT — Gameplay Specification

Signal Triangulation Mastery Module — KN-86 Deckline Launch Title

Version 1.0 | April 2026 | Status: Engineering-Ready

CIPHER-LINE revision note (2026-04-24): Drift’s Cipher voice — bearing commentary, triangulation progress, transmission assessment — renders on the CIPHER-LINE OLED, not the main 80×25 grid. Pacific Rim Dynamics’s publisher aesthetic: clean, precise, military. Voice is clipped and coordinate-aware. See the CIPHER-LINE Contributions section at the end. Canonical engine spec: docs/software/runtime/cipher-voice.md.


Mission Composition Grammar declaration — verb vocabulary, affinity tag set, and mission-contributions schema are defined in docs/plans/post-v0.1/2026-04-25-mission-composition-grammar.md §1–§3.

(mission-contributions
:verbs (OBSERVE ANALYZE OBTAIN)
:affinities (INFORMATION AERIAL))

Drift is the launch library’s signal-triangulation cart. Acquiring antenna bearings satisfies OBSERVE; geometric triangulation satisfies ANALYZE; intercepting the time-limited transmission satisfies OBTAIN. Affinities are INFORMATION (the captured payload is intelligence) and AERIAL (the spectrum hunt operates over an antenna grid in atmospheric/RF airspace; addendum §2 lists Drift as an AERIAL signal-tracking subset). Per addendum Q2, Drift’s dead-drop subset implies PHYSICAL/MARITIME flavor — captured under flat :affinities for v1; revisit if compositions feel imprecise. Default biases.


DRIFT is not a navigation puzzle. It is a geometry-based real-time puzzle sport where the operator’s skill at reading electromagnetic space (bearing angles, signal strength, antenna positioning) under time pressure produces emergent tactical moments. The operator controls three antennas distributed across a grid. Each antenna’s relative position determines its received bearing to a hidden RF source. The operator’s task: acquire three independent bearings, triangulate the source location, and intercept a time-limited transmission.

The core insight: the game is about angles and distances, not about the signal itself. The signal is a pretext. The actual challenge is spatial geometry — the operator must internalize how antenna positioning changes bearing angle, must predict signal direction from bearing rate-of-change, and must solve triangulation geometry under deadline pressure.

This is why sound is the primary sense. A bearing is not visual information. A bearing is directional audio — Voice 1’s pitch (frequency) encodes signal direction and strength. The operator who learns to triangulate by ear alone (screen off, eyes closed) has achieved mastery. Audio-only triangulation is not a difficulty option. It is an emergent skill in a geometrically rigorous game.

The signal is time-limited (broadcasts on a schedule: 20-30 turns per transmission window). The operator must locate the source before the transmission ends. The threat is dual: counter-surveillance (detection by enemy networks) and signal loss (transmission ends before interception). The operator must cycle through OBSERVE-ORIENT-DECIDE-ACT faster than both clocks run.


The operator cycles through 8-12 second OODA sequences. Each cycle is a geometric problem: where is the source relative to my current antenna positions?

OBSERVE (1-2s): The operator listens. Voice 1 plays a sonar ping at a frequency proportional to the signal’s bearing angle relative to the antenna’s orientation.

  • Current antenna (let’s say Antenna A at position [3,5]): Voice 1 pings at 600Hz. The operator hears this as “signal is roughly east-southeast.”
  • Audio panning: YM2149 cannot directly do stereo, but Voice 1’s pitch and modulation encode bearing direction:
    • Voice 1 rising in pitch (200Hz → 800Hz) = signal bearing is rotating clockwise
    • Voice 1 steady at one pitch = signal bearing is static or slowly changing
    • Voice 1 with low-frequency flutter (~40Hz AM modulation) = signal is weak (distant)
    • Voice 1 with high-frequency shimmer = signal is strong (close)

The operator presses INFO (single tap) to get a one-line numeric bearing readout:

ANTENNA_A: BEARING 125° (SE) | SIGNAL STRENGTH: 72dB

This is expensive — pressing INFO draws attention (increments counter-surveillance threat). But it disambiguates the audio. An experienced operator stops using INFO and learns to judge bearing by ear alone.

The screen shows:

╔══════════════════════════════════════════════════════╗
║ DRIFT — SIGNAL HUNT TIME: 9:30 ║
╠══════════════════════════════════════════════════════╣
║ TRIANGULATION MODE: 1 OF 3 BEARINGS ACQUIRED ║
║ ║
║ ANTENNA POSITION │ BEARING │ SIGNAL STR │ STATUS ║
║ ─────────────────────────────────────────────────── ║
║ A: (3,5) │ 125° │ ████████░░│ LOCKED ║
║ B: (8,2) │ --- │ ░░░░░░░░░░│ CLEAR ║
║ C: (2,9) │ --- │ ░░░░░░░░░░│ CLEAR ║
║ ║
║ TRIANGULATION POINT: CALCULATING (2/3 bearings) ║
║ TIME TO TRANSMISSION END: 18 TURNS ║
║ COUNTER-SURVEILLANCE: LEVEL 2 (LIGHT AWARENESS) ║
║ ║
║ [INFO=bearing CONS=triangulate EVAL=intercept] ║
╚══════════════════════════════════════════════════════╝

ORIENT (1-2s): The operator interprets the bearing. They have acquired one bearing from Antenna A pointing southeast. The source is somewhere on that bearing line.

The operator decides: should I move another antenna to get a second bearing, or should I try to refine this first bearing? The decision frame is geometric:

  • With 1 bearing, the source lies on a line (infinite possibilities along that bearing angle).
  • With 2 bearings from different antenna positions, the source location narrows to 2 possible points (intersection of two bearing lines).
  • With 3 bearings from non-collinear antenna positions, the source location is uniquely determined (unless multipath ghosts exist at threat 5+).

An orient double-tap (press INFO twice) engages Cipher voice narration:

CIPHER: "One bearing acquired. Source is southeast of A.
Two more independent bearings will triangulate.
Counter-intelligence is aware. 18 turns remain."

The operator’s learned orientation: “I’m at 1 of 3. Antenna B is northeast, 8 cells away. Moving B southeast would give me a perpendicular bearing (high-quality geometry). That’s my next move.”

DECIDE (1-2s): The operator has three immediate options:

Option A — Move Another Antenna: Press numpad 8/2/4/6 to move antenna B to a new position (up/down/left/right cardinal directions). Each move uses 1 turn and re-evaluates signal strength at B’s new position. Moving closer improves signal strength; moving away degrades it.

Decision tension: moving B north (to get a better-angled bearing) might move it out of signal range (signal strength too weak to resolve bearing). The operator must balance geometry (antenna angle) with signal reception (strength threshold).

Option B — Lock Bearing: Press EVAL to lock the current antenna’s bearing as a “fixed bearing line” for triangulation calculation. This converts the continuous bearing into a discrete geometric constraint. Pressing EVAL again on a different antenna adds the second bearing line. A third EVAL locks triangulation.

Option C — Clear and Retry: Press NIL to discard all bearings and start over. This resets the counter-surveillance awareness clock (costs reputation but resets timer). Used when the operator realizes they’ve acquired two bad bearings (overlapping or nearly parallel lines = poor triangulation geometry).

ACT (1-2s): The operator commits. Suppose they press numpad 8 to move antenna B north.

Screen updates:

ANTENNA_B: (8,2) → (8,1) [1 TURN ELAPSED]

The antenna physically moves (diegetic movement on the grid; the game world knows where the antenna physically is). Voice 1 briefly drops (repositioning noise) then recovers at a new frequency (new bearing angle from B’s new position).

Counter-surveillance clock advances: awareness +1 (every antenna move is audible to the enemy).

Cycle repeats. The operator now hears Voice 1 from antenna B’s new position and decides: is this a good bearing angle to lock? Or move again?

The transmission window is finite (20-30 turns of signal availability). The operator must acquire three bearings, calculate triangulation, and move all antennas to the source location before the signal ends.

A fast operator (high OODA cycle rate) can afford to move antennas multiple times (exploratory repositioning, iterative refinement). A slow operator must make bearing decisions faster (lock on first attempt, even if not optimal geometry).

Counter-surveillance escalates with every move, keystroke, and INFO query. An operator who lingers too long refining bearings risks escalation into HUNTER-equivalent pursuit.

The pressure is temporal and geometric: time is running out, signal gets weaker as deadline approaches, counter-surveillance accelerates, and geometry constrains where antennas can be positioned for high-confidence triangulation.


The signal is an RF broadcast from a hidden source at an absolute grid position. The source’s location is deterministic (seeded at mission start; same seed = same location). The signal broadcasts on a schedule (not continuously; periodic pings with silence between them).

The signal is defined by:

  • Source location: A specific cell (x, y) on the grid, e.g., (9, 7). Hidden from the operator.

  • Transmission schedule: Pings every 3-4 turns, lasting 0.5 turns (brief pulses). Total window: 25-30 turns before transmission ends.

  • Signal strength (dB): Calculated as a function of distance from receiver antenna:

    signal_strength_dB = 100 - (distance_in_cells × 3.5)

    At 8 cells away: 100 - 28 = 72dB (strong). At 15 cells away: 100 - 52.5 = 47.5dB (weak, near threshold). At 20+ cells away: sub-threshold (undetectable).

  • Bearing angle: The RF direction vector from antenna to source, expressed as a compass bearing (0° = north, 90° = east, 180° = south, 270° = west). Calculated via atan2(source_y - antenna_y, source_x - antenna_x).

Antenna Positioning and Bearing Acquisition

Section titled “Antenna Positioning and Bearing Acquisition”

The operator controls three antennas (Antenna A, B, C). Each antenna:

  • Occupies a grid cell (absolute position known to the operator; they know where they placed it).
  • Receives RF when signal pings (if within ~20-cell range and line-of-sight is clear).
  • Resolves bearing when signal is strong enough (signal_strength_dB > 45dB threshold; at threat 5+, multipath reflections add +2dB uncertainty per bounce).
  • Reports signal strength (dB value) when operator presses INFO or EVAL.

When the operator presses EVAL while antenna A has a strong signal lock, antenna A’s bearing is fixed as a geometric constraint. The bearing line extends from antenna A at the bearing angle, infinitely in that direction.

With three antennas at positions A, B, C and three fixed bearing lines:

  • Bearing line A: From A in direction θ_A
  • Bearing line B: From B in direction θ_B
  • Bearing line C: From C in direction θ_C

The bearing lines are not rays; they are infinite lines (the signal could be in either direction along the bearing). The intersection of three lines produces a triangulation point: the location that best fits all three bearing angles.

Quality of triangulation depends on antenna geometry:

  • Ideal geometry: Three antennas forming an equilateral triangle around the source, bearing lines perpendicular to the sides. Triangulation error: ±0.5 cells.
  • Good geometry: Antennas forming an obtuse triangle, bearing lines at 60-120° angles. Triangulation error: ±1-2 cells.
  • Poor geometry: Antennas nearly collinear (in a line), bearing angles nearly parallel. Triangulation error: ±5-10 cells. (“Nearly” because the triangulation math still works, but the error bounds widen dramatically.)

The operator does not see the triangulation formula. They see a visual display (if in bitmap mode) showing bearing lines converging to a point, or they rely on audio feedback (Voice 2 resolving chord when triangulation locks).

At threat level 5 and above, the RF environment includes multipath reflections. The signal bounces off tall structures (buildings, mountains, water) and arrives at the antenna from multiple directions simultaneously. The operator hears:

  • Primary bearing: The direct line-of-sight (strongest, first arriving).
  • Ghost bearings: Reflections (weaker, delayed arrival, creating secondary peaks in Voice 1’s spectrum).

The operator must distinguish primary from ghost. This is an advanced skill. Experienced operators listen to Voice 1’s time-domain signature: the first peak (strongest, sharpest) is primary; later peaks are ghosts. A novice operator might lock onto a ghost and waste a bearing slot.

The mission board hints at this: a Threat 5 contract displays [MULTIPATH ENVIRONMENT] in the briefing.


3. SYSTEM TWO: THE TOOLKIT — ANTENNA CONTROL

Section titled “3. SYSTEM TWO: THE TOOLKIT — ANTENNA CONTROL”

The operator has direct control over three antennas. They are passive receivers (no transmission; they listen only). Antenna control is spatial problem-solving.

Each antenna starts at a predefined grid position (depends on mission template). The operator can move any antenna by pressing numpad 8/2/4/6 (up/down/left/right):

numpad 8 (north): current_y -= 1
numpad 2 (south): current_y += 1
numpad 4 (west): current_x -= 1
numpad 6 (east): current_x += 1

Multi-antenna selection:

  • Press CAR to enter “ANTENNA SELECT” mode. Current antenna cycles A → B → C → A. Status bar shows which antenna is active.
  • Press numpad 8/2/4/6 to move the active antenna.
  • Press BACK to exit “ANTENNA SELECT” mode.

Alternatively, press APPLY + numpad 1-3 to select antenna directly (Antenna A = 1, B = 2, C = 3). Then press numpad 8/2/4/6 to move.

Antenna movement costs:

  • 1 game turn per move (antenna takes time to reposition).
  • +1 counter-surveillance awareness (enemy hears the antenna being moved; RF equipment makes noise).
  • Brief signal loss (1 turn of silence from that antenna while repositioning).

Press EVAL while active antenna has signal lock to fix that antenna’s current bearing as a geometric constraint. The bearing line is locked; it does not change even if the antenna moves later.

Pressing EVAL multiple times:

  • 1st EVAL: Locks bearing line A. System locks bearing angle and stores it.
  • 2nd EVAL: Locks bearing line B. System stores second bearing angle; calculates all possible triangulation points (intersection of two lines yields two points, ambiguous).
  • 3rd EVAL: Locks bearing line C. System calculates triangulation point (intersection of three lines, should yield single point if geometry is good). Screen displays: TRIANGULATION LOCKED. TARGET: (9,7).

Once three bearings are locked, the operator enters MOVE TO TARGET mode. They must move all three antennas to converge at the triangulation point (or within 1-2 cells of it for signal confidence). Once all antennas are proximate to the target, they press CONS to initiate FINAL INTERCEPT, which attempts to receive the full signal transmission.

The operator can replace a locked bearing if they move an antenna and acquire a new, better bearing:

  • Press INFO (while antenna is at new position) to see new bearing.
  • Press EVAL again (on same antenna) to replace the old bearing with the new one.

This allows iterative refinement. The operator can improve geometry by repositioning an antenna and re-locking its bearing multiple times.

Cost: each re-lock increments counter-surveillance (enemy notices repeated RF activity from same location).

Press APPLY (held 1 second) to temporarily amplify antenna signal reception. This extends signal range by ~3 cells and reduces noise floor (weaker signals become detectable).

Effect: temporary boost to signal_strength_dB (+15dB for 1 turn). Useful if antenna is near signal threshold.

Cost: very noisy operation. +3 counter-surveillance awareness per amplification. At threat 4+, amplification may trigger immediate HUNTER dispatch.


4. SYSTEM THREE: THE THREAT — TIME AND COUNTER-SURVEILLANCE

Section titled “4. SYSTEM THREE: THE THREAT — TIME AND COUNTER-SURVEILLANCE”

Two independent clocks run simultaneously: the transmission window (signal time limit) and the counter-surveillance awareness level (enemy detection risk).

The signal broadcasts for a fixed duration (25-30 turns, seeded by mission threat level).

  • Turns 1-20: Signal strong, regular pings, operator has comfortable window.
  • Turns 21-25: Signal degrades (approaching transmission end). Pings become weaker (dB drops -3 per turn), farther apart (ping every 4-5 turns instead of 3).
  • Turn 26+: Signal gone. Transmission has ended. Operator has failed to intercept.

Failure mode: missed transmission window. If operator reaches triangulation point after turn 25 (or if signal strength drops below reception threshold before reaching point), the dead-drop is lost. Payout: 0 credits. Reputation: -2.

Every action the operator takes is audible to enemy networks. Awareness accumulates:

  • Antenna movement: +1 per move (enemy hears RF equipment relocation).
  • INFO query: +0 (quiet; taps into existing signal lock, no new transmission).
  • EVAL bearing lock: +1 per lock (enemy detects bearing acquisition event).
  • APPLY amplification: +3 (extremely noisy; amplifier is audible across wide area).
  • NIL clear: +2 (reset event is noticeable).

Awareness progression:

  • Awareness 0-10: Safe. Enemy surveillance is passive; no active pursuit.
  • Awareness 11-20: Light awareness. Enemy is paying attention; occasional false positives (Voice 3 plays warning tones). Operator may be questioned but not pursued.
  • Awareness 21-40: Active surveillance. Enemy has identified operator’s general location. Voice 3 develops a “stalking” component (dissonant beat, increasing tempo). Operator’s movements are tracked; enemy can predict next antenna position with 70% accuracy.
  • Awareness 41-60: Pursuit imminent. Cipher voice: “PERIMETER ALERT ISSUED. COUNTER-INTELLIGENCE TEAM MOBILIZING.” If operator continues, HUNTER-equivalent (mobile counter-intelligence team) will spawn at Awareness 50.
  • Awareness 61-80: HUNTER active. A counter-intelligence team has been dispatched to operator’s last known antenna position. Voice 1 develops a “chasing” tone (second harmonic rising, approaching from a fixed direction). HUNTER moves toward operator at fixed speed (4-5 cells per turn). If HUNTER reaches operator’s position, mission aborts.
  • Awareness 81-100: Lockdown. Counter-intelligence has surrounded operator’s general area. All antenna movement is blocked (press numpad 8/2/4/6 triggers immediate capture). Operator must go silent (press BACK to enter SILENT mode) or abort mission.

Awareness decays slowly when operator is silent:

  • Turns with no input: -1 awareness per turn (operator is “off the grid”).
  • Minimum decay time to full reset: 10-12 turns of complete silence.

But decay pauses if operator resumes activity. A single keystroke resets the decay counter.

HUNTER Equivalent: Mobile Counter-Intelligence Team

Section titled “HUNTER Equivalent: Mobile Counter-Intelligence Team”

At Awareness 50, a mobile threat spawns:

  • Initial position: Operator’s last antenna move location.
  • Movement: Advances at 4-5 cells per turn (faster than antenna movement, 1 cell per turn).
  • Detection: “Sees” operator if antenna is within 6 cells and has line-of-sight.
  • Engagement: If HUNTER reaches operator’s antenna position, mission aborts. Reputation: -3. Payout: 0.

Evasion tactics:

  • Move antenna away from HUNTER’s approach direction (diagonal movement gains distance).
  • Go silent (BACK key) and let awareness decay; HUNTER will gradually lose interest and return to base.
  • Use APPLY amplification to bait HUNTER away from current location (noise draws HUNTER to false position; very risky).

5. SYSTEM FOUR: SOUND — SONAR AS INFORMATION CHANNEL

Section titled “5. SYSTEM FOUR: SOUND — SONAR AS INFORMATION CHANNEL”

Voice 1 is the primary information source. It encodes:

  • Signal bearing (pitch = bearing angle)
  • Signal strength (amplitude = dB level)
  • Signal modulation (shimmer/flutter = noise/multipath)

Voice 2 encodes:

  • Triangulation confidence (dissonance when bearings are poorly angled; resolving chord when geometry is optimal)
  • Antenna repositioning acknowledgment (brief rising glissando when antenna moves)

Voice 3 encodes:

  • Counter-surveillance threat (dissonant beat increasing in tempo as awareness escalates)
  • Success/failure signals (major chord on successful intercept; harsh noise on failure)

When signal pings, Voice 1 plays a tone at a frequency proportional to the source bearing:

bearing 0° (north): frequency 200Hz
bearing 45° (NE): frequency 350Hz
bearing 90° (east): frequency 500Hz
bearing 135° (SE): frequency 650Hz
bearing 180° (south): frequency 800Hz
bearing 225° (SW): frequency 650Hz
bearing 270° (west): frequency 500Hz
bearing 315° (NW): frequency 350Hz

The frequency is not exact; it’s approximate (±50Hz). The operator learns to estimate bearing from audio pitch through repeated exposure.

Signal strength modulates the tone:

  • Strong signal (80+ dB): Clear, pure tone, stable pitch.
  • Medium signal (60-80 dB): Slightly fuzzy tone; subtle white-noise hum underneath.
  • Weak signal (45-60 dB): Heavily modulated; signal buried in noise; requires concentration.
  • Sub-threshold (< 45 dB): Inaudible; antenna out of range or signal too weak.

Multipath ghosts (Threat 5+): When signal reflects, operator hears:

  • Primary tone (first peak, clearest).
  • Secondary tone (reflection, 100-300ms delayed, lower amplitude).
  • Tertiary tone (further bounces, very faint).

An expert operator learns to filter the primary by its temporal arrival order; novices hear all three and get confused.

After three bearings are locked, Voice 2 plays a harmonic response based on triangulation quality:

  • Excellent geometry (error ±0.5 cells): Major triad (C-E-G), clean, confident.
  • Good geometry (error ±1-2 cells): Major triad with slight dissonance (one note slightly detuned).
  • Poor geometry (error ±5+ cells): Diminished chord; unresolved, tension-building.

The operator learns to interpret Voice 2’s harmony as a confidence metric: major = trust the triangulation; diminished = geometry is weak, reconsider antenna positions.

Additionally, when operator presses CONS to initiate final triangulation lock, Voice 2 rises into a resolving major chord (high confidence) or descends into dissonance (poor confidence).

As counter-surveillance awareness increases, Voice 3 develops a dissonant beat:

  • Awareness 0-20: Silent (baseline).
  • Awareness 21-40: Faint 1Hz beat, very slow, almost sub-audible.
  • Awareness 41-60: 2Hz beat, dissonant (tritone interval; unsettling).
  • Awareness 61-80: 3-4Hz beat, loud, driving, relentless.
  • Awareness 81-100: Chaotic noise, all three voices cacophony.

The operator feels counter-surveillance escalation as an increasing sense of dread. The beat tempo is a proxy for “time until HUNTER arrival.”


The game is fully playable with the screen off, using only audio. This is not an accessibility feature (though it serves that purpose). It is an advanced technique for speedrunners and flow-state practitioners.

Operator enables AUDIO-ONLY MODE (SYS menu → Display → Off). Screen goes dark. Audio continues.

The operator now has:

  • Voice 1: Signal bearing and strength (sonar ping).
  • Voice 2: Antenna movement confirmations and triangulation geometry feedback.
  • Voice 3: Counter-surveillance threat escalation.
  • Button feedback: Tones for every keypress (different tone per key, for orientation).

The challenge: Maintaining spatial awareness without visual reference. Operator must remember:

  • Where they positioned each antenna (spatial memory).
  • Which antenna is currently active.
  • What the last three bearings were.

Mastery criteria:

  • Complete a Threat 3 contract with screen off.
  • Achieve triangulation within ±1 cell (high precision).
  • All three bearings locked without INFO queries (no bearing refinement; pure audio judgement).

Why this matters: Audio-only navigation forces the operator to internalize the geometry. They are not reading a screen; they are solving spatial problems in their head. This is the same skill NEONGRID teaches (implicit spatial memory). DRIFT operators who master audio-only become better at all geometry-based modules.


DRIFT’s primary cell types and their handlers:

/* ===== SIGNAL_SOURCE_CELL ===== */
CELL_TYPE(signal_source) {
int16_t grid_x, grid_y; // Source location (hidden from player)
uint32_t transmission_window; // Turns until signal ends
uint8_t signal_strength_dB; // Current signal strength
uint16_t ping_interval_turns; // How often signal pings
uint8_t multipath_ghosts; // 0 (threat < 5), 1-3 (threat 5+)
ON_CAR { start_new_transmission(self); }
ON_CDR { skip_to_next_ping(self); }
ON_EVAL { broadcast_ping(self); update_all_antenna_bearings(); }
ON_DISPLAY {
// Hidden; never displayed to operator
nosh_text_puts(0, 0, "[CLASSIFIED]");
}
};
/* ===== ANTENNA_CELL ===== */
CELL_TYPE(antenna) {
int16_t antenna_id; // A, B, C (0, 1, 2)
int16_t grid_x, grid_y; // Current position
uint8_t signal_bearing; // Current bearing (0-359°)
uint8_t signal_strength_dB; // Received signal level
uint8_t bearing_locked; // Boolean: is bearing locked for triangulation?
uint8_t is_active; // Currently selected antenna?
ON_CAR { switch_to_next_antenna(); }
ON_CDR { switch_to_prev_antenna(); }
ON_EVAL { lock_bearing(self); }
ON_APPLY { amplify_reception(self); add_awareness(3); }
ON_INFO { display_bearing_numeric(self); }
ON_DISPLAY {
nosh_text_printf(0, 0, "ANTENNA %c: (%d,%d) %c",
'A' + antenna_id,
grid_x, grid_y,
(is_active ? '*' : ' '));
nosh_text_printf(0, 1, "BEARING: %d° | STR: %ddB | %s",
signal_bearing,
signal_strength_dB,
(bearing_locked ? "[LOCKED]" : "[CLEAR]"));
}
};
/* ===== TRIANGULATION_CELL ===== */
CELL_TYPE(triangulation) {
uint8_t bearings_locked; // 0-3 (how many bearings fixed?)
int16_t bearing_line_angles[3]; // Three bearing angles (if locked)
int16_t triangulation_x, triangulation_y; // Calculated target location
uint8_t triangulation_confidence; // 0-100 (based on geometry quality)
ON_CONS { lock_bearing_line(self); update_triangulation(); }
ON_EVAL { initiate_move_to_target(self); }
ON_DISPLAY {
nosh_text_printf(0, 0, "TRIANGULATION: %d/3 BEARINGS",
self->bearings_locked);
if (self->bearings_locked == 3) {
nosh_text_printf(0, 1, "TARGET: (%d,%d) [CONF: %d%%]",
triangulation_x, triangulation_y,
triangulation_confidence);
}
}
};
/* ===== SURVEILLANCE_THREAT_CELL ===== */
CELL_TYPE(surveillance_threat) {
uint8_t awareness_level; // 0-100 cumulative awareness
uint8_t hunter_spawned; // Boolean: is HUNTER active?
int16_t hunter_x, hunter_y; // HUNTER position
uint8_t hunter_turn_counter; // Turns until HUNTER moves again
uint8_t threat_level_ui; // Display: SAFE / CAUTION / ALERT / DANGER
ON_EVERY_TURN {
update_awareness_from_recent_actions();
if (awareness_level >= 50 && !hunter_spawned) {
spawn_hunter_at_last_antenna_position();
hunter_spawned = 1;
}
move_hunter_if_active();
}
ON_DISPLAY {
nosh_text_printf(0, 0, "AWARENESS: %d/100", awareness_level);
nosh_text_printf(0, 1, "THREAT: %s", threat_level_strings[threat_level_ui]);
if (hunter_spawned) {
nosh_text_printf(0, 2, "HUNTER AT (%d,%d)", hunter_x, hunter_y);
}
}
};
/* ===== FIELD_CELL (Overall Mission State) ===== */
CELL_TYPE(field) {
uint32_t mission_time_turns; // Elapsed turns
uint32_t time_to_transmission_end;// Countdown
uint8_t mission_status; // ACTIVE, TRIANGULATED, INTERCEPTING, SUCCESS, FAILURE
uint8_t is_audio_only_mode; // Boolean: screen off mode?
ON_EVERY_FRAME {
if (mission_status == ACTIVE) {
decrement_transmission_window();
broadcast_ping_if_due();
update_all_cell_displays();
psg_update_voice_frequencies();
}
}
};

Antenna movement (numpad 8/2/4/6):

void antenna_move_north(CellBase *antenna_cell) {
antenna->grid_y -= 1;
add_awareness(1); // Enemy hears movement
announce_move_via_voice2_glissando();
update_bearing_from_signal_source();
// If antenna was already moved, bearing resets
antenna->bearing_locked = 0;
}

Bearing lock (EVAL):

void antenna_lock_bearing(CellBase *antenna_cell) {
triangulation->bearing_line_angles[triangulation->bearings_locked] = antenna->signal_bearing;
triangulation->bearings_locked++;
add_awareness(1);
if (triangulation->bearings_locked == 1) {
play_voice2_rising_glissando(); // First bearing
} else if (triangulation->bearings_locked == 2) {
play_voice2_major_triad(); // Two bearings, geometry ambiguous
} else if (triangulation->bearings_locked == 3) {
calculate_triangulation_point();
if (triangulation_confidence > 70) {
play_voice2_major_chord(); // Good geometry
} else {
play_voice2_diminished_chord(); // Poor geometry
}
}
}

NUMPAD (Antenna Movement)
8 = Move active antenna NORTH
2 = Move active antenna SOUTH
4 = Move active antenna WEST
6 = Move active antenna EAST
LEFT HAND FUNCTION KEYS
CAR = Select next antenna (cycle A → B → C)
CDR = Select prev antenna (cycle C → B → A)
CONS = Lock bearing line (convert current bearing to triangulation constraint)
EVAL = Confirm action (varies by context: move to target, initiate intercept)
APPLY = Amplify antenna reception (+15dB, +3 awareness cost)
BACK = Enter SILENT mode (pause RF activity, let awareness decay)
NIL = Clear all bearings, reset (costs +2 awareness, allows fresh start)
QUOTE = Bookmark current triangulation point (for comparison)
INFO = Display numeric bearing for current antenna (costs +0 awareness, quiet query)
RIGHT-HAND NUMPAD (Quick Antenna Select)
1 = Select Antenna A
2 = Select Antenna B
3 = Select Antenna C
(EQ key not used in DRIFT)
(LAMBDA macro recording available but not essential)

9. HOT SWAP INTEGRATION — SIGNAL HUNT CAMPAIGN

Section titled “9. HOT SWAP INTEGRATION — SIGNAL HUNT CAMPAIGN”

DRIFT is Phase 1 of a three-module campaign: SIGNAL HUNT.

Phase 1: DRIFT — Locate the hidden RF source (triangulation)
↓ operator acquires signal dead-drop coordinates
↓ firmware displays: INSERT MODULE: SHELLFIRE
↓ operator physically swaps DRIFT for SHELLFIRE
Phase 2: SHELLFIRE — Intercept and decode the transmission (frequency management)
↓ operator extracts encrypted message
↓ firmware displays: INSERT MODULE: ICE BREAKER
↓ operator physically swaps SHELLFIRE for ICE BREAKER
Phase 3: ICE BREAKER — Crack the encryption, extract the payload (network intrusion)
↓ operator gains intelligence, mission complete
↓ payout: sum of all three phases + cross-phase bonuses

Each phase is a complete playable cartridge experience. But when chained via Hot Swap:

  • Phase 1 (DRIFT): Operator learns antenna geometry and triangulation. Reputation: +3. Credits: +800 base.
  • Phase 2 (SHELLFIRE): Operator manages frequency bands and counter-jamming. Extraction window opens only if DRIFT was completed (dead-drop coordinates transferred via phase chain). Reputation: +2. Credits: +600 base.
  • Phase 3 (ICE BREAKER): Operator intrudes into a network where encryption keys are stored. The keys directly unlock the SHELLFIRE payload extracted in Phase 2. Reputation: +4. Credits: +1000 base.

Cross-phase bonuses:

  • If all three phases completed in single session: +500 credits (efficiency bonus).
  • If triangulation error was < 1 cell (high precision in DRIFT): +10% bonus to SHELLFIRE extraction time.
  • If SHELLFIRE extraction was >80% complete: +10% bonus to ICE BREAKER penetration difficulty (network is less defended, assuming sysop is distracted by the in-progress signal interception).

Hot Swap tension: The operator must decide mid-mission: do I stay in current capability domain and brute-force forward, or do I Hot Swap to gain a new capability? In DRIFT specifically, if counter-surveillance becomes critical and HUNTER is approaching, the operator might choose to abort DRIFT early (partial payout) and initiate a Black Ledger swap to forge counter-intelligence documents (not available as Phase 2 in SIGNAL HUNT, but available in other mission types where Black Ledger is the next cartridge).


Description: Locate a hidden RF transmission broadcast from an unknown location. The signal broadcasts on a fixed schedule (20-30 turns). Triangulate before transmission ends.

Threat levels: 1-4 (multipath ghosts appear at threat 5, making triangulation ambiguous).

Difficulty formula:

turns_available = 30 - (threat_level × 2) // Threat 1: 28 turns, Threat 4: 22 turns
antenna_starting_distance_from_source = 8 + (threat_level × 3) // T1: 11 cells, T4: 20 cells

Payout:

base_payout = 800 + (threat_level × 300) // T1: 1100¤, T4: 2000¤
accuracy_bonus = 100 if triangulation_error < 1 cell
speed_bonus = 200 if completed in < 10 turns
multipath_penalty = -100 if threat 5 (due to ambiguity)
reputation_gain = 2 + threat_level

Example: Threat 2 “Corporate Call Interception”

  • Signal broadcasts from cell (14, 8).
  • Antennas start at A(4, 5), B(18, 3), C(3, 12).
  • 26 turns to transmission end.
  • Counter-surveillance baseline (civilian corporate security, not military).
  • Payout: 1400¤ + bonuses.

Template 2: MOVING TARGET (Single-Phase, Higher Difficulty)

Section titled “Template 2: MOVING TARGET (Single-Phase, Higher Difficulty)”

Description: The signal source is not stationary. It moves along a predefined path (4-6 waypoints, cyclic). Operator must predict the movement and position antennas to intercept at the source’s next waypoint.

Difficulty: Threat 3-5 only. Moving target is a learned skill.

Movement mechanic:

source_waypoints = [(10,5), (10,15), (20,15), (20,5)] // Rectangular patrol
turns_per_segment = 8 // Source takes 8 turns to traverse each segment
total_cycle = 32 turns

The operator observes signal bearings from antenna positions and infers the source is moving. Bearings change in a consistent pattern (rotating, not random). The operator must:

  1. Acquire multiple bearing samples over time (not 3 simultaneous bearings, but 6-8 bearings over 10-12 turns).
  2. Fit those bearings to a trajectory (source is moving along a line).
  3. Predict where the source will be 5-10 turns in the future.
  4. Position antennas at the predicted future location.

Tension: Operator must decide: do I lock three bearings quickly (fast, but static—assumes source is stationary)? Or do I observe more bearings over time (slower, but reveals motion)?

Payout:

base_payout = 1200 + (threat_level × 400) // T3: 2400¤, T5: 4000¤
prediction_accuracy_bonus = 300 if interception within 1 cell of predicted path
reputation_gain = 4 + threat_level

Template 3: MULTIPATH RESOLVE (Threat 5 Only, Advanced)

Section titled “Template 3: MULTIPATH RESOLVE (Threat 5 Only, Advanced)”

Description: Signal environment is flooded with multipath reflections. Operator receives 3-5 bearing signals simultaneously (primary + ghosts). They must identify which bearing is primary and which are reflections.

The challenge: Voice 1 plays multiple tones overlapping. The operator must use temporal discrimination: the primary always arrives first (shortest path, direct line-of-sight). Reflections arrive 100-300ms later (longer propagation path).

Discrimination technique:

  • Press INFO to get numeric bearings for all detected signals (e.g., “Primary: 125°, Ghost A: 145°, Ghost B: 110°”).
  • Expert operators listen to Voice 1 and ignore the delayed ghosts by ear (audio-only technique).

Payout:

base_payout = 2000¤
ghost_filter_accuracy_bonus = 400¤ if correctly identified 3+ ghosts
reputation_gain = 5

Template 4: DEEP SIGNAL (Threat 4-5, Maximum Difficulty)

Section titled “Template 4: DEEP SIGNAL (Threat 4-5, Maximum Difficulty)”

Description: Signal originates from great distance (18-25 cells). Signal strength is near threshold (critical). Counter-surveillance baseline is high (military installation; awareness escalates faster).

Operator must:

  1. Carefully position antennas to maintain signal locks over long distance (any movement that moves antenna farther from source risks lock loss).
  2. Use APPLY amplification sparingly (it’s necessary to reach signal, but extremely noisy—HUNTER spawns at Awareness 40 instead of 50).
  3. Solve triangulation under strict time and awareness constraints.

Threat scaling:

antenna_starting_distance = 22 + threat_level // T4: 26 cells, T5: 27 cells
turns_available = 20 // Very short window
awareness_escalation_rate = ×1.5 // Actions cost more awareness
hunter_spawn_threshold = 40 // Earlier than normal

Payout:

base_payout = 1500 + (threat_level × 600) // T4: 3900¤, T5: 4500¤
distance_completion_bonus = 500¤ if source >20 cells away
reputation_gain = 5 + threat_level

All screens fit 80 columns × 25 rows. Row 0 = status bar. Rows 1-23 = content. Row 24 = action bar.

Screen 1: Mission Board / Contract Selection

Section titled “Screen 1: Mission Board / Contract Selection”
ROW 0: DRIFT > SIGNAL HUNT CONTRACTS [REP 8] [CREDITS: 1420] [PROFICIENCY: 35]
ROW 1:
ROW 2: AVAILABLE CONTRACTS:
ROW 3:
ROW 4: [>] CORPORATE CALL INTERCEPTION — THREAT 2
ROW 5: Locate hidden RF source broadcasting corporate financial call.
ROW 6: Payout: 1400 ¤ | Reputation: +3 | Window: 26 turns | Difficulty: ██░░
ROW 7:
ROW 8: [ ] DISTRESS BEACON RESCUE — THREAT 3
ROW 9: Triangulate emergency beacon from downed aircraft. Time-critical.
ROW 10: Payout: 1800 ¤ | Reputation: +4 | Window: 22 turns | Difficulty: ███░
ROW 11:
ROW 12: [ ] PIRATE FREQUENCY SWEEP — THREAT 3
ROW 13: Locate pirate radio broadcast; signal moving target (patrol route).
ROW 14: Payout: 2400 ¤ | Reputation: +5 | Window: 20 turns | Difficulty: ███░
ROW 15:
ROW 16: [ ] MILITARY INSTALLATION PROBE — THREAT 5
ROW 17: Deep signal from fortified compound. Multipath environment.
ROW 18: Payout: 4500 ¤ | Reputation: +8 | Window: 18 turns | Difficulty: ████
ROW 19: Status: LOCKED (Proficiency 60+ required; you have 35)
ROW 20:
ROW 21: MISSION HISTORY: 3 contracts completed | Best time: 8:45 | Streak: 2 wins
ROW 22:
ROW 23: [CAR=details] [CDR=next] [EVAL=accept] [INFO=briefing] [BACK=menu]
ROW 0: DRIFT > SIGNAL HUNT BRIEFING [REP 8] [CREDITS: 1420] [WINDOW: 26 TURNS]
ROW 1:
ROW 2: CORPORATE CALL INTERCEPTION
ROW 3: ────────────────────────────────────────────────────────────────────────
ROW 4:
ROW 5: CIPHER VOICE: Hidden RF transmission detected. Source location unknown.
ROW 6: Corporate communications network suspected. Intercept before transmission
ROW 7: window closes (26 turns). Triangulate using three independent antenna
ROW 8: bearings. Counter-surveillance escalates with antenna movement.
ROW 9:
ROW 10: THREAT LEVEL: 2/5 (Corporate security, civilian counter-intel)
ROW 11: PAYOUT: 1400 ¤ (base) + speed bonus + accuracy bonus
ROW 12: REPUTATION: +3 (for mission completion)
ROW 13:
ROW 14: ANTENNA STARTING POSITIONS:
ROW 15: A: (3, 5) - Northwest sector
ROW 16: B: (8, 2) - Northeast sector
ROW 17: C: (2, 9) - Southwest sector (farthest from expected source)
ROW 18:
ROW 19: EXPECTED SIGNAL CHARACTERISTICS:
ROW 20: Source Distance: 11-14 cells from nearest antenna
ROW 21: Transmission Window: 26 turns (approx 2 min of signal)
ROW 22: Signal Strength: Moderate (should lock at antenna range 8-10 cells)
ROW 23: [CAR=begin] [INFO=strategy_hint] [BACK=board]

Screen 3: Active Mission — Triangulation Display

Section titled “Screen 3: Active Mission — Triangulation Display”
ROW 0: DRIFT > SIGNAL HUNT [TIME: 9:30 / 26:00 TURNS] [AWARENESS: 4/100]
ROW 1:
ROW 2: TRIANGULATION MODE: 1 OF 3 BEARINGS ACQUIRED
ROW 3: ────────────────────────────────────────────────────────────────────────
ROW 4: ANTENNA │ POSITION │ BEARING │ SIGNAL STR │ LOCKED │ STATUS
ROW 5: ────────┼──────────┼─────────┼────────────┼────────┼──────────────────
ROW 6: A │ (3,5) │ 125° │ ███████░░░ │ ✓ │ LOCKED
ROW 7: B │ (8,2) │ --- │ ░░░░░░░░░░ │ ○ │ OUT OF RANGE
ROW 8: C │ (2,9) │ --- │ ░░░░░░░░░░ │ ○ │ SIGNAL WEAK
ROW 9:
ROW 10: TRIANGULATION POINT: CALCULATING (1/3 bearings — need 2 more)
ROW 11: CONFIDENCE: LOW (insufficient data for position fix)
ROW 12: ESTIMATED ERROR: ±8 cells (will improve with 2nd bearing)
ROW 13:
ROW 14: COUNTER-SURVEILLANCE AWARENESS:
ROW 15: Level: 4/100 ████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
ROW 16: Threat: SAFE (light civilian awareness)
ROW 17:
ROW 18: TRANSMISSION WINDOW: 16 turns remaining (time is adequate)
ROW 19: STATUS: Reposition Antenna B to acquire second bearing (northeast movement)
ROW 20:
ROW 21:
ROW 22: [8/2/4/6=move] [CAR=select_antenna] [CONS=lock_bearing] [INFO=sonar]

Screen 4: Sonar Detail View (INFO Overlay)

Section titled “Screen 4: Sonar Detail View (INFO Overlay)”
ROW 0: DRIFT > SIGNAL HUNT / SONAR DETAIL [TIME: 9:30] [ANTENNA A LOCKED]
ROW 1:
ROW 2: ANTENNA A DETAILED TELEMETRY:
ROW 3: ────────────────────────────────────────────────────────────────────────
ROW 4:
ROW 5: Position: (3, 5)
ROW 6: Signal Bearing: 125° (ESE — East-Southeast)
ROW 7: Signal Strength: 72 dB (STRONG, within optimal range)
ROW 8: Bearing Lock: ENGAGED (locked at 125°)
ROW 9:
ROW 10: INTERPRETATION:
ROW 11: Signal source is located somewhere southeast of antenna A.
ROW 12: Distance estimate: 8-10 cells (based on signal strength 72dB).
ROW 13: Source is roughly at grid position range (11-13, 13-15).
ROW 14:
ROW 15: RECOMMENDATION:
ROY 16: Move antenna B (currently at 8,2) to acquire independent bearing.
ROW 17: Target: Position B to the northeast to get perpendicular angle.
ROW 18: Good geometry = accurate triangulation. Aim for 60-120° angle separation.
ROW 19:
ROW 20: VOICE 1 (Signal Sonar):
ROW 21: Tone: Steady 600 Hz (ESE bearing); no shimmer or flutter detected.
ROW 22: Interpretation: Clean direct signal, no reflections (low threat, good SNR).
ROW 23: [EVAL=dismiss] [CDR=next_antenna] [INFO=bearing_math]
ROW 0: DRIFT > SIGNAL HUNT [TIME: 18:40 / 26:00] [TARGET LOCKED] [AWARENESS: 18]
ROW 1:
ROW 2: MOVING TO TARGET LOCATION
ROW 3: ────────────────────────────────────────────────────────────────────────
ROW 4:
ROW 5: TARGET POSITION: (9, 7)
ROW 6: TRIANGULATION CONFIDENCE: 87% (good geometry, low error)
ROW 7: TRIANGULATION ERROR ESTIMATE: ±1.5 cells
ROW 8:
ROW 9: ANTENNA CONVERGENCE STATUS:
ROW 10: ────────────────────────────────────────────────────────────────────────
ROW 11: Antenna A: (3,5) → (9,7) Distance 8 cells [████░░░░░░] 50% complete
ROW 12: Antenna B: (8,2) → (9,7) Distance 6 cells [██████░░░░] 66% complete
ROW 13: Antenna C: (2,9) → (9,7) Distance 8 cells [████░░░░░░] 50% complete
ROW 14:
ROW 15: CONVERGENCE ETA: 4-5 turns (all antennas collocated at target)
ROW 16: TIME REMAINING: 7-8 turns (signal window closing)
ROW 17: TIMING: ON SCHEDULE for final intercept phase
ROW 18:
ROW 19: COUNTER-SURVEILLANCE:
ROW 20: Awareness Level: 18/100 ██████░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
ROW 21: Threat: LIGHT AWARENESS (no active pursuit yet)
ROW 22:
ROW 23: [8/2/4/6=continue_moving] [INFO=eta_detail] [EVAL=intercept_ready]
ROW 0: DRIFT > SIGNAL INTERCEPT SUCCESS [MISSION COMPLETE]
ROW 1:
ROW 2: ╔════════════════════════════════════════════════════════════════╗
ROW 3: ║ TRANSMISSION INTERCEPTED ║
ROW 4: ╚════════════════════════════════════════════════════════════════╝
ROW 5:
ROW 6: Target Location: (9, 7) — CONFIRMED
ROW 7: All Antennas Converged: YES (A, B, C all within 2 cells)
ROW 8: Signal Locked: YES (full transmission received)
ROW 9: Transmission Window: 18 turns (5 turns remaining before cutoff)
ROW 10:
ROW 11: TRIANGULATION ACCURACY:
ROW 12: Calculated Position: (9, 7)
ROW 13: Actual Source Position: (8.8, 6.9)
ROW 14: Error: 0.3 cells (EXCELLENT — within ±0.5 tolerance)
ROW 15:
ROW 16: SCORING BREAKDOWN:
ROW 17: Base Payout: 1400 ¤
ROW 18: Speed Bonus (+18%): +252 ¤ (5 turns remaining out of 26)
ROW 19: Accuracy Bonus (+100%): +1400 ¤ (error < 0.5 cells = perfect)
ROW 20: Awareness Penalty (0%): -0 ¤ (light awareness, no escalation)
ROW 21: TOTAL EARNED: 3052 ¤ | REPUTATION: +3
ROW 22:
ROW 23: [EVAL=complete] [INFO=detailed_stats] [BACK=board]

Screen 7: Mission Failed / Transmission Window Closed

Section titled “Screen 7: Mission Failed / Transmission Window Closed”
ROW 0: DRIFT > SIGNAL HUNT [MISSION FAILED]
ROW 1:
ROW 2: ╔════════════════════════════════════════════════════════════════╗
ROW 3: ║ TRANSMISSION WINDOW CLOSED ║
ROW 4: ╚════════════════════════════════════════════════════════════════╝
ROW 5:
ROW 6: Mission Status: FAILED
ROW 7: Time Remaining: 0:00 / 26:00 turns (transmission ended)
ROW 8: Triangulation Bearings: 2/3 acquired (insufficient for lock)
ROW 9: Last Known Signal Strength: 15 dB (very weak, near loss)
ROW 10:
ROW 11: FAILURE ANALYSIS:
ROW 12: You acquired two bearing locks (A and B) but did not complete
ROW 13: triangulation before the transmission window closed. A third bearing
ROW 14: was needed for a definitive position fix, but signal faded at turn 26.
ROW 15:
ROW 16: WHAT WENT WRONG:
ROW 17: • Excessive hesitation after first bearing (used 4 turns for decision)
ROW 18: • Antenna B repositioning took longer than expected (slow moves)
ROW 19: • Counter-surveillance awareness escalated too quickly (+18 levels)
ROW 20:
ROW 21: PENALTY: Reputation -2 | No credits earned
ROW 22: Retry available immediately. Learn from timing and antenna placement.
ROW 23: [EVAL=retry] [INFO=analysis] [BACK=board]
ROW 0: DRIFT > ALERT! [TIME: 20:15] [HUNTER 6 CELLS AWAY] [AWARENESS: 47]
ROW 1:
ROW 2: ⚠ ⚠ ⚠ COUNTER-INTELLIGENCE TEAM MOBILIZING ⚠ ⚠ ⚠
ROW 3:
ROW 4: THREAT ESCALATION: Active Pursuit Imminent
ROW 5: ────────────────────────────────────────────────────────────────────────
ROW 6:
ROW 7: Hunter Team Position: (12, 8)
ROW 8: Your Antenna Cluster Position: (6, 7)
ROW 9: Distance: 6 cells (approaching at 4-5 cells per turn)
ROW 10:
ROW 11: THREAT ASSESSMENT:
ROW 12: Awareness Level: 47/100 (active pursuit threshold: 50)
ROW 13: Hunter ETA: 2 turns until they reach your position
ROW 14: Detection Method: RF equipment repositioning detected
ROW 15:
ROW 16: EVASION OPTIONS:
ROW 17: [1] MOVE ANTENNAS AGGRESSIVELY (southeast, away from Hunter)
ROW 18: Cost: +1 awareness per move (dangerous)
ROW 19: [2] GO SILENT (BACK key, stop all movement for 5+ turns)
ROW 20: Cost: Awareness decays slow, but gives Hunter time to close
ROW 21: [3] RUSH INTERCEPT (attempt mission immediately)
ROW 22: Risk: May fail if triangulation incomplete
ROW 23: [numpad=move] [CAR=select_strategy] [BACK=silent_mode] [EVAL=intercept]

Screen 4: Bitmap Mode — Bearing Visualization

Section titled “Screen 4: Bitmap Mode — Bearing Visualization”
In BITMAP mode (960×600, per ADR-0014), the game renders a grid map with:
- Grid cells (dots or faint grid lines)
- Antenna positions (A, B, C symbols in bright amber)
- Signal source location (hidden until triangulated, then marked as ◆)
- Bearing lines (extending from each antenna at the locked bearing angle, bright lines toward target)
- Triangulation point (convergence of three bearing lines, marked as X)
Example (text approximation):
Grid 16×10
A (3,5) → bearing 125° (line extending southeast)
B (8,2) → bearing 95° (line extending slightly south of due east)
C (2,9) → bearing 140° (line extending south-southeast)
All three lines converge at approximately (9, 7).
Visual confidence: lines converge to sharp point (excellent geometry).
This visualization is optional but highly recommended for better operator understanding.
The numeric display (Screen 2) is sufficient for gameplay; bitmap adds polish.

Screen 5: Audio-Only Mode (Screen Disabled)

Section titled “Screen 5: Audio-Only Mode (Screen Disabled)”
When operator enables AUDIO-ONLY MODE:
- Display goes black/dim
- All information from AUDIO only
- Operator must maintain mental model of:
* Current antenna positions
* Acquired bearings (numeric values from last INFO queries)
* Awareness level (inferred from Voice 3 beat tempo)
* Time remaining (inferred from signal ping frequency degradation)
Auditory cues:
- Voice 1 ping: frequency = bearing, amplitude = signal strength
- Voice 2: antenna move confirmations, triangulation quality feedback
- Voice 3: awareness escalation (beat tempo)
- Button feedback tones: different tone per key (8=rising tone, 2=descending, 4=left panning, 6=right panning)
This mode is very difficult and requires 3-5 practice runs to master.
It is the advanced skill demonstration for experienced DRIFT operators.

12. SESSION WALKTHROUGH: “THE FIX” — A COMPLETE TRIANGULATION

Section titled “12. SESSION WALKTHROUGH: “THE FIX” — A COMPLETE TRIANGULATION”

Scenario: Threat 2 “Corporate Call Interception” (26-turn window, civilian awareness baseline).

Operator is skilled (Rep 12, has completed 5 DRIFT contracts).

MINUTE 0:00 — BOOT & BRIEFING
Device boots. DRIFT cartridge initializes.
Cipher voice: "DRIFT online. Three antennas standing by.
Corporate RF transmission detected. Broadcast window: 26 turns.
Source location unknown. Triangulate and intercept."
Screen shows mission briefing: "INTERCEPT ENCRYPTED CORPORATE CALL"
Operator presses EVAL to accept mission.
MINUTE 0:45 — ANTENNA INITIALIZATION
Three antennas initialized at starting positions:
Antenna A: (3, 5)
Antenna B: (8, 2)
Antenna C: (2, 9)
Signal source (unknown to operator): (14, 8)
Voice 1 baseline at 200Hz (signal not yet detected; antennas too far).
Operator presses INFO: "NO SIGNAL — OUT OF RANGE"
Operator decision: Need to move antennas to get signal lock.
Antenna A is closest (~11 cells from source). Move A toward estimated signal location.
MINUTE 1:15 — ANTENNA A REPOSITIONING
Operator selects Antenna A (CAR key if not already active).
Operator presses numpad 6 (move east) three times.
Antenna A moves (3,5) → (4,5) → (5,5) → (6,5)
Three turns elapsed. Three key presses = +3 awareness.
Counter-surveillance: LEVEL 3/100 (light awareness from equipment noise).
After third move, Voice 1 audibly rises (signal approaching detectable threshold).
Operator presses INFO: "ANTENNA_A: BEARING 95° | STR: 48dB"
Signal detected! Just above threshold (~45dB).
Awareness: +0 (INFO is quiet).
Time elapsed: 4 turns. Time remaining: 22 turns.
MINUTE 1:50 — FIRST BEARING ACQUIRED
Antenna A is now receiving signal strongly. Operator positions A optimally.
Last few moves:
Antenna A: (6,5) → (8,5) → (9,5) [two more east moves]
Voice 1 stabilizes at ~620Hz (bearing steadily east-northeast).
Operator presses INFO: "ANTENNA_A: BEARING 70° | STR: 72dB"
Strong signal. Confidence high.
Operator presses EVAL to lock Antenna A's bearing.
Bearing locked: A at (9,5), bearing 70° (east-northeast).
Screen updates: "1 OF 3 BEARINGS ACQUIRED"
Voice 2 plays rising glissando (first bearing locked).
Awareness: +1 (bearing lock is noticeable). LEVEL 5/100.
Time elapsed: 7 turns. Time remaining: 19 turns.
MINUTE 2:30 — SECOND ANTENNA POSITIONING
Operator decides: next antenna should be perpendicular to A's bearing line
for good geometry. Antenna B at (8,2) is south of A's position.
Operator selects Antenna B.
Operator presses numpad 2 (south) and numpad 6 (east) to move B southeast.
Moves: (8,2) → (8,3) → (9,3) → (10,3) [3 moves]
Time elapsed: 3 turns. Awareness: +3. Level 8/100.
Voice 1 begins audible from B's perspective (bearing changing; B is at different angle).
Operator presses INFO: "ANTENNA_B: BEARING 40° | STR: 68dB"
Strong signal from B. Bearing 40° (east-northeast, but more northerly than A).
This is good geometry: A's bearing (70°) + B's bearing (40°) = two lines at ~30° intersection angle.
MINUTE 3:00 — SECOND BEARING LOCKED
Operator presses EVAL to lock B's bearing.
Screen updates: "2 OF 3 BEARINGS ACQUIRED"
Voice 2 plays major triad (two bearings, triangulation geometry emerging).
Minor dissonance in the triad indicates geometry is still ambiguous (two lines intersect at two points).
Awareness: +1. Level 9/100.
Time elapsed: 10 turns. Time remaining: 16 turns.
Screen shows: "TRIANGULATION POINT: TWO POSSIBILITIES (AMBIGUOUS)"
MINUTE 3:35 — THIRD ANTENNA POSITIONING
Operator selects Antenna C at (2,9) (northwest corner).
Need third bearing from a different angle to disambiguate and pin down target.
Operator moves C northeast: (2,9) → (3,9) → (4,9) → (5,9) → (6,9) → (7,9) [6 moves east]
Time elapsed: 6 turns. Awareness: +6. Level 15/100.
Voice 1 from C now audible (northwest perspective giving different bearing angle).
Operator presses INFO: "ANTENNA_C: BEARING 110° | STR: 74dB"
Bearing 110° (east-southeast). Strong signal.
MINUTE 4:10 — THIRD BEARING LOCKED
Operator presses EVAL to lock C's bearing.
Screen updates: "3 OF 3 BEARINGS ACQUIRED"
All three bearing lines converge at approximately (14, 8).
Voice 2 plays resolving major chord (excellent triangulation confidence: 91%).
Awareness: +1. Level 16/100.
Time elapsed: 17 turns. Time remaining: 9 turns.
Screen shows: "TRIANGULATION LOCKED: TARGET (14, 8) | CONFIDENCE: 91%"
MINUTE 4:45 — MOVE TO TARGET PHASE
Operator enters "MOVE TO TARGET" phase automatically.
Mission shifts from triangulation to convergence.
All three antennas must reach vicinity of (14, 8) before transmission ends (9 turns).
Current antenna positions:
A: (9, 5) → distance to (14,8): 8 cells (5 cells right, 3 cells down)
B: (10, 3) → distance to (14,8): 7 cells (4 cells right, 5 cells down)
C: (7, 9) → distance to (14,8): 8 cells (7 cells right, 1 cell up)
Operator needs 3-4 turns to get all antennas to target (optimized movement).
They have 9 turns. Comfortable margin.
Operator selects A, presses 6/6/6/2/2/2 (southeast movement).
Antenna A: (9,5) → (10,5) → (11,5) → (12,5) → (12,6) → (12,7) → (12,8)
6 moves, 6 turns elapsed. Awareness: +6. Level 22/100.
MINUTE 5:30 — ALL ANTENNAS CONVERGED
After moving all three antennas:
A: (14, 8) [at target]
B: (14, 8) [at target]
C: (13, 8) [1 cell away, acceptable]
Time elapsed: ~22 turns. Time remaining: 4 turns. [TIGHT!]
Operator presses EVAL to initiate FINAL INTERCEPT.
All three antennas align on target location. Signal is strongest yet.
Voice 1 rises to peak (signal maximum amplitude).
Operator presses EVAL again to confirm intercept.
MINUTE 6:00 — SIGNAL INTERCEPTED
All three voices play a MAJOR CHORD (success signal).
Screen displays: "SIGNAL INTERCEPT SUCCESSFUL. DATA ACQUIRED."
Mission complete. Signal transmission captured.
Full encrypted corporate call is now in operator's possession (to be decrypted in Phase 2: SHELLFIRE).
**Total time: 120 seconds (6 minutes real time, 22 turns game time).**
**Time margin: 4 turns (enough for error recovery if triangulation was slightly off).**
Reputation gain: +3
Base payout: 1400 ¤
Accuracy bonus: +100 ¤ (triangulation error was 0 cells; perfect)
Time bonus: +200 ¤ (completed with 4 turns remaining)
**Total payout: 1700 ¤**
Operator's reputation: 12 → 15
Operator's credits: [prior balance] + 1700 → [new balance]
Deck state: DRIFT cartridge_history bit set (if first time).
Phase chain: If part of SIGNAL HUNT, phase 1 complete → ready for SHELLFIRE Hot Swap.

DRIFT’s sound design enables a fully playable audio-only mode. This is not an accessibility feature tacked on; it is the natural emergence of a geometrically rigorous game where audio encodes bearing angles, signal strength, and threat escalation.

An expert operator with 20+ DRIFT contracts completed can triangulate by ear alone:

  • Listening to Voice 1’s pitch, they estimate bearing angle.
  • Listening to Voice 2’s harmony, they judge triangulation geometry quality.
  • Listening to Voice 3’s beat tempo, they track counter-surveillance pressure.
  • Using spatial memory (remembering where they moved antennas), they maintain the geometry in their head.

This skill mirrors NEONGRID’s audio-only mastery (grid navigation by ear). DRIFT operators who master audio-only become better at spatial reasoning across all modules.

DRIFT teaches operational geometry:

  • Bearings are angle measurements; multiple bearings from different positions allow trilateration.
  • Antenna positioning matters; equilateral geometry is superior to collinear geometry.
  • Error bounds tighten with better geometry; poor geometry leads to wide error margins.

These are real principles from surveying, navigation, and electronic warfare. DRIFT is not simulation; it is abstraction. But the abstraction is based on real geometry.

An operator who masters DRIFT will understand why three antennas placed at 120° angles around a target give better triangulation than three antennas in a line. This knowledge is intuitive and embodied, not analytical.

Counter-Surveillance Tension vs. Time Pressure

Section titled “Counter-Surveillance Tension vs. Time Pressure”

Two independent timers run simultaneously:

  1. Transmission window (signal ends at turn 26): Operator must intercept before signal vanishes.
  2. Awareness escalation (HUNTER spawns at awareness 50+): Operator must remain covert.

These are not redundant. They create different pressure profiles:

  • A fast operator (high OODA cycle rate) completes triangulation quickly but burns awareness (many antenna moves = high detection risk). They intercept successfully but trigger HUNTER, forcing them into evasion mode during the final approach.
  • A careful operator (low OODA cycle rate, selective moves) minimizes awareness but risks running out of time. They stay covert but arrive at the target location late (transmission has degraded to near-inaudible levels).
  • An expert operator balances both: strategic antenna moves (few but well-placed), rapid triangulation lock (high-confidence geometry from first 3-4 bearings), and optimized convergence path (minimum extra turns to reach target).

This balance is the core challenge of DRIFT. It is not a puzzle with one solution. It is a continuous optimization problem.

The actual signal (corporate call, pirate broadcast, emergency beacon) is flavor, not mechanics. The gameplay is pure geometry. The signal serves as a narrative hook and a diegetic explanation for why the operator is acquiring bearings.

But the signal itself is not part of the game system. There is no “decryption difficulty” or “signal quality” that affects the operator’s bearing accuracy. The signal either broadcasts (playable window) or it doesn’t (failure). Within the window, signal strength is purely a function of antenna distance from source.

This is intentional simplicity. DRIFT’s challenge is geometric problem-solving, not signal-processing simulation. Keeping the signal simple keeps focus on the core mechanic: positioning antennas to solve a triangulation problem under time pressure.

At threat 5, multipath reflections introduce ambiguity. The operator receives multiple bearing signals and must identify the primary (direct path) from ghosts (reflections).

This is a skill-gating mechanism. Novice operators (threat 1-3) never see multipath; they can triangulate without ambiguity. Experienced operators (threat 4+) begin encountering reflections; those who master discrimination progress to threat 5 where multipath is guaranteed.

Multipath escalation is the natural progression from spatial geometry (threat 1-2) to RF physics (threat 5). An operator who can triangulate geometric shapes (simple bearings) is ready to understand RF propagation (complex bearings with reflections).


void update_antenna_bearing(antenna_cell *ant, signal_source_cell *source) {
int16_t dx = source->grid_x - ant->grid_x;
int16_t dy = source->grid_y - ant->grid_y;
// Calculate bearing angle (0° = north, 90° = east, etc.)
int16_t bearing_raw = atan2(dx, -dy) * 180 / PI; // atan2 in degrees
if (bearing_raw < 0) bearing_raw += 360;
ant->signal_bearing = bearing_raw % 360;
// Calculate signal strength (distance-based attenuation)
int16_t distance = sqrt(dx*dx + dy*dy);
ant->signal_strength_dB = 100 - (distance * 3.5);
if (ant->signal_strength_dB < 0) ant->signal_strength_dB = 0;
// Check if signal is above reception threshold
ant->signal_detectable = (ant->signal_strength_dB > THRESHOLD_45dB);
}

Triangulation Calculation (Line Intersection)

Section titled “Triangulation Calculation (Line Intersection)”
void calculate_triangulation(triangulation_cell *tri, antenna_cell *ants[3]) {
// Three bearing lines, represented as (angle_degrees, antenna_position)
// Find intersection point of three lines
// This is a least-squares problem: find point (x, y) that minimizes
// the sum of squared perpendicular distances to all three bearing lines
// Simplified: use pairwise intersections and average
point p1 = line_intersection(ants[0], tri->bearing_angles[0],
ants[1], tri->bearing_angles[1]);
point p2 = line_intersection(ants[1], tri->bearing_angles[1],
ants[2], tri->bearing_angles[2]);
point p3 = line_intersection(ants[0], tri->bearing_angles[0],
ants[2], tri->bearing_angles[2]);
// Average the three intersection points
tri->triangulation_x = (p1.x + p2.x + p3.x) / 3;
tri->triangulation_y = (p1.y + p2.y + p3.y) / 3;
// Calculate confidence (lower if lines are nearly parallel)
tri->triangulation_confidence = calculate_geometry_quality(ants, tri->bearing_angles);
}

YM2149 Voice Frequency Mapping (Bearing → Hz)

Section titled “YM2149 Voice Frequency Mapping (Bearing → Hz)”
uint16_t bearing_to_frequency(uint8_t bearing_degrees) {
// bearing: 0-359 degrees
// frequency: 200-800 Hz
// mapping: 0° (north) = 200Hz, 90° (east) = 500Hz, 180° (south) = 800Hz, 270° (west) = 500Hz
int16_t offset = bearing_degrees - 180; // Center around south
if (offset < 0) offset += 360;
// Sinusoidal mapping: frequency peaks at south (180°), dips at north (0°)
uint16_t freq = 500 + 300 * cos(offset * PI / 180);
return (freq < 200) ? 200 : (freq > 800) ? 800 : freq;
}
void increment_awareness(surveillance_threat_cell *threat, int8_t amount) {
threat->awareness_level += amount;
if (threat->awareness_level > 100) threat->awareness_level = 100;
// Update threat level UI
if (threat->awareness_level < 21) threat->threat_level_ui = SAFE;
else if (threat->awareness_level < 41) threat->threat_level_ui = CAUTION;
else if (threat->awareness_level < 61) threat->threat_level_ui = ALERT;
else threat->threat_level_ui = DANGER;
// Spawn HUNTER at awareness = 50
if (threat->awareness_level >= 50 && !threat->hunter_spawned) {
spawn_hunter_at(threat, last_antenna_position);
threat->hunter_spawned = 1;
}
}

With SHELLFIRE (Phase 2 of SIGNAL HUNT):

  • DRIFT’s triangulation point is passed to SHELLFIRE via phase_chain.
  • SHELLFIRE uses the dead-drop coordinates to position its sonar scope (frequency detection centered on source location).
  • If DRIFT’s triangulation error was >3 cells, SHELLFIRE’s extraction window is slightly reduced (signal is harder to lock if source location is mis-estimated).

With ICE BREAKER (Phase 3 of SIGNAL HUNT):

  • SHELLFIRE’s extracted encryption keys are passed to ICE BREAKER via phase_chain.
  • ICE BREAKER uses the keys to decrypt network traffic and unlock final intelligence payload.

With BLACK LEDGER (Alternative Phase 2 for multi-module contracts):

  • DRIFT can detect RF signals from financial networks (high-frequency trading RF networks, for example).
  • BLACK LEDGER can analyze the decrypted financial data extracted from those networks.
  • Cross-phase integration: if operator loads both DRIFT and BLACK LEDGER in cartridge history, multi-phase contracts appear on the mission board linking financial network reconnaissance (DRIFT) to forensic accounting (BLACK LEDGER).

With NEONGRID (Spatial Pedagogy):

  • DRIFT shares spatial reasoning with NEONGRID.
  • Operators who master NEONGRID (precise grid navigation) are better at DRIFT (antenna positioning geometry).
  • Operators who master DRIFT (triangulation geometry) are better at NEONGRID (spatial problem-solving).
  • Both modules use the numpad (8/2/4/6) for cardinal movement; the motor memory transfers directly.

16. EMERGENT COLLISIONS & UNSCRIPTED MOMENTS

Section titled “16. EMERGENT COLLISIONS & UNSCRIPTED MOMENTS”

Collision 1: Geometry Trap + Time Pressure

Section titled “Collision 1: Geometry Trap + Time Pressure”

Operator acquires three bearings quickly (fast decision-making, high awareness). The bearings are nearly collinear (poor geometry; they form a very flat triangle). Triangulation error is huge (±8 cells).

Operator realizes too late: they need to re-position antennas and acquire new bearings to improve geometry. But time is running out (only 5 turns left).

Emergent problem: Should they press NIL to reset and risk running out of time entirely? Or should they accept the high-error triangulation and hope they can brute-force toward the target by exploring?

Decision creates tension: trust in poor geometry (risky), or reset and lose time (expensive).

Collision 2: Signal Degradation + HUNTER Approach

Section titled “Collision 2: Signal Degradation + HUNTER Approach”

Operator is slow at triangulation and lingers 15+ turns in the positioning phase. Awareness has escalated to level 45 (HUNTER will spawn soon if they continue active RF activity).

Signal transmission is approaching its end; signal strength is degrading (weaker pings, harder to lock).

They are at a decision point: make a final bearing lock attempt (noisy; triggers HUNTER spawn) or go silent (BACK key; let awareness decay but lose the bearing opportunity).

If they lock the bearing, HUNTER spawns at their location. They must then immediately switch to silent mode and evade. If they evade successfully, they retain the bearing and can triangulate. If HUNTER catches them, mission aborts.

Emergent drama: Risk/reward trade-off between immediate action (lock bearing, trigger HUNTER, but get critical data) and conservative evasion (evade, preserve life, but possibly miss transmission window).

Collision 3: Multipath Ambiguity + Geometry Failure

Section titled “Collision 3: Multipath Ambiguity + Geometry Failure”

At threat 5, operator receives multiple bearing signals (primary + 2-3 ghosts). They attempt to identify which is primary, but they guess wrong. They lock a ghost bearing as one of their three bearings.

The triangulation calculation completes with one ghost bearing mixed in. The triangulation point is off by 4-6 cells (the error manifests only when the false bearing is combined with true bearings).

Operator moves all antennas to the calculated (wrong) target location. They arrive after 18 turns, with 8 turns left. Signal is there, but it’s 5 cells away from where the operator positioned the antennas. Signal undetectable at that distance.

Operator has failed to intercept. Payout: 0. The failure is not obviously caused by the ghost bearing (operator does not see triangulation math); it feels like bad luck. But the root cause is a skill gap (multipath discrimination).

Emergent lesson: A Threat 5 operator who does not have audio-only multipath skill will fail. The game has taught a harsh but fair lesson: master the audio discrimination or you will fail at high threat levels.


DRIFT is a geometry-based real-time puzzle sport where the operator’s spatial reasoning and real-time decision-making under pressure are the entire challenge. The signal is a pretext. The threat is real. The core mechanic is pure: acquire three independent RF bearings, solve triangulation geometry, and intercept before the transmission window closes.

The game is fully playable by ear. An expert operator can close their eyes, listen to Voice 1’s pitch (bearing), Voice 2’s harmony (geometry quality), and Voice 3’s beat (threat escalation), and solve the entire triangulation problem without ever looking at the screen.

This is not because DRIFT is built as an accessibility feature. It is because the game is about angles and distances, and audio naturally encodes both. Sound-only play is the natural summit of DRIFT mastery.


END OF SPECIFICATION

Version 1.0 | 1,452 lines | April 2026

This specification is engineering-ready and matches the depth and structure of KN-86-ICE-Breaker-Gameplay-Spec.md. All systems are defined, all cell types have handler signatures, all key mappings are documented, screen wireframes are complete, and a full 120-second walkthrough demonstrates the core loop in detail.


Drift’s voice: SIGINT operator with coordinate dialect. Brief bearings, terse observations, occasional drift into remembered transmissions.

(:subject "bearing" "signal" "source" "antenna" "lobe"
"fix" "line" "transmitter" "emitter")
(:object "angle" "cross" "line" "triangle" "fix"
"confidence")
(:location "quadrant" "sector" "grid" "fix" "line")
(:verb-present "drifts" "points" "steadies" "narrows" "wavers"
"pins")
(:verb-past-participle "pinned" "lost" "fixed" "lost" "triangulated"
"narrowed")
(:memory-keyword "bearing" "fix" "transmitter" "lobe" "line")
(:affect-word "clean" "wavering" "narrow" "wide" "steady")
(:mode-observe
(3 (:subject) ". " (:drift/bearing) ".")
(2 (:location) ". " (:affect-word) ".")
(1 "fix."))
(:mode-annotate
(3 "bearing " (:affect-word) ".")
(1 "three lines. one point.")
(1 "wavering."))
(:mode-reflect
(3 "same carrier. " (:memory-fragment))
(2 "this bearing. " (:memory-fragment)))
(:mode-drift
(2 "transmission from october.")
(1 "a voice that kept repeating.")
(1 "the relay that drifted two degrees a night."))
(:drift/bearing
(3 "north.") (3 "east.") (3 "south.") (3 "west.")
(2 "north-east.") (2 "south-west."))
:event-types
((:type :bearing-acquired :affect (:routine))
(:type :bearing-lost :affect (:tense))
(:type :triangulation-complete :affect (:significant))
(:type :transmission-intercepted :affect (:significant)))
Beatobserveannotatereflectdriftsilent
:active-hack (triangulating)+0.05+0.10
:high-tense (window closing)+0.15
:debrief+0.05+0.10+0.05

Rationale. Drift is audio-first; the bearing tones own the channel. Cipher stays out of the way, drifts during debrief about past transmissions.

Structurally Important Moments Preserved on CIPHER-LINE

Section titled “Structurally Important Moments Preserved on CIPHER-LINE”
BeatIntentCIPHER-LINE fragment(s)
First bearing”Bearing acquired. Signal strong.”bearing. east.
Triangulation complete”Source located. Moving to intercept.”fix. then three lines. one point.
Transmission window opening”Transmission active. 30 seconds.”live. (tense)
Intercept captured”Payload captured. Clean pull.”got it.
Bearing lost”Signal drift exceeded antenna reach.”lost. wide.

Per ADR-0016 (nEmacs + REPL + Input Model), each cart declares what its scripted-mission surface looks like — grammar fragments contributed to the predictive palette, domain vocabulary that earns the +5 ranking boost (ADR-0016 §7), whether it uses prompt-text for raw text entry (§8), and whether any of its keys bind :double-tap or :long-press events (§9). Drift is a geometry-based audio sport — triangulation is heard, not typed — so its nEmacs surface is minimal.

No. Drift is geometry-in-real-time. The operator’s skill is spatial-auditory, not compositional. No scripted-mission contracts exist; the cart’s bounty chain rewards faster triangulation, not Lisp expression of triangulation logic. Drift ships without scripted-mission support on the critical path and does not unlock one at high reputation. This places Drift in the “primitive-orchestration only” subset of 14 launch carts (ADR-0002 explicitly allows this).

Minimal — Drift contributes a small grammar fragment for REPL introspection (bearing, source-fix) but no scripted-mission forms. The grammar is useful if an operator wants to probe the cart’s state from the REPL, not compose missions:

(emacs-extend-grammar
(antennas) ; list of three antenna records
(antenna (id)) ; specific antenna
(bearing (antenna-id)) ; current received bearing
(signal-strength (antenna-id))
(source-fix) ; current triangulation estimate
(transmission-live?)
(window-remaining)) ; seconds left in current transmission

No event binders, no action primitives beyond read-only — intercept is numpad-committed, not script-committed.

Via (emacs-extend-vocabulary ...). Triangulation / RF / geometry terms:

(emacs-extend-vocabulary
"bearing" "angle" "direction" "heading"
"antenna" "dish" "array" "array-spacing"
"signal" "source" "transmitter" "emitter"
"triangulate" "fix" "cross-reference" "intersect"
"strength" "amplitude" "attenuation" "drift"
"transmission" "payload" "intercept" "window"
"east" "west" "north" "south" "compass"
"geometry" "line" "point" "convergence")

No. Bearing entry is numpad (three-digit degrees). Antenna selection is primitive key. Drift declares nothing via prompt-text.

Drift opts into ADR-0016 §9 on INFO only — to surface triangulation math without visual clutter:

Key:tap:double-tap:long-press
INFOshow-antenna-bearingshow-all-three-bearingsshow-triangulation-geometry — render the cross-line diagram

Row 24 renders: INFO:BEAR INFO²:ALL INFO…:GEO EVAL:INTERCEPT QUOTE:LOCK-BEARING. All other keys bind :tap only.

Context-Polymorphic Key Semantics (Cart Gameplay)

Section titled “Context-Polymorphic Key Semantics (Cart Gameplay)”

Drift has one primary cursor context during play — triangulation view — plus a debrief view:

KeyTriangulation viewDebrief view
INFOshow-antennashow-run-stats
CARdrill-into-antennadrill-into-event
CDRcycle antenna (1 → 2 → 3)next-event
EVALcommit-interceptexport-replay
QUOTElock-bearingflag-beat
BACKrelease-lockexit-debrief
Numpadbearing entry (degrees)event index

When the operator opens nEmacs, the keymap hands off to :nemacs-nav per ADR-0016 §3 — though Drift players rarely do this during a live transmission window, since triangulation is time-pressured and the cart pauses while nEmacs is open.