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 codebyte 1— seeker type (laser)- Cone half-angles:
word 32767(approximately 180° — omnidirectional) - Short max range:
^60760 - Both lobes identical
si_namescontains display label strings (unlike aircraft radars)
VIS300.SEE — 300° Visual Acquisition Cone¶
word 0— no capability flagsbyte 0— seeker type (visual)- Azimuth:
word 27300(≈ 150° half-angle = 300° total arc) - Elevation:
word 21840(≈ 120°) - Empty
si_namesstrings
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)
Related¶
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.