The Xbox game state (0x345000 bytes at 0x80061000) ends exactly where the
map-linked tag cache begins and has 948 bytes free, so a 128-player
session cannot even allocate its player datums. The native builds now
place a 16 MB game state (CPU 0xFC0000, GPU 0x40000) at 0x81A00000, above
the tag cache and below everything the Xbox memory window hands out
top-down, and grow the pools that scale with the number of players:
- objects: 2048 -> 8192 headers, 1 MB -> 8 MB pool; the garbage limits
keep January's proportions (5/10/20 % of the pool, 2.5/5/10 % of the
headers, 75/50/30 active garbage objects per 16 players)
- cluster partition reference lists 2048 -> 8192 (collideable and
noncollideable objects, lights); a full list drops objects out of
rendering, collision and sphere queries
- effects 256 -> 2048, effect locations 512 -> 4096
- particles 1024 -> 8192 (render_particles' visible list, filled without
a bound check, follows), particle systems 64 -> 256, their particles
512 -> 4096
- contrails 256 -> 1024, contrail points 1024 -> 8192
(MAXIMUM_CONTRAIL_POINTS stays the pool size for the same reason)
- lights 896 -> 4096, object looping sounds 1024 -> 4096
- cached object render states and rendered objects 256 -> 1024
- script object-list references 128 -> 1024, objects one explosion can
damage 64 -> 256
The values live in port/linux/include/halo_port_capacity.h, included by
halo_port_limits.h. With 128 player datums the CPU part holds 14,256,908
bytes (2,258,164 free). Saved games and cores grow to 16 MB. Every change
is under HALO_LINUX; the MSVC objects are unchanged.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Owner ruling Q6: the retail-contradicted `double t` is rejected; the helper
cleanup may land at zero credit. _sphere_intersects_cluster_portal now uses
one shared FALSE exit and the real point_from_line3d call in place of the
hand-expanded rows, with production's names and types kept. It stays
residual at January's 432 bytes, and no other function changes.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lane D refresh packet 7: +80 padded bytes strict exact;
structure_detail_objects.obj is now a whole-object match (15/15 functions,
.text/.rdata/.bss all 100%). Zero stable-verdict regressions.
The production `struct detail_object_globals debug_detail_objects`
aggregate and its `#define detail_object_global_runtime_data` alias were
invented. HCEA (DIA2Dump on the structure_detail_objects compiland) lists
the file statics detail_object_global_runtime_data (struct pointer),
fudge_vector (uchar), fudge_offset and final_offset (float), with
debug_detail_objects as a separate global; January's own assert string
uses the bare name detail_object_global_runtime_data. The source now
declares those statics in January's .bss order (initialised, so VC7 keeps
declaration order) and _structure_detail_objects_initialize stores through
the global directly, as the debug build does.
- symbols.json: four "static": true entries after _debug_detail_objects
(line insertion only).
- parked.json: unpark _structure_detail_objects_initialize.
Gate: ninja PASS, parks 124 active / 0 stale / 0 invalid, admission 0
contradicted / 0 revoked, fake scan 0 leads.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Lane D refresh packet 3: HS, effects and structures, +6,896 padded bytes
strict exact (9 functions), zero stable-verdict regressions.
- hs_compile.c: _hs_add_script exact as a goto-free single-exit function.
The worker's discarded hs_function_get call in hs_compile_postprocess
(fuzzy only; the debug build shows a dead local, not a bare call) is not
landed.
- hs_runtime.c: _hs_global_reconcile_read/_write exact. The debug build
repeats the external/internal index test inside the external arm; it is
written with this file's own if/else index idiom instead of the worker's
invented macro name.
- contrails.c: _contrail_add_points exact (contrail_scale_value helper,
corrected indentation).
- particle_systems.c: _particle_system_new_particle_jet, _render and
_update_particle_default exact. The debug build attests the one-field
variables walk (RTC size 4), the render if-block scope and the two-argument
local_random_range call.
- structures.c: _structure_get_planar_fog exact (real scale_vector3d helper;
flags/screen assigned in both arms per the debug build).
- structure_visibility.c: _portal_hull_from_points exact, single exit, real
plane3d_distance_to_point helper. The unused BSP local stays a local
(debug build) rather than a bare call.
- New COMDATs (_scale_vector3d, _local_random_range,
_plane3d_distance_to_point) are byte-identical to January's single folded
copies (all-inlined admission class).
- parked.json: unpark the four newly exact parked functions.
Gate: ninja PASS, parks 140 active / 0 stale / 0 invalid, admission 0
contradicted / 0 revoked, fake scan 0 leads, castcheck clean.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Integrate verified source and data progress; exclude unproven COMMON ownership, held UB/asm forms, and address-named data credit. Stable sweep: 23 exact functions gained, zero lost.
- surface_index_buffer is declared before the frustum selection (January
loads the index buffer before the pvs test)
- material looked up through nested typed tag-block gets; the buffer walk
skips the two index words and post-increments through the count, matching
January's two separate pointer advances
- block-scoped vertex0/1/2 pointers read the compressed vertex data per
surface, matching January's left-to-right index loads before the call
Wave 21 (3 bundle implementers + 1 reviewer, 14 TUs, 22,880 target bytes)
closed only this function. Stable diff vs wave 20: 1 gained, 0 regressions;
active parks 191 -> 190.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
- input.h: struct key_stroke ascii_code is a char (January stores NONE as
-1; XINPUT_DEBUG_KEYSTROKE.Ascii is CHAR); edit_text.c drops its (byte)
cast on the NONE test and stays 5/5. Measured board-wide over all 24
includers: 0 regressions.
- input_xbox (27/27): _input_get_device_states with indexed gamepad and
button loops and a MIN tick clamp (park reopen);
_input_update_keyboard_devices with a short key-code loop and uncast
ascii ternary (park reopen)
- _structure_test_pill2d (624 B, previously unwritten): left/right offset
line tests via point_from_line2d and the nearer collision
- _find_turning_point: normalize2d/point_from_line2d/set_real_vector2d
replace hand-expanded helper math
- _structure_visibility_build_surfaces_traverse_leaf: the static
bounding_rectangles_intersect returns short through one result (park
reopen)
Rejected: _first_person_weapon_update (removed NULL guards, UB hold).
Follow-up: _path_test_pill_endpoint_near_wall_ok_bit is file-local in both
path_smoothing.c and path_structure_bsp.c; its owner is path_structure_bsp.h.
Stable diff: 0 regressions; parks 226 -> 223.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Per-function transplant of historical and worktree donor bodies into the
current tree (whole-blob mining had rejected them for unrelated losses).
Each landing is the minimum hunk, strict exact in its whole-TU gate with
zero inherited losses, and reviewed for house rules and hard holds:
- helper spellings replace hand-expanded math (_device_frontfacing,
_point_in_triangle3d, _actor_look_valid_aim/look_vector)
- _pill_test_vector3d normalizes directly into the output normal
- natural control-flow/declaration forms reopen five parks
(_structure_cluster_mark/unmarked, __rasterizer_widget_draw_sprite2d,
_rasterizer_set_model_skinning, _ai_handle_editing)
- two byte-proven non-UB original bugs kept under the documented
original-bug policy with BUG comments (_ai_handle_editing unscaled
csmemmove counts, _ai_scripting_follow_target_ai repeated name)
Stable diff vs 9062b1e96: +11 functions, 0 regressions; parks 268 -> 263.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wave n1 of the next-150K lane (fresh structural portfolio at ae10935da).
- structures _structure_render_detail_objects (+1136): reopened with the natural
array initializer, which the w2 verifier asked for when it rejected the
hand-written a[0]=0/memset expansion (R6).
- draw_string _bitmap_draw_character (+944).
- hud_sounds _hud_play_sound (+352): closed by removing the one-use index alias
and reading sound_indices directly (A5), NOT by the volatile/goto body that the
park record shows was deliberately replaced.
- bink_playback _bink_free_texture_cache (+96): the park premise was the repo's
own match_dassert wrapper; the user-supplied Bungie random_math.c spells the
same two sites vassert, and the tree is 874 match_vassert to 14 match_dassert.
- structures _structure_get_planar_fog: zero-credit remeasure. Adding the
discarded fog-plane lookup January provably executes (its 15th
_tag_block_get_element_with_size relocation at +0x16d) closes both structural
tags; 448/448 and 15/15, residual now one register-naming window.
Rejected by the verifiers and not landed: _bink_alloc@4 (exact only with an __asm
block in a pool allocator - house rule 10 allows asm only for evidenced
helper/math routines), the progress_bar _code_000d16d0 rename (standing hold),
and the _portal_hull_from_points remeasure. wind _wind_variance_get is HELD for an
owner ruling (see its ledger).
Full ninja, parks 274 active / 0 stale / 0 invalid, stable diff vs
scratch/opus5-next150-before.json: gained 4 / 2,528 padded, regressions 0; fake
scan 0 leads.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wave w1 Batch B (adversarially verified): _leaf_map_build_portals_from_leaf is now resolved-address identical to January (480/17, objdiff 100%); the only strict difference is a csplit one-past-the-end relocation alias, so its park is re-measured and reclassified csplit-relocation-alias (validated by tools.parked_functions). Zero strict credit. Full ninja build and stable sweep: 0 regressions.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wave w2 landing, adversarially verified. park reopens: _render_debug_detail_objects. Full ninja build and per-function stable_verdicts sweep: 0 regressions. 1 park(s) removed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
planes_intersect_rectangle private ABI, single-exit mirror search, established child & LONG_MIN idiom; traverse_leaf park re-measured for the callee ABI (evidence appended). 8 park(s) removed. Adversarially verified (wave D park re-investigation); full build of the combined wave D set: 0 regressions, parks 402/0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
matrix_math.h and real_math_planes.h declare the genuine matrix_math.c / real_math.c signatures for their physics and collisions callers. Declaring either prototype in the broad real_math.h regressed decals::_decals_delete_permanent_from_cluster and draw_primitives::_rasterizer_dynamic_geometry_initialize and drifted four parks at any position (declaration count, bisected), so the precedent of narrow subsystem headers (bitmap_color_conversion.h, rasterizer_xbox_water.h) is followed. structure_fog_plane +0x00/+0x02 are the region index and the signed runtime material type January collision_test_vector reads; scenario.c renames are names only.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Retain 18 strict exact-function gains across Actions, Actor Combat, Decals, Game Engine, Object Lights, and Bipeds after removing donor bodies that regressed exact objects, emitted unowned code, or violated source-credibility rules. Name authenticated private symbols, move declarations to owner headers, record honest residual parks, and preserve units.obj at 189/189.