CARD C04 - HCEX domain constants for the remaining raw literals (R4 goal_radar, R5 game matching options, R6 multiplayer sounds), TU-local like F01R's other game-engine enums, on top of c1a
written: 2026-09-26 01:10:35 -0700 (BEFORE the compiles)

Observed discrepancy (rule 13 "Use correct domain-specific enum constants ... do not choose a raw number"):
- R4: universal_variant.goal_radar compared/assigned as 0/1/2 at 29 sites.
- R5: match_game_type tests entry 12/13/14 and game_type 1/5, and `game_types[index] == 0`.
- R6: game_engine_play_multiplayer_sound(1 / 0xE / 0xF / 0x10 / 0x11 / 0x12 / 0x1B) while 0x1D/0x1F already use
  TU names; the TU's mid-file anonymous enum mixes those two sound indices with _equipment_created_at_rest_bit.
Source evidence: X - HCEX.pdb enums (DIA2Dump -t): `enum goal_radar {_radar_motion_tracker, _radar_nav_point,
_radar_none}`; unnamed {_game_engine_ignored1=8.., _game_engine_all=0xC, _game_engine_all_non_team=0xD,
_game_engine_all_normal=0xE, NUMBER_OF_GAME_MATCHING_OPTIONS}; unnamed multiplayer sounds {_game_over=1,
_double_kill=0xE, _triple_kill=0xF, _killtacular_kill=0x10, _running_riot=0x11, _killing_spree=0x12,
_teleporter_activate=0x1B, _countdown_for_respawn=0x1D, _respawn=0x1F, ...}. J - every site's January behaviour
agrees (end_game -> game over; the five kill-streak messages -> their streak sounds; teleport -> activate; 12 -> TRUE,
13 -> !ctf, 14 -> !ctf && !race).
Proposed correction: TU-local enums at the top constants block (F01R precedent: only January-attested values; the
game_engine.h name count is fragile), literals replaced; game_engine_ctf/race/none from game_engine.h for 1/5/0; the
equipment bit gets its own enum where it was.
Compiler-state prediction: each is byte-identical per site (same constants). C1 numbering grows by ~+4 (R4),
~+3 (R5), ~+7 net / +9 before update_teleporter (R6) for later functions. c1a sits 9 below populate's band
(+9..+13). Sums: R4 4, R5 3, R6 7-9, R4+R5 7, R4+R6 11-13, R5+R6 10-12, all 14-16.
PREDICTION (count model, low confidence in exact per-name costs): R4, R5, R4+R5 EXACT 180/180; R6 alone EXACT or
marginal; R4+R6 and R5+R6 flip _populate_statistic_buffer; all three together EXACT only if its sum clears 13.
Rule 24/21 stance fixed in advance: adopt ONLY the complete set R4+R5+R6 if it is 180/180; if the complete set
flips a function, adopt none of them (no subset chosen by yield) and report all measurements.
Decisive test: revgate game_engine for c2_R4, c2_R5, c2_R6, c2_all (+ keyed diff vs build/base).
