Commit Graph

274 Commits

Author SHA1 Message Date
Ludovic Marie 70992eb815 Document the patrol and raid harness and its scope
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 16:43:32 +02:00
Ludovic Marie 0a1ce1314c Merge branch 'parity-base' into parity/saves 2026-10-11 17:12:11 +02:00
Ludovic Marie d061bdf2fb Share harness passes between worktrees and cap harnesses machine-wide
A pass is keyed by the content of the harness's dependencies, so it is
also valid in any worktree with the same files. Passes are published to
parity-shared/ beside the shared vanilla data, and a worktree adopts one
whose key matches its own files instead of running the harness: an
agent's gate only runs what its own changes affect, instead of the whole
suite from scratch. Every runner on the machine also shares
PARITY_MACHINE_JOBS slots, so several agents' gates can't overload it.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 16:42:52 +02:00
Ludovic Marie 3ab461cffc Upgrade older worlds when Horizon opens them, as 26.3 does
Opening a world saved by an older version runs the file fixes, level.dat and
the DataFixers upgrades of every file instead of refusing it. The save
round-trip harness treats a lit campfire's cooking progress as a timer in the
vanilla views: Horizon saves it as loaded (stage 3 checks it exactly), and it
moves on by however many ticks each vanilla server ran before data get.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 15:44:02 +02:00
Ludovic Marie 13759ef16b Reuse unchanged vanilla oracle runs, and keep test games silent
tools/parity_shim.py stands in for java and javac in harness runs: it
records each oracle run's outputs and the content of every file under the
paths its arguments name, and replays the run while those are unchanged.
After a Rust-only change a harness only pays for its Rust side
(block_update 53 s -> 5 s). A harness that fails while reusing oracle
results is rerun fresh, and stops reusing them if that passes; --all and
--fresh never reuse them.

Harness probes built in the dev profile are optimised (overflow checks
and debug assertions kept), and the chunk generation harness runs its
vanilla and Horizon sides concurrently.

HORIZON_NO_AUDIO keeps the game off the speakers; tools/parity.py sets it,
since the save round-trip harness launches the game on a virtual screen.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 15:43:26 +02:00
Ludovic Marie abee1f165b Let the gate pass with harnesses that already fail on the integration branch
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 15:05:57 +02:00
Ludovic Marie 6396e8c161 Run the vanilla harnesses in parallel, only when their inputs change
tools/parity.py traces each harness (its Python, Java oracle sources and
the Rust sources of the probes it runs, from Cargo's dep-info) and reruns
it only when one of those, the vanilla artifacts or the toolchains change.
Harnesses run in parallel within the available memory, and their probes
build without LTO and with 16 codegen units into .local/parity-target: a
one-line change rebuilds every horizon-world probe in 3 seconds instead of
122. The full suite takes about 20 minutes instead of an hour.

tools/gate.py is the check a branch passes before integration, and
tools/supervise.py manages the per-area worktrees: status, new worktrees,
saving unfinished work, and integrating a branch only when the gate passes.

Harnesses find probes through lab.cargo_target() instead of a hard-coded
target/, the save round-trip harness builds the binaries it launches, and
the mob AI harness now fails on divergences like every other harness
(--report-only keeps the old behaviour). Debug builds keep line tables
only, so worktrees stay small.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 15:05:36 +02:00
Ludovic Marie 24a58c40d8 Query the shipped vanilla bytecode through REA
tools/rea_vanilla.py runs REA's JADX provider over the pinned client and
server JARs: class search, class members, method bodies and callers
(including lambdas). REA and the JADX engine are pinned in
research-lock.json.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 14:08:47 +02:00
Ludovic Marie f58413cbbf Random-tick only sections holding randomly ticking states
The client random-ticked every section with a non-air block, drawing
getBlockRandomPos positions vanilla never draws. It now ticks a section only
when its palette holds a randomly ticking state, as
LevelChunkSection.isRandomlyTicking does (lava counts through LiquidBlock).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 20:02:40 +02:00
Ludovic Marie 0548179661 Merge worktree-agent-a3f604d3c8055fe6e 2026-10-10 10:08:35 +02:00
Ludovic Marie 03e7c7fd64 Merge main into the save roundtrip work
Brings main's sync_level()/save_game() split and the world ticks inside
`if running {}` into the typed block entity NBT, save roundtrip harness and
session.lock work. The only textual conflict was in recipe_book.rs, where
the player file writer keeps main's toBeDisplayed list alongside the
recipes list. fmt, clippy -D warnings and the whole workspace test suite
pass.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-10 09:52:51 +02:00
Ludovic Marie 2758614c49 Merge worktree-agent-aadb889c2eebe6c5b 2026-10-10 09:31:28 +02:00
Ludovic Marie 26a369b76d Document the whole-chunk differential harness and its results
Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-10 09:18:54 +02:00
Ludovic Marie 1ec6f0f928 Match vanilla save omissions and refuse old DataVersions
The vanilla differential run showed Horizon writing fields vanilla leaves out: empty scoreboard parts, recipe book settings at their default, an empty warden anger list. These are now omitted, and mobs loaded without saved equipment no longer receive the default bow. Opening a world whose level.dat is older than 26.3 now fails with a message naming tools/upgrade_world.py, which runs vanilla's own forceUpgrade on a copy. The roundtrip harness lists the timing-dependent differences it tolerates, and horizon-ctl waits up to five minutes for the control socket on a loaded machine.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-10 08:05:35 +02:00
Ludovic Marie 88efc73ac1 Mesh biome tints through the zoomed biome and honour lighting options
The section mesher blended biome colours over quart cells at the section's
mid-height. It now follows ClientLevel.calculateBlockTint: each tinted block
averages the colours of the biomes BiomeManager picks (the eight-corner
zoom with the client's hashed seed) over the biomeBlendRadius square at the
block's own height, computed lazily per layer and column. The ao and
cutoutLeaves options are honoured too: flat lighting, skipped faces between
opaque leaves and a vertex layer flag that makes the terrain shader ignore
leaf alpha.

The section mesh parity gate gained biome-blend scenes (random zoom seeds,
radii 0 to 7, all 67 biomes, real Biome colour resolvers through a
BiomeManager in the Java oracle) and option scenes; all 1.0M quads of the 112
scenes match the client.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-09 13:52:25 +02:00
Ludovic Marie 2b4982ab4c Merge remote-tracking branch 'origin/wip/parity-render' into t3/minecraft-parity
# Conflicts:
#	crates/horizon-client/src/containers.rs
#	crates/horizon-client/src/entity.wgsl
#	crates/horizon-client/src/game.rs
#	crates/horizon-client/src/game/control.rs
#	crates/horizon-client/src/gfx.rs
#	crates/horizon-client/src/lib.rs
2026-10-08 23:19:58 +02:00
Ludovic Marie 445a3ec4f2 WIP snapshot: unfinished blocks parity work (paused mid-task, may not build)
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 21:40:00 +02:00
Ludovic Marie 26858f039d Note meshing cost in the section meshing parity doc
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 15:43:25 +02:00
Ludovic Marie ece28615a7 Document the section meshing parity gate
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 15:40:42 +02:00
Ludovic Marie 3d070a6bf2 Point Java pack instructions at local builds after removing releases
GitHub releases were deleted; the Mac starter and packs are built with
tools/build_release.py instead of downloaded.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 11:56:41 +02:00
Ludovic Marie 77f9c075ca Add a control socket and horizon-ctl to drive the client from scripts
`--control` opens a local Unix socket; horizon-ctl sends text commands and
prints JSON replies. Scripts can read status, press keys and mouse buttons,
look, teleport, give items, change render distance, take PNG screenshots
of the presented frame, and benchmark frame times without a person at the
keyboard. Under control, losing focus no longer pauses the game.

Key presses and play-screen mouse buttons move into shared methods so the
window and the socket take the same paths.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 11:42:52 +02:00
Ludovic Marie 34f4722e42 Show audited Java parity in the README and correct stale status
Score fourteen subsystems against the code (55% overall) and test that the
README percentage matches the table. Fluids, redstone, crop growth and the
Nether already run in the client; the native-client status still described
the old test-generator terrain without mobs or containers.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 11:21:53 +02:00
Ludovic Marie be1352b4dc Target ludodesktop only and drop the M2 Mac from scope
The Rust rewrite now targets one Linux machine (Ubuntu 26.04, i7-13700KF,
RTX 4080, GNOME on Wayland). macOS and Windows are out of scope; the Java
packs, including the Mac starter, remain available but are no longer developed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 11:18:30 +02:00
Ludovic Marie 08b8e71838 Drop Windows from scope and add a native client packager
Horizon now targets Linux and macOS only: remove the Windows CI runners and
wgpu's DX12 backend, and update the scope docs. The Ubuntu RTX 4080 desktop
becomes the first physical Linux target. tools/package_native_client.py bundles
a release build with its prepared resources and a launcher for playing on
another machine of the same platform.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-08 10:48:58 +02:00
Ludovic Marie a13799e042 Add title screen with world selection and creation
The game opens on a vanilla-style title screen (logo, Singleplayer,
Quit) over the spinning title panorama. Select World lists saves by
last play with game mode; Create New World takes a name, a seed
(numbers or text hashed like vanilla) and the game mode, and finds a
free folder name. Save and Quit returns to the title. README and the
parity status now describe the playable Rust game.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-08 01:44:42 +02:00
Ludovic Marie 3777c9009b WIP: playable client — streaming world, lighting, HUD, crafting, saves, audio, items
Checkpoint of the playable client rewrite before build verification.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
2026-10-07 23:24:14 +02:00
Ludovic Marie 082cbb4077 Apply pending player attribute callbacks during resident simulation
Refresh scale dimensions and clamp health and absorption after movement, preserving native callback order and queued synchronization. Replay per-reference JVM identities in the scene comparison and cover changing limits, modifiers and low tunnels. Waypoint callbacks remain explicit requests for the future manager runtime.
2026-10-07 18:27:58 +02:00
Ludovic Marie 4e01780255 Validate resident crouching, pose dimensions and ledge backoff
Connect Shift input timing, dry pose fit, movement slowdown and eye height to the resident walking scene. Compare exact evolving state against pinned native client/server methods and record Linux window validation. Full gameplay and release acceptance remain unfinished.
2026-10-07 18:15:56 +02:00
Ludovic Marie 24ce21abee Connect native-validated sprint input to resident movement and hunger 2026-10-07 17:55:29 +02:00
Ludovic Marie ecb3ebfd34 Account for accepted movement distance in resident player hunger 2026-10-07 17:29:13 +02:00
Ludovic Marie 5023f82078 Record interactive hunger recovery validation 2026-10-07 17:16:58 +02:00
Ludovic Marie 3403705c74 Bind resident player hunger, regeneration and starvation to live health 2026-10-07 17:14:57 +02:00
Ludovic Marie c82f0ee8be Apply native-validated landing damage to resident player health 2026-10-07 16:56:23 +02:00
Ludovic Marie 7a0d413b44 Bind player health and combat to live attribute storage 2026-10-07 16:26:45 +02:00
Ludovic Marie 5eb1d61e3a Bind native landing and fall callbacks to the resident player scene 2026-10-07 16:20:23 +02:00
Ludovic Marie 59676c6e84 Connect native-validated player motion to fixed-rate walking controls 2026-10-07 15:45:47 +02:00
Ludovic Marie 40a9f04f42 Preserve attribute state during dry movement ticks 2026-10-07 15:30:41 +02:00
Ludovic Marie 405e174e64 Bind stored player motion to resident chunks and live attributes 2026-10-07 15:15:57 +02:00
Ludovic Marie c109f91cc5 Connect resident client chunks to native-validated world collisions 2026-10-07 14:42:44 +02:00
Ludovic Marie f249a55f35 Synchronize registered effect particles, invisibility and glowing state 2026-10-07 14:19:54 +02:00
Ludovic Marie 4a2fcedbd3 Bind registered attribute refresh to native entity update consequences 2026-10-07 13:51:15 +02:00
Ludovic Marie 794b447b0c Bind live registered attributes to health and hunger calculations 2026-10-07 13:27:16 +02:00
Ludovic Marie 2339ed4ccb Verify live registered attributes against both vanilla JARs 2026-10-07 13:22:28 +02:00
Ludovic Marie b70806176e Preserve attribute query fallback, caches and captured base reset targets 2026-10-07 12:53:20 +02:00
Ludovic Marie 55846d2fc0 Bind entity effect notifications to concrete attribute maps and queues 2026-10-07 12:38:24 +02:00
Ludovic Marie 76b3bdc237 Bind effect modifiers to lazy attribute instances and native dirty queues 2026-10-07 12:23:28 +02:00
Ludovic Marie 6a33b0c148 Match effect attribute templates and permanent modifier callback ordering 2026-10-07 12:07:19 +02:00
Ludovic Marie 11dda868af Validate live object-map entries and callback traversal against vanilla 2026-10-07 11:52:45 +02:00
Ludovic Marie 636f1648f0 Bind attribute refresh to health limits and waypoint update ordering 2026-10-07 11:39:35 +02:00
Ludovic Marie a772a69498 Match effect eligibility and attribute/passenger notification ordering 2026-10-07 11:31:39 +02:00