Commit Graph
162 Commits
Author SHA1 Message Date
Madison eabb888079 Vendor sfvr into the guest build (headset-unverified)
port/third_party/sfvr is a copy of ~/code/sfvr's include/ and src/ (VERSION
holds its commit, ad2f545), never edited here. The VR guest build compiles
its six .c files for the ILP32 guest with the project's ABI flags (and
-Wall -Wextra, which they pass clean); nothing uses them yet.
2026-10-02 18:10:10 +09:00
MadisonandClaude Opus 5.5 972e17d78b Launch from the Steam library; the refresh rate follows the headset
The build is registered on the Frame as a Lepton devkit title, HaloCEVR,
which deploy.sh keeps up to date, so the game starts from the Steam
library without the Mac. SteamVR offers an app only the rate its display
setting is on, so vr.refresh_rate takes the highest offered at or below
it; the docs say where to set 90 Hz.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 11:49:08 +09:00
MadisonandClaude Opus 5.5 3209310552 Fix the first headset session's findings
- The main menu's scene stays on the flat screen behind its menus,
  rather than going stereo with the menus head-locked.
- The HUD layer was invisible: the game's HUD never writes alpha, which
  it keeps as scratch. Its copy into the layer now makes each pixel as
  opaque as it is bright (premultiplied, OpenXR's default).
- The right stick's up and down reach the game again while the head
  aims (the head still sets the facing each frame), so the first level's
  look test, which watches the stick, can pass.
- vr.timing logs where a frame's time goes ([vr-frame]); vr.timing_gpu
  waits for the GPU before each frame to time it apart.
- deploy.sh: macOS's rsync has no --info.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 10:04:35 +09:00
Madison d3f151eddd Merge remote-tracking branch 'upstream/main' 2026-10-02 09:46:47 +09:00
MrBruh 0182da8172 Add high-res text and OpenCE titles 2026-10-02 13:39:17 +13:00
MadisonandClaude Opus 5.5 ff7365b5d5 Package the OpenXR loader with the VR build only
It is staged in build/android/jniLibs-vr, which only the vr flavour
packages, instead of beside the flat build's libraries.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 09:35:43 +09:00
MadisonandClaude Opus 5.5 b27d74ad97 Keep the VR build's data in the headset's Documents, and deploy tools
Lepton's app storage goes with a container reset; the headset's
Documents folder (Android's /sdcard/Documents) stays. The VR build
prefers game data in Documents/HaloCE, with its settings and saves
beside it.

tools/steam_frame/extract_maps.py copies maps out of a disc image on the
Mac (as port/linux/src/xiso.c reads it); deploy.sh copies them to the
headset over SSH, edits config.toml settings, installs and starts the
app over Lepton's adb.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 09:28:58 +09:00
MadisonandClaude Opus 5.5 0b489d5e93 Add an OpenXR session for the Android VR build
configure.py --vr builds com.halo.decomp.vr: the host gains host_xr.c,
which owns the Khronos loader (1.1.63, fetched from Maven Central and
checked by SHA-256), the instance, a GLES session on the game's EGL
context, two eye swapchains and a quad, and controller actions for the
Steam Frame, Touch and Index profiles. The guest drives it through seven
imports (host_imports_vr.list) with fixed-layout structures in
halo_android_abi.h, checked on both ABIs.

vr.probe_seconds shows dim colours in each eye before the game starts.
On the Steam Frame (Lepton) it reaches SYNCHRONIZED and holds 72 frames
a second; the Frame controller profile binds.

SDL3's Java side assumed a clipboard service, which Lepton lacks; a
patch (port/android/patches) applied at configure time checks for it.
The update provider's authority follows the application id, so the
flat and VR apps install side by side.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 09:16:14 +09:00
MadisonandClaude Opus 5.5 3248edd149 Build the Android port on macOS
The NDK's host prebuilts live under darwin-x86_64 on a Mac (universal
binaries), and the case-insensitive file system made StdDef.h include
itself instead of musl's stddef.h; include_next skips this directory.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-02 09:06:08 +09:00
MrBruh bd8ec3c798 Add high-res sniper ladder and fix meter fringes 2026-10-02 02:09:45 +13:00
MrBruh 4799980e8a Draw the whole HUD in high resolution 2026-10-02 01:24:38 +13:00
MrBruh f8937c6179 Add high-res HUD textures 2026-10-01 22:33:25 +13:00
MrBruh a3ed50c56d Remove the lockstep netcode 2026-09-30 22:12:05 +13:00
MrBruh 4adc3a87a5 Remove matching tooling and HALO_LINUX ifdefs 2026-09-30 21:49:46 +13:00
MrBruh a17d89c6f1 Merge bnunu/halo-1 main 2026-09-30 18:13:05 +13:00
Jonas Volman 6bfd956737 Reconcile approved Halo fidelity packets and bounded data credit
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.
2026-09-29 13:52:37 -07:00
Jonas Volman f3aadeab98 Reconcile five Halo functions and approved declaration batches
Integrate coherent B3, P2/K17 prerequisites, completed K1-K16 + S, and the independent profile/effects rulings. Five gains and two explicitly approved B3 debits: net +3 strict functions, +2770 meaningful/+2800 padded bytes (+2774 progress credit). No additional losses; Halo objects 394 to 396 and data unchanged.

Clean rebuild, identical 8252-row stable sweep, 68 valid parks, admission/provider checks, 467-unit warning comparison, unchanged fake scan, and 1318 tests passed. Preserve canonical helper recoveries and unrelated work. Full evidence and disclosures in docs/object_matching_logs/astra_five_function_reconciliation_20260928.md.
2026-09-28 23:17:10 -07:00
MrBruh caa249457a Install Android maps from a disc image 2026-09-29 15:01:08 +13:00
MrBruh a643adea30 Add UPnP for internet play 2026-09-29 14:23:21 +13:00
MrBruh 3c9cd59c1b Add Android app icon 2026-09-29 03:09:03 +13:00
MrBruh 8994176637 Add auto-updater 2026-09-29 02:51:49 +13:00
MrBruh b7874714ae Deterministic FP math 2026-09-28 19:56:00 +13:00
MrBruh a0b2150748 Extract maps from xiso 2026-09-28 19:01:23 +13:00
MrBruh 16514a13d1 Add internet play 2026-09-28 17:42:22 +13:00
MrBruh 8d60161ec7 Add CI builds 2026-09-28 14:45:26 +13:00
MrBruh d9b12fd42e Replace the XDK with clean headers 2026-09-28 13:50:57 +13:00
Jonas VolmanandClaude Opus 5.5 d7c5c52411 Reconcile reviewed Q11 extent verifier without credit
PB from dccd2e95, including coverage/substitution hardening. Current canonical independent 910-section and20-provider review passed; existing report unchanged without new entry. Full build/stable/parks/admission clean; 1318 tests,5 skipped,100 subtests. Scorer remains pinned3.3.1; no actions credit.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 16:25:38 -07:00
Jonas VolmanandClaude Opus 5.5 baab1f8efa Reconcile Q11 grouped-data regression gate without credit
Owner-approved PA+PC from c32e53c2. Independent current-object review and negative controls passed. Full build, stable sweep zero gains/losses, parks/admission unchanged; 1199 tests pass. Extent credit and verifier are separate commits.

Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-27 16:22:34 -07:00
MrBruh f7ee09b8e3 Move settings to config.toml 2026-09-27 23:56:37 +13:00
MrBruh 50eae19bac Native resolution fullscreen with F11 toggle 2026-09-27 20:42:09 +13:00
MrBruh 755f610025 Fix 128-player multiplayer issues 2026-09-27 18:17:24 +13:00
MrBruh 193ab12a2f Merge branch 'halo-ce-universal/players-128' of https://github.com/bnunu/halo-1 2026-09-27 17:35:31 +13:00
MrBruh 658211a88f Improve performance by 2x to 3x 2026-09-27 16:40:58 +13:00
Jonas VolmanandClaude Opus 5.5 cc86f2c50f Tools: stand-in machines for testing large system link sessions
tools/system_link_bots.py joins a native-build host with many lightweight
machines, each with one player, speaking the system link protocol directly:
join, settings (reassembling the fragmented record), player, map precached,
loaded, then a UDP input message each tick that acknowledges the host's
updates, as a real client keeps a lockstep game running. Each machine binds
its own loopback address (127.0.0.2 and up), since the host tells machines
apart by address.

    python tools/system_link_bots.py --machines 127 --start

fills a 128-machine session on the host at 127.0.0.1 and starts it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-09-26 10:18:07 -07:00
MrBruh 13d1ae224f Re-enable SIMD on Windows 2026-09-26 23:58:11 +12:00
MrBruh 95881a5f91 Replace port assembly with C 2026-09-26 23:56:21 +12:00
MrBruh 5fb655c7c1 Add release build option 2026-09-26 20:24:34 +12:00
MrBruh c1fa519662 Avoid hitting floating point precision error on Windows platform 2026-09-26 19:26:51 +12:00
MrBruh f48d125d1a Port decomp to Windows 2026-09-26 18:10:34 +12:00
MrBruh e29125b50e Port decomp to Android 2026-09-26 16:16:00 +12:00
MrBruh ebb0eac50b Port decomp to Linux 2026-09-26 12:15:09 +12:00
Jonas Volman 9fcd8b23b7 Document periodic builder C2 breakpoint negative 2026-09-24 16:46:18 -07:00
Jonas Volman 20dd67c063 Add isolated Xbox link probe and repair private helper ownership 2026-09-24 13:27:04 -07:00
Jonas Volman 641e146696 Reconcile dynavobgeom owner types and count fastcall functions 2026-09-23 20:54:37 -07:00
Jonas Volman 5019c1861a camera: recover private editor state and three exact functions 2026-09-23 16:51:11 -07:00
Jonas Volman 95db66d0a1 Close five library objects with verified source and ownership 2026-09-23 04:45:53 -07:00
Jonas Volman 4f4c85021d Reconcile Lane C with canonical house-rule audit
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.
2026-09-22 23:12:40 -07:00
Jonas VolmanandClaude Opus 5 29d5a43e9e Add residual_triage.py and the corrected Lane A ranking
The old ranking was wrong in a way that buried the cheapest work. alndiff's
region count systematically OVERSTATES the closest functions, because it counts
pure addressing noise as divergence: relocation-target spelling, the relocation
SITE address (which shifts whenever anything upstream changes length), branch
immediates, and trailing alignment NOPs. relocdiff scores all of those `=`.

Stripped, the picture changes completely:

  _actor_path_refresh                          12 reported ->  0 REAL
  _actor_look_idle_find_prop                   16 reported ->  1 REAL
  _actor_perception_friend_prop_is_attacking    3 reported ->  1 REAL
  _actor_situation_update                      23 reported ->  2 REAL

residual_triage.py puts frame, reference multiset, real code end and REAL
regions in one row per residual and ranks cheapest-first. It takes a directory,
so bare it covers all of source/ai (51 residuals, 96,032 bytes); the committed
table is Lane A's eleven units (30 residuals, 75,392 bytes).

The top of the table is a cluster of eight functions at three or fewer real
regions, about 8,200 bytes. Two had never been probed and are decoded in the
write-up:

  _actor_path_refresh (1,440 B, 0 real regions) - the whole residual is THREE
  branches at 4 bytes each. January encodes them short to the NEAR copy of the
  return epilogue; we encode near to the FAR copy 0x267 bytes back. Both copies
  exist in both builds, only the binding differs. Source site at
  actor_moving.c:2064 and a suggested lever recorded in scratch.

  _actor_look_idle_find_prop (608 B, 1 real region) - January emits
  `cmp ebx, dword ptr [_ai_debug+0x38]`, we emit a load then a compare. The
  source is already the natural form at both of its sites and the split appears
  where the scheduler fills an fcos latency gap, so it is instruction selection
  under x87 scheduling. Also 3 bytes short overall, so a branch-width difference
  is hiding behind the normalisation.

Also decoded and recorded: _actor_situation_update (2 real regions, one
five-instruction block January places out of line and we place inline) and
_actor_perception_friend_prop_is_attacking (1 real region, an AL/CL
two-colouring; three guard spellings measured, all dead).

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-20 15:48:05 -07:00
Jonas VolmanandClaude Opus 5 cd4e525025 Sharpen real_regions.py: strip every address, and name what it still hides
Found the tool's own blind spot by using it. It compared relocation SITE
addresses (`rel+0x...`) and branch immediates as if they were content, so any
upstream length change made every downstream row look like a divergence.
_actor_path_refresh read 9 REAL regions when its instruction text is in fact
identical throughout.

Now stripped: the row address, the relocation-target spelling, the relocation
site address, and branch/call immediates. Trailing alignment filler is counted
separately instead of appearing as a twelve-NOP "deletion". Output splits into
REAL / addressing-only / padding-only.

  _actor_path_refresh                          12 reported ->  0 REAL
  _actor_perception_friend_prop_is_attacking    3 reported ->  1 REAL

And the caveat is now in the docstring rather than left to be rediscovered:
normalising a branch immediate also hides SHORT vs NEAR encoding, which is a
real byte difference. `0 REAL` means every instruction's TEXT matches, NOT that
the function is exact. _actor_path_refresh is the worked example - content
identical, our encodings about 12 bytes longer, January's 12 trailing NOPs
absorbing it into the same section size. `0 REAL` plus a padding-only region
means the gap is encoding length: go compare where real code ends.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-20 15:40:50 -07:00
Jonas VolmanandClaude Opus 5 f9d9a63768 Add real_regions.py: alndiff's region count overstates the closest residuals
alndiff prints a region whenever its two normalized instruction texts differ,
and that includes a pure PRESENTATION difference in how the two objects spell a
relocation target - `target=symbol:__real@0` against
`target=defined-noncode:.rdata:__real@0`. Same address, same type, same target;
relocdiff --allow-structural scores that row `=`. It is not a divergence.

Over the Lane A AI portfolio, 86 of 860 reported regions (10%) are that noise -
but it is not spread evenly. It is concentrated on exactly the functions that
are CLOSEST, where the ratio is worst:

  _actor_perception_friend_prop_is_attacking    3 raw ->  1 real
  _code_00039990                               11 raw ->  2 real
  _ai_communication_get_player_rating          12 raw ->  2 real
  _actor_emotion_update                        12 raw ->  3 real
  _ai_communication_actor_talk_weight           9 raw ->  3 real
  _actor_perception_update                     30 raw -> 14 real

A function reported at "12 regions" that is really at 2 is one a triage pass
will wrongly deprioritise, so this systematically hides the cheapest work.

Read-only, recompiles nothing, runs in no build step. --show prints the
surviving regions so you can go straight to the real divergence.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-20 15:37:59 -07:00