Split HALO_ANDROID into HALO_ARM64_GUEST, HALO_GLES and HALO_ANDROID
Conflict resolved: main's render-target eviction and mip composites are kept, with the PR's HALO_GLES guard on the ES blit fallback after them.
Uninitialised locals get values (debug vertex, datastore result, index
buffer, map tool direction, AI entry points, escape alignment, grenade aim
from a vehicle, game options descriptions, unreachable switch arms), the
AI's squad and platoon records move whole, a speech cause point is read,
the geosphere's out-of-memory path frees itself, a console cond clause
without a result is refused, and the crash reporter rejects truncated map
files. Gameplay the original game has, kept so it plays the same, is noted
in a line rather than a page.
(cherry picked from commit 75afc4a1e57af2ba697e8be0e33b2afeee7639f8)
Rotational sprites draw their edge-on view from the sequence after the state's. A particle bitmap on foundation has only one sequence, which halted the game in particle_system_render. Without that sequence the face-on sprite is drawn alone.
(cherry picked from commit d436a0c0c3abaf069dd34e4b8d761b49569311e6)
HALO_ANDROID meant three things at once. The port's code now names each:
HALO_ARM64_GUEST for the ILP32 AArch64 guest's code paths (the inline
assembly's C, the bss pragmas, the CRT's), HALO_GLES for the OpenGL ES
renderer (its GL header and function list, shaders and capabilities), and
HALO_ANDROID for the app alone (its display, input, files and lifecycle).
The Android build defines all three, so nothing changes for it, nor for
Linux and Windows, which define none. A build for another platform can
then take one part without the others: the ES renderer, or the guest's
ABI, without the Android app.
port/android/README.md also no longer says that the widescreen changes are
in #ifdef HALO_ANDROID: none have been since 50eae19b.
A particle state names its bitmap's sequence, which a Custom Edition map's
bitmap may not have, or may have with no sprites (Hornets Nest's). The
draw read past the bitmap's sequences, then took the sprite index modulo
a sprite count of zero. Such a particle is now skipped.
Found by ChupathingyCE (MrMilenko).
Hosting a co-op level from the Map screen (CO-OP CAMPAIGN, a level and its
difficulty, then Server Setup) makes a network game on the campaign map
with no game engine, which is what co-op is. Only the host runs the
scripts and the AI; port/linux/game/network_coop.c sends clients what the
scripts do (cutscenes, camera, fades, HUD, sounds, devices, named objects,
animations), and network_actors.c drives the host's AI units on every
machine. Players spawn beside each other, respawn beside a safe teammate,
and spectate while dead or waiting. Skipping a cutscene is a vote.
Players can join a game in progress at any time.
Recover transparent geometry submit (+1,285 meaningful code, zero exact losses); reconcile COMMON ownership and Q10 85+EXT1 credit, actions/main data, and separately disclosed denominator corrections. Preserve canonical-only repairs and all held research. C09 is ordinary disclosed cleanup, not a claim of proven scaffolding intent. Clean rebuild, 1,663 tests, parks, audits, provider links and independent EXT1 check pass. Local reconciliation only.
Import only independently reviewed production changes. Preserve canonical physics and virtual-keyboard repairs; keep B3 and all unresolved holds out.
Record exactly four approved canary debits (6987 meaningful bytes), six Halo admissions and two revocations. Keep vendor ioinit/storage work separate. Full build, 8252-row sweep, 1318 tests, park/admission/fake audits and 621-object binding pass within approved debit bounds.
Do not publish donor research dumps or private assets. README and unrelated user research remain untouched. See frontier_publication_reconciliation_20260927.md for complete evidence limits and accounting.
Independently rebuilt and reviewed donor 06645ef4. Uses the existing authenticated realcmp macro; its site spelling remains inferred and VN effect disclosed. 738 meaningful / 752 padded bytes, no exact losses. Retires only the freshly exact scheduler park.
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
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>
Match _decal_clip_to_surface: 1768 meaningful bytes, 59 relocations. The ordinary byte flag set predicate is owner-approved. Three new shared-header COMDATs match January and selected providers; both link orders are duplicate-free. No inherited exact losses.
Zero credit; every packet was independently adversarially reviewed (22/22 approved).
- critic_3: 72 renames of placeholder/invented static function names across 20
objects to first-party names. Each rename has Sept-2001 linker-map alignment
(cachebeta xbe / retail cache exe, several also Aug-2001), relocation-masked
body identity and matching callers; cachebeta publics show every row was a
January static. hs's radiosity_hack_{start,save,find_point}_evaluate pairing
is proven by the Sept .rdata hs_function_definition pointers; players'
create_weapon also matches HCEX.pdb. Objects: ai_debug (reviewer-amended: a
dead stub removed, its comment re-attached), transport_endpoint_winsock,
transport_endpoint_set_winsock (+ parked.json key renames), profile,
progress_bar, network_connection, saved_game_files, rasterizer_xbox_profile,
xbox_sound_cache, game_engine_king, players, hs, hs_runtime, main, decals,
rasterizer_lights, rasterizer_xbox_dynavobgeom,
rasterizer_xbox_environment_fog, rasterizer_xbox_hardware_bitmaps,
render_cameras.
- hs_compile: whitespace_characters, eol_characters and hs_type_primitive_parsers
are external (cachebeta publics, HCEX DataIsGlobal); hs_compile_finish is
static with a TU-local prototype (no public; HCEX static function).
- bink_playback: bink_playback_idle -> bink_playback_update__internal
(first-party). The bink_decompress_audio_frame rename is NOT landed: it needs
an added call whose position is unattested, the same class canonical held for
hardware_geometry in 4d1ebf17.
Gate (full ninja, objdiff 3.3.1): objects 383, code 1,577,237, data 2,586,915
(all unchanged); stable diff 0 regressions; parks 83/0/0; admission 11/0/2/0;
fake scan 26; pytest 1161 passed; diff --check clean.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
All packets passed a precedent audit and an independent adversarial review.
No object changes status.
- Storage per cachebeta publics (source static + symbols.json rows):
- bink_playback: four globals;
- weapons: 11 rows + weapon_magazine_finish_reload;
- object_lights: 4 helpers; should_render_lights is the /Od-attested call and
its prototype leaves the public header;
- vehicles: _update_turret_physics;
- weather_particle_systems: one_over_char_max is external (cachebeta public,
HCEX Global); its globals are static;
- rasterizer_xbox_debug: 8 D3DINLINE wrapper rows (already Matching: audit
FAIL(8) -> PASS, pdb 8 -> 0).
- draw_string: the invented external draw_string_globals aggregate (pads, blob,
#define aliases) becomes four HCEX-attested file statics in /Od declaration
order with = { 0 } (a595bbc2 precedent); typed multitexture params.
- render_debug: three rule-6 hand expansions become real point_from_line3d
calls (ruling #1/#2); the opaque vehicle view gives way to struct
vehicle_datum + vehicle_datum_try_and_get; the six debug_* toggles become
tentative definitions (COMMON evidence).
- vehicles: the TU-wide REAL_MATH_EXTERNAL_POINT_FROM_LINE3D define is gone and
the pathfinding hand expansion becomes the genuine call (ruling #1).
- rasterizer_xbox_profile V1R (reviewer-amended): byte-inert /Od parameter
order, the BUG marker comment, detail_objects via the rasterizer_xbox.h API,
and a rejection text that keeps the SDK-table policy question open.
- semantic_data_matches.json: single-section '$'-defect entries with
allow_incomplete_unit for projectiles _projectile_update_section (1,548 B) and
object_lights _lights_section (1,541 B) (leaf_map / editor_flying_camera /
race precedents).
Gate (full ninja, objdiff 3.3.1): objects 384 (unchanged), code unchanged,
data +3,089; stable diff 0 regressions; parks 83/0/0; admission 10/0/2/0; fake
scan 26; pytest 1159 passed; diff --check clean.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Shared-header prerequisite packet:
- real_math.h: distance2d/distance3d become square_root(distance_squared*(a,b))
(/Od build, no local); project_point2d takes short mapping locals and a
single ?: store (/Od-attested, equal to January's selected copy);
lock/unlock_global_random_seed move from the 2026-09-04 reconstruction
header random_math.h into real_math.h's existing RANDOM_MATH.C prototype
section (main.c calls them without random_math.h).
- action_vehicle, path_obstacles, decals drop their '#define x x_inline'
renames and hand-written NODUP helper copies; the header inlines now emit
byte-identical copies of January's selected sections.
- object_lights and players adopt the /Od caller spellings (0x5d0d50).
Full ninja + rename-stable 8,245-function diff: +2 exact
(_player_set_action_result, _convex_hull2d_perimeter; park retired),
0 regressions. _ai_test_line_of_sight park remeasured (size/relocations
unchanged, fuzzy 97.98 -> 97.92).
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.
- _particle_system_update: single state loop with in-loop state
definition, January's 16-bit particle cursor and post-delete next read,
pointer-walk variable lerp, match_assert with January's text/line; the
block-top NULL initializer of transition_state_variables follows the
admitted conditional-initializer form (laws_w2 A10), disclosed
- _load_symbol_table: loop-control flag instead of while(TRUE)/break,
natural fgets loop, per-arm error handling, January statement order
Rejected in review (point_from_line3d COMDAT hold): _infection_swarm_control,
_weather_particle_update_physics. Stable diff vs 9062b1e96: 0 regressions.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Reviewed reconstructions, each strict exact in its whole-TU gate with
zero inherited losses, guard passing and no new owners:
- _actor_move_initialize: short sense-ray index (as the sibling loop)
and direct indexed stores instead of per-iteration pointer aliases
- _decal_sprite_get_bounds: edge-relative (0.0f - registration) extents,
matching the adjacent (x1 - registration - x0) extent spelling
- _search_and_replace: single-exit result instead of an early return
- _projectile_accelerate: rotation axis/magnitude scoped to the spin
block (reopens its park)
Rejected in review: _render_ui_widgets and _render_ui_widgets_postgame
(exact only with duplicated identical should_render arms).
Stable diff vs 9062b1e96: 23 functions gained, 0 regressions; parks 261.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Both come from LAW M8, measured by the corpus-scale x87 study: for the
displacement-0 term of an inlined helper on &x->field arguments, VC7 loads first
the operand with the smaller IL-local ordinal (mod 8), so one real local too many
or too few flips it. The same study proved source operand order is INERT for a
bare product (p->a*p->b compiles identically to p->b*p->a), so the R3 operand
swap was never just inadmissible - it never worked. These fixes change the local
set, not the operand order.
- player_effects _player_effect_start (735, park reopened and removed): the three
field stores relative.i/j/k = dot_product3d(...) become one
set_real_vector3d(&relative, dot, dot, dot) call (laws_w2 A4 helper routing).
The park's criterion - natural same-compiler evidence for the final commutative
operand order - is satisfied by M8.
- actor_moving _actor_get_stopping_distances (449): the `long vehicle_driver_type`
local and its range test become a switch over the two driver enum constants
(M8, plus A9 switch width). Semantics are unchanged: _hovering_ground (2) and
_nondirectional_ground (3) are adjacent in actors.h, so the range and the two
cases select exactly the same values, and the same TU already switches on
actor->input.vehicle_driver_type at line 3190. M8 is the new law that lifts this
row's do-not-repeat tag.
Verified independently of the study: each whole-TU gate changes exactly one row
(residual -> EXACT) with every other exact row intact, the _point_from_line3d
guard passes, player_effects' other two parks are unchanged, and fake_match_scan
reports 0 leads. Full ninja, parks 272 active / 0 stale / 0 invalid, stable diff
vs scratch/opus5-next150-before.json: gained 10 / 8,528 padded, regressions 0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wave w3d batch 1 (the structural retarget: census the frame, the [ebp+/-N] slots
and the relocations before proposing any shape).
- action_vehicle _action_vehicle_evaluate_seat (+976): the unit called
vehicle_specific_definition_get through a C4013 implicit declaration; including
its genuine owner units/vehicle_definitions.h fixes the call, and January's
single-exit shape puts the three seat points in the taken branch's own block
instead of behind an early return.
- input_xbox _input_update_analog_button_state (+48): park reopened and removed.
- effects _effect_allowed_by_environment and _effect_generate_particles: coupled
A8 callee/caller re-baseline, ZERO credit. Both are now January-exact in padded
size (and relocation count for the caller) and stay parked and fuzzy; the
remeasures carry dated evidence in config/parked.json.
Full ninja, parks 277 active / 0 stale / 0 invalid, stable diff vs
scratch/claude250k-start.json: gained 3 / 1,824 bytes, regressions 0; fake scan
0 leads.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
_player_effect_get_screen_flash (800) becomes strict exact by binding
effect->screen_flash to a local definition pointer used six times, which is the
A5 counter-law form: January re-reads the field through one base rather than
re-forming the address at each of the six uses.
particle_systems _particle_system_render is landed as a complete credible body at
ZERO credit (still residual); the rejected _particle_system_update hunks were
removed from the landable. Wave w3c batch 2 (8 groups, 31,392 spendable padded
bytes) produced no other strict gain; the s3tc _RGBToColor/_DecodeBlockRGB reopen
was rejected by the verifier.
Full ninja, parks 280/0/0, stable diff vs scratch/claude250k-start.json:
gained 1 / 800 bytes, regressions 0; fake scan 0 leads.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Packet P6 dependent: #include "bitmaps/bitmaps.h" gives weather_particle_systems.c the genuine rgb_colors_interpolate declaration (CL /Zs /W3 C4013 at HEAD; missing-prototype law A7). With the real_math.h named result, _weather_particle_system_new_particle (704) is strict exact. Full ninja build and stable sweep: 0 regressions.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wave w1 Batch B (adversarially verified, held for config): _particle_system_new_particles (848) exact. The .rdata blob _rdata_0025a6b8 is split into January's HCEX-PDB-named file statics system_update_functions, particle_creation_functions, particle_update_functions and seconds_per_tick (layout and element counts identical; January relocations new_particles+0x2c7 -> +8, update+0xff -> +0, update+0x617 -> +0x14, jet -> _ground_error+4), with the PDB-public ground_error defined here. symbols.json lines edited in place. Full ninja build and stable sweep: 0 regressions.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wave w1 landing, adversarially verified. park reopens: _decal_update. Full build of the combined batch: 54 strict gains / 29,440 padded, 0 regressions, parks 355/0/0. 1 park(s) removed.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Wave w1 landing, adversarially verified. exact: _contrail_scale_random_value. Full build of the combined batch: 54 strict gains / 29,440 padded, 0 regressions, parks 355/0/0.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Natural if/else polarity and result locals; generate_particles park re-measured after correcting its per-instance particle loop to January behaviour (evidence appended). 5 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>