mirror of
https://github.com/Cesarus85/ringfall-mjolnir-vr.git
synced 2026-10-29 04:01:10 +01:00
Owner ruling 2026-09-20: allow the narrow _random_range COMDAT exception and land +640. Do not extend it to _point_from_line3d; its explicit guard remains. One line. The grenade count is computed with the header's __inline helper, random_range(lower, upper + 1), instead of spelling out seed_random_range(get_global_random_seed_address(), lower, upper + 1). This is exactly how the already-exact _ai_scripting_renew in ai_script.c computes the same grenade count from the same fields. The decoded allocator predicts why it matters: the helper's two inlined parameters raise the grenade block's pressure from 3 to 5, lifting actor_variant_definition's web from 53 to 65 - one point above change_colors at 64 - so it takes ebx and change_colors spills, which is January's allocation. The same form also fixes the push order at 0x18e. One source fact resolves both halves of what had been classed as "allocator decision plus a separate difference". THE EXCEPTION, and its limits. The change newly defines exactly one symbol, _random_range, a COMDAT byte-identical to January's single copy, which the split credits to action_obey.obj. That emission is admitted by the ruling above and by nothing broader; ai_script.obj and encounters.obj already emit the same COMDAT. The _point_from_line3d guard still exits 0 on this unit. The function was parked; its entry is removed by brace-depth line surgery. Verified: full ninja green; code 1,462,353 -> 1,462,991 (7,303 -> 7,304 functions); actors 73/3 -> 74/2; 11,060 function rows and 1,706 section rows diffed board-wide, 0 worse; newly defined symbols: _random_range only; parks 180 -> 179 active, 0 stale, 0 invalid; fake_match_scan 0 findings. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>