Skip to content

SEE — Seeker Sensor Definition (.SEE)

FA_2.LIB contains 51 .SEE files. Each defines the sensor parameters for one seeker type — radar, infrared, targeting pod, or visual acquisition cone. BRF plain text (NOT a Win32 PE DLL); F15R.SEE decompresses to 470 bytes. Loaded at runtime by the FA weapon guidance and AI targeting system.

Tools

fx

fx see info   <file.SEE>               # human-readable field dump
fx see unpack <file.SEE> [-o out.txt]  # editable text
fx see pack   <in.txt>   -o out.SEE    # write back (byte-identical)

File Layout

Plain text; BRF syntax (see BRF.md). Hex values use $XX; fixed-point/relative values use ^XXXXX.

F15R.SEE — Radar Seeker Example

[brent's_relocatable_format]
    byte 10             ; type identifier (10 = seeker/sensor)
    ptr si_names
    word 0              ; seeker identifier / capability flags
    byte $0             ; seeker sub-type
    byte 3              ; seeker type (0=visual, 1=laser, 2=IR, 3=radar)
    byte $1             ; mode flags (dual-mode enable — inferred, see Open Questions)
    byte 30             ; param — likely acquisition time or track rate (unconfirmed)
    byte 0 ... byte 0   ; (4 bytes reserved/unused)
    ; --- Primary lobe ---
    word 10920          ; azimuth half-angle (≈ 60° at 182 units/°)
    word 10920          ; elevation half-angle
    dword ^0            ; min range
    dword ^911400       ; max range (feet)
    dword $80000000     ; min heading error (sentinel = no limit)
    dword $7fffffff     ; max heading error (sentinel = no limit)
    ; --- Secondary lobe ---
    word 8190           ; azimuth half-angle (≈ 45°)
    word 8190           ; elevation half-angle
    dword ^0            ; min range
    dword ^607600       ; max range
    dword $80000000
    dword $7fffffff
    byte 100            ; probability of detection lobe 1 (100 = 100%)
    byte 100            ; probability of detection lobe 2
:si_names
    string ""           ; short name (empty for aircraft radar — not a display item)
    string ""           ; long name (empty)
    string "F15R.SEE"   ; filename (self-reference)
    end

PAVEKNF.SEE — Targeting Pod (AVQ-10 Pave Knife)

  • word 425 — pod identifier / capability code
  • byte 1 — seeker type (laser)
  • Cone half-angles: word 32767 (approximately 180° — omnidirectional)
  • Short max range: ^60760
  • Both lobes identical
  • si_names contains display label strings (unlike aircraft radars)

VIS300.SEE — 300° Visual Acquisition Cone

  • word 0 — no capability flags
  • byte 0 — seeker type (visual)
  • Azimuth: word 27300 (≈ 150° half-angle = 300° total arc)
  • Elevation: word 21840 (≈ 120°)
  • Empty si_names strings

Angle Encoding

word 16380 = 90° (quarter circle), giving a resolution of 16380 / 90 = 182 units per degree.

word value Degrees
8190 45°
10920 60°
13650 75°
16380 90°
21840 120°
27300 150°
32767 ~180°

All values are half-angles; total cone coverage is double the stored value.

Range Encoding

dword ^XXXXXX uses the ^ (relative/fixed-point) prefix. 1 unit = 1 foot (confirmed via cross-reference of multiple sensor files against published system ranges):

File Stored value ÷ 6076 Known range
AV8L.SEE (laser pod) ^60760 10.0 nm TIALD pod ~10 nm ✓
AIM9X lobe 1 ^50000 8.2 nm AIM-9X ~8 nm ✓
AIM120 lobe 1 ^144000 23.7 nm AIM-120A ~25 nm ✓
AGM65G lobe 1 ^60000 9.9 nm AGM-65G ~10 nm ✓
AGM84A lobe 1 ^360000 59.3 nm Harpoon ~60 nm ✓
F4BR.SEE (APQ-72) ^303800 50 nm APQ-72 ~40–50 nm ✓
E3R.SEE (AWACS) ^1215200 200 nm E-3 ~200–250 nm ✓

6076 ft = 1 nautical mile; divide any ^ range value by 6076 to get nm. (An earlier 11400-units/nm hypothesis from F15R.SEE alone was incorrect; the per-foot calibration is consistent across 7 independent data points. F15R.SEE's ^911400 ≈ 150 nm represents maximum theoretical lobe extent under ideal conditions, not the pilot-selectable APG-63 range.)

Seeker Type Byte — confirmed

Value Type Evidence
byte 0 Visual VIS*.SEE files
byte 1 Laser AV8L.SEE (Harrier laser designator), KA50L.SEE, SU24L.SEE, SU37L.SEE
byte 2 IR / EO AIM9M.JT, AIM9X.JT, AGM65G.JT PROJ_TYPE seeker byte
byte 3 Radar (active or semi-active) F4BR.SEE (APQ-72), AV8R.SEE (Blue Fox), E3R.SEE (AWACS), AIM120.JT, AGM84A.JT

Type byte 1 (laser) confirmed: AV8L.SEE is the AV-8B Harrier laser designator pod; its primary lobe max range ^60760 = 10 nm matches TIALD laser pod operational range.

Sentinel Values

  • dword $80000000 — minimum heading error sentinel: no lower limit (any heading error passes)
  • dword $7fffffff — maximum heading error sentinel: no upper limit

Confirmed via _PROJInFOV@40 (0x004c2860): the heading error test explicitly bypasses the check when the sentinel values are present. A lobe with both sentinels set accepts any target heading relative to the sensor. Setting word 32767 for both half-angles (0x7FFF) additionally triggers an unconditional pass that skips the angle check entirely — this is the PAVEKNF.SEE omnidirectional cone.

Dual-Lobe Structure — resolved

Each SEE file defines two detection lobes, each with independent azimuth/elevation half-angles, range limits, heading error limits, and probability of detection. Primary lobe = search mode; secondary lobe = track/lock mode:

File Lobe 1 (primary / search) Lobe 2 (secondary / track)
F4BR.SEE 50 nm, 60° half-angle 25 nm, 45° half-angle
AV8R.SEE 90 nm, 60° half-angle 50 nm, 45° half-angle

File Inventory

Aircraft Radar

File Aircraft
A6R.SEE A-6 Intruder
A7R.SEE A-7 Corsair II
A10R.SEE A-10 Thunderbolt II
AC130R.SEE AC-130 Spectre (radar)
AC130I.SEE AC-130 Spectre (IR)
AV8R.SEE AV-8 Harrier (radar)
AV8IR.SEE AV-8 Harrier (IR)
AV8L.SEE AV-8 Harrier (laser)
B52R.SEE B-52 Stratofortress
E2R.SEE E-2 Hawkeye
E3R.SEE E-3 Sentry (AWACS)
E6R.SEE E-6 Mercury
E8R.SEE E-8 J-STARS
EA6R.SEE EA-6 Prowler
F4R.SEE F-4 Phantom II
F4BR.SEE F-4B Phantom II
F4JR.SEE F-4J Phantom II
F8R.SEE F-8 Crusader
F14R.SEE F-14 Tomcat
F15R.SEE F-15 Eagle
F18R.SEE F/A-18 Hornet
F22R.SEE F-22 Raptor
F104R.SEE F-104 Starfighter
KA50L.SEE Ka-50 Hokum (laser)
MIG21R.SEE MiG-21 Fishbed
MIG27R.SEE MiG-27 Flogger
MIG29R.SEE MiG-29 Fulcrum (radar)
MIG29I.SEE MiG-29 Fulcrum (IR)
MIG31R.SEE MiG-31 Foxhound
SEAHARR.SEE Sea Harrier
SU24R.SEE Su-24 Fencer (radar)
SU24L.SEE Su-24 Fencer (laser)
SU27R.SEE Su-27 Flanker (radar)
SU27I.SEE Su-27 Flanker (IR)
SU35R.SEE Su-35
SU37R.SEE Su-37 Terminator (radar)
SU37I.SEE Su-37 Terminator (IR)
SU37L.SEE Su-37 Terminator (laser)
TU26R.SEE Tu-26 Backfire
TU95R.SEE Tu-95 Bear
TU160R.SEE Tu-160 Blackjack
YAK141R.SEE Yak-141 Freestyle

Targeting Pods

File System
PAVEKNF.SEE AVQ-10 Pave Knife
PAVESPK.SEE Pave Spike

Ground / Offboard Sensors

File System
AAS38.SEE AAS-38 FLIR pod
GCIR.SEE GCI radar
REDCR.SEE Red Crown radar

Visual Acquisition Cones

File Coverage
VIS180.SEE 180° arc
VIS240.SEE 240° arc
VIS300.SEE 300° arc
VIS340.SEE 340° arc

All 51 live in FA_2.LIB.

Engine Notes

Search/track lobe dispatch — confirmed

The lobe-switch trigger was confirmed via _PROJLock@24 (0x004c2f20) and PROJServiceWeapon.

The engine maintains a seeker session context struct at fixed address 0x0050ce80. The struct has a flags word at offset +0xde (DAT_0050cf5e) whose bits record the current lock state: - DAT_0050cf5e & 0x10000 — search lock active (partial bracket on HUD) - DAT_0050cf5e & 0x20000 — track lock active (full bracket on HUD) - DAT_0050cf5e & 0x100000 — radar on; required for track-lobe checks (set/cleared by player radar toggle, FlightKey case 0x52) - DAT_0050cf5e & 0x400 — seeker enabled (detectable flag)

Transition writer confirmed: PROJServiceWeapon (outer guidance loop): after _PROJLock@24 returns a lock, evaluates the angular error probabilistically against target+0xe8/+0xea thresholds: - Clears both bits: DAT_0050cf5e & 0xfffcffff (target out of cone or below threshold) - Sets 0x10000 when within the wider search-lock zone - Sets 0x20000 when within the tighter track-lock zone

The projectile/entity's own flags at struct +0xa6 select which lobe check applies: - entity+0xa6 & 0x10000 set → _PROJLock@24 calls search-lobe check (PROJRadarIsOn) - entity+0xa6 & 0x20000 set (and 0x10000 clear) → calls track-lobe check (FUN_004c31f0)

Both lobe-check functions receive the seeker session context pointer (0x0050ce80) and a timer-window parameter (0x28 = 40 game ticks).

PROJRadarIsOn (search lobe, 0x004c2eb0): when the seeker has not yet acquired (ctx+0x10 & 0x80 == 0), checks that the seeker is enabled (ctx+0xde & 0x400) and initialises a lock-hold timer at ctx+0x11a (DAT_0050cf9a) to now + 40 ticks. Once acquired (+0x80 set), verifies the timer has not expired; if ctx+0x11a ≤ now the check fails and lock is dropped.

FUN_004c31f0 (track lobe, 0x004c31f0): identical timer logic, but when acquired additionally requires ctx+0xde & 0x100000 (radar on). If radar is off, track check fails even if the timer is still valid.

_PROJInFOV@40 (0x004c2860) performs the range and heading-error comparison using the lobe selected by param_3: - param_3 == 0 → primary lobe data (SEE offset +0x0F) - param_3 != 0 → secondary lobe data (SEE offset +0x23)

Open Questions

1. Mode flag and parameter byte

The byte $1 at offset 5 (after the seeker type byte) is inferred to be a dual-mode enable flag — set on radars with meaningfully different search/track lobes (F4BR, E3R), clear where lobes differ only in cone angle (AV8L, AV8R) — and the following byte 30 is inferred to be an acquisition-time or track-rate parameter. Neither has a traced consumer.

Status: open — re-static (#54)

Formats: BRF — family grammar; JT — PROJ_TYPE seeker sections reference SEE definitions and share the angle/range encodings; ECM — ECM degrades seeker performance against SEE parameters.