objects.h: both bounding-sphere inline assertions report OBJECTS_H_FILE, which
defaults to January's relative "..\objects\objects.h". object_lights defines the
absolute spelling first, as January's string census shows. action_vehicle loses
its NODUP hand copy of object_get_bounding_sphere, so the header inline is the only
definition. render_objects' lighting_storage becomes the static local of
object_get_cached_render_lighting (symbols.json).
path.h: the opaque __unknown140A0[0x5C] span is HCEX's `struct path_result
result`, and path.c stores through the field instead of a punning cast.
Consumer sweep (full ninja, objdiff 3.3.1): stable diff shows 0 regressions and no
moved rows beyond the batch-1/Layer-2 gains. Parks 93/0/0, admission 15/0/7/0,
pytest 1157 passed.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Header packet P5 (150K lane). January's inlined copy in _path_add_steps loads and stores the helper value as 16 bits (mov dx,word [ebx+ecx*8+0xa]; mov word [ebp-0x10],dx) with a dword NONE arm, and the out-of-line _obstacle_from_disc widens an int-typed ?: (movsx eax,word [eax+2] / or eax,-1). The owner prototype and definition now return short, the definition is the single ?: expression, and the redundant (short) cast in path_new is dropped. Declaration count unchanged.
Consumers: 56 transitive path.h includers shadow-compiled H vs P (+1 / 0 losses). Live tree: full ninja + stable sweep +1 gained (_path_add_steps 816, park removed) / 0 regressions; parks 289/0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>