Commit Graph

94 Commits

Author SHA1 Message Date
Cosmic 504a70c062 Add an opt-in Cull Leaves graphics setting 2026-10-16 00:12:45 +02:00
Ludovic Marie 48c85fa19f Add tools/pr_ready.py, CONTRIBUTING.md and a pull request template
pr_ready is the one self-check to run before asking for review: from the
files a branch changes it runs rustfmt, clippy with warnings denied, the
tests of the touched crates (mapped through cargo metadata), the launcher's
own workspace when it is affected, the tokens.css check, the Cargo.lock
rule, the Python tests and the public-tree check, and the vanilla harnesses
the change can affect, picked by tools/parity.py exactly as CI's parity job
picks them. It runs locally or on a fleet machine through ~/fleet/rbuild;
on the Mac mini the harnesses use the parity runner's own workspace and
scripts. It prints one Markdown block for the pull request body and exits
non-zero on any failure.

tools/parity.py gains --changed-files for copies without Git history, and
tools/ci/vanilla-data.sh accepts the preparation key from outside.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 01:13:39 +02:00
Ludovic Marie 8a95aa79a7 Website and README: the round-2 menus and launcher screenshots
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 00:08:40 +02:00
Ludovic Marie cd39680534 Show the new launcher and menus on the website and in the README
The README banner is redrawn in the new design (docs/media/banner.html), and the launcher and
menu screenshots (README and website) are the restyled ones. The website's launcher section
gains a Launcher tab: its screenshots no longer show the old background, whose licence was
never confirmed.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-15 00:08:40 +02:00
Ludovic Marie e145a32322 Merge pull request #120 from ludovic111/feat/controllers-input
Controllers: design note, gilrs input layer and gameplay
2026-10-14 18:40:10 +02:00
Ludovic Marie b7330ac0cc Controllers: gilrs input layer, in-game movement, camera, actions and hotbar
Vanilla 26.3 has no gamepad input, so this is Horizon's own, on Bedrock's
default layout (docs/controllers.md). gilrs reads the pads; the pure part
(bindings, radial deadzones, the look curve, button edges, the
horizon-controller.txt settings file) is in gamepad.rs with unit tests.

Buttons act as the vanilla key mapping they're bound to, through the same
path a rebound keyboard key takes (the keyboard's post-rebinding handling
moves into Game::mapped_key). The left stick is an analog move vector,
the right stick turns the view per frame, LB/RB step the hotbar, B and
Start leave screens and A respawns. horizon-ctl pad injects a virtual pad.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:15:40 +02:00
Ludovic Marie 8355a6ff14 horizon-prepare sounds: the sound copy in Rust, run by the launcher
tools/fetch_sounds.py (and the lab.py functions it used) becomes
`horizon-prepare sounds` (horizon_prepare::sounds): the pinned asset index,
sounds.json and every .ogg from the player's own launcher install, each SHA-1
checked, into .local/horizon-client/<version>. The launcher runs it as part of
Prepare (in-process, the version's own binary when its sources differ and it
knows the subcommand, in-process for older versions), and a launcher install
without the assets only logs that the game will be silent. Player docs no
longer mention Python for sound.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:10:34 +02:00
Ludovic Marie a995fd3b46 Prepare with horizon-prepare: launcher, release folders, messages and docs
The launcher prepares a version in-process when it ships the preparer sources
the launcher was built with, with the version's own horizon-prepare when they
differ, and with the Python script only for versions made before it. Release
folders ship horizon-prepare and its sources; resources are reused between
versions with the same preparer. The game's messages, PLAY.txt, the docs and
release builds name horizon-prepare, and tools/prepare_native_client.py is a
wrapper of it for the development tools.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 16:29:33 +02:00
Ludovic Marie 71cee5279c Remove the roadmap from the README, the website and the launcher
The README keeps the parity table, and its known differences move to a
Known issues section. The website drops the What's next section and its
nav links, and no longer fetches or requires a Roadmap section. The
launcher drops its What's next page, `next` subcommand and `roadmap`
MCP tool.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-14 02:18:29 +02:00
Ludovic Marie 6716b0d953 Docs: agent control with horizon-ctl and its MCP server
README gets an Agent control section (out of the roadmap: it's done), the
native client guide describes every command group, the blocking semantics,
exit codes, launch discovery, MCP and the two transports, and PLAY.txt tells
release players about horizon-ctl.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 21:59:35 +02:00
Ludovic Marie 22756c28d8 README: retake the launcher's Play page, prepared and ready
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 21:07:17 +02:00
Ludovic Marie f0be91777f README: a new banner, current screenshots, what changed in v2026.10.13.1
- A banner in the website's design (Instrument Serif wordmark over a dimmed
  sunset, purple accent), rendered from docs/media/banner.html with Playwright.
- Screenshots of Horizon's own menus and graphics settings, the in-game scenes
  as WebP (from the website's media), and the launcher 0.1.3 Play and Patch
  notes pages; the JPEGs the README no longer uses are removed.
- A "What changed" section matching the v2026.10.13.1 release notes.
- Download only through the launcher (playhorizon.dev or launcher-v releases).
- Roadmap: performance optimisation, mod support and agent control.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 21:07:17 +02:00
Ludovic Marie 1c0a47e012 Website: playhorizon.dev in the README, docs, PLAY.txt and the launcher (0.1.3)
links.json gains a website key; the launcher shows a quiet Website link under
Join Discord and lists it in the links CLI command and MCP tool.

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
2026-10-13 20:35:22 +02:00
Ludovic Marie 27a32cc30d README: parity is what the harnesses check, until the final audit
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:17:34 +02:00
Ludovic Marie 8cdec2c8d9 Tidy the repository now that parity is reached: launcher-first README, docs index, research leftovers removed
Removed (each unreferenced by code, workflows, tests or living docs; no harness
dependency record names any of them, and parity.py --list still finds all 281):
- 22 one-off write-ups of the Java-pack experiments in docs/: adaptive-terrain,
  client-graphics-smoke, compact-headers, core-performance, culling-empty,
  culling-rays, debounce-queue, dispatch-retry, foreground-first,
  graphics-api-comparison, heap-budget, mac-first-test, optimization-plan,
  playable-validation, quad-reuse, server-graphics-context, shader-world-smoke,
  terrain-measurements, terrain-position, terrain-read-wait, tick-membership,
  worker-pacing. Their findings are folded into one paragraph of java-packs.md.
- 24 benchmarks/ observation dumps only those write-ups linked (client graphics,
  culling, queues, heap, Mac Vulkan, shader worlds, software identity, and the
  unlinked rust-core, rust-worldgen-2026-10-05, rust-native-client and
  rust-cuboid-model-decoding runs), plus 12 unlinked files inside kept
  report folders. The scoped-parity reports the living docs cite stay.
- debug/: one server log from a chunk investigation.
- The manual macos-shader-research and macos-vulkan-research workflows.
- tools/logs/latest.log, an empty log committed by accident (now ignored).

Kept: research-lock.json (parity.py, packaging, the launcher and datafix read
it), the Java-pack how-tos (vulkan, collectors, profiling, process-memory,
tick-state) and tools/test_client_graphics.py (ci.yml runs it).

README: leads with what Horizon is and "Download the launcher" (the
launcher-v* releases; the launcher updates itself), then build from source
for developers. Direct game downloads and PLAY.txt steps for players are gone;
the launcher has its own section with two screenshots. The roadmap merges the
known differences, the final checks and the plans after parity, under the
"Roadmap" heading the launcher's What's next page reads. The parity table and
its 100%-of-what-the-harnesses-compare note are unchanged.

docs/README.md indexes what remains: build and run, parity (status and
workflow), world generation, world data and simulation, the old Java track.
Links to the removed pages and README anchors are fixed.

packaging/PLAY.txt now speaks to players who came through the launcher and
points anyone with a bare archive to it, keeping the manual steps short.

The launcher's README link points at main instead of the launcher branch.
.gitignore: tools/logs/ and .DS_Store. No code behaviour changes; the compiler
and clippy flag no unused code and the tree has no stale TODOs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 14:16:55 +02:00
Ludovic Marie b279705c8d README: every subsystem matches vanilla in its harnesses (100%), audit and launch checks next
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 07:18:24 +02:00
Ludovic Marie 8a13322143 README: the resource pack screen and the chat input match vanilla
Assets and Menus score 1; Java parity is 93%.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 06:28:53 +02:00
Ludovic Marie 41c4f2247e Merge branch 'parity-base' into parity/menus-golem 2026-10-13 04:48:24 +02:00
Ludovic Marie 8976bd37d4 Select resource packs as vanilla's PackSelectionModel does, compared with vanilla
horizon_client::packs::SelectionModel ports PackRepository's selection and
PackSelectionModel (default positions, fixed and required packs, moving up
and down, commit), and the pack screen uses it. The new pack_selection
harness drives vanilla's model and Horizon's through 4,000 random action
sequences; every state matches.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 04:47:36 +02:00
Ludovic Marie ab0d708f87 Merge branch 'parity-base' into parity/menus-golem 2026-10-13 03:43:32 +02:00
Ludovic Marie 4093112bb6 Update the README for player skins, the focused chat and copper golem sorting
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 03:43:32 +02:00
Ludovic Marie 9ac6d665fb Merge branch 'parity/rendering-gaps' into parity-base 2026-10-13 03:32:19 +02:00
Ludovic Marie 085cca6aa4 Merge branch 'parity/rendering-gaps' into parity-base 2026-10-13 03:02:44 +02:00
Ludovic Marie 8dc1859369 Merge branch 'parity-base' into parity/spawn-gear
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 03:02:28 +02:00
Ludovic Marie 5e48972bff README and docs: the recipe book's drawing, the loom's banner preview and End gateway beams match vanilla
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 02:26:40 +02:00
Ludovic Marie 0425843aa8 Note finalizeSpawn's parity in the README
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 00:50:50 +02:00
Ludovic Marie c1e4758d04 Finish loading at render distance 2
Streaming kept, decorated and generated chunks within circles a fixed
margin wider than the render distance, but finishing a chunk needs its
3x3 neighbours decorated and theirs generated: squares whose corners
fall outside those circles. At render distance 2 the corner chunks around
the player never finished, so their neighbours never lit and the player
was never placed. Each step now also keeps what a finished chunk's
neighbourhood needs.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-13 00:03:47 +02:00
Ludovic Marie 4b93509137 Note the render distance 2 loading hang, and run harnesses here by default
The Mac mini and ThinkPad no longer keep the shared vanilla data, so the
other machines are opt-in again.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 19:50:58 +02:00
Ludovic Marie 6fab5eb279 Merge branch 'main' into parity-base
# Conflicts:
#	README.md
#	crates/horizon-client/src/game.rs
2026-10-12 19:02:09 +02:00
Ludovic Marie 2f0ff87295 Describe what is new and the 88% parity audit in the README
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 19:00:32 +02:00
Ludovic Marie 14bff2518f Merge branch 'parity/raids' into parity-base
# Conflicts:
#	README.md
#	docs/rust-parity.md
2026-10-12 17:50:53 +02:00
Ludovic Marie c195cd3239 Merge branch 'parity/tablist-border' into parity-base
# Conflicts:
#	README.md
#	crates/horizon-client/src/lib.rs
#	docs/rust-parity.md
2026-10-12 17:50:31 +02:00
Ludovic Marie 69b191b1f4 Merge branch 'parity/loom-crafter' into parity-base
# Conflicts:
#	README.md
#	crates/horizon-client/src/game/dispense_fixture.rs
#	docs/rust-parity.md
#	mods/horizon/src/test/java/dev/horizonlab/parity/VanillaDispenserOracle.java
2026-10-12 17:48:44 +02:00
Ludovic Marie b6fa612bee Merge branches 'parity/tooling', 'parity/score-subtitles' and 'parity/block-followups' into parity-base 2026-10-12 17:47:58 +02:00
Ludovic Marie e5dc127ab2 Document scoreboards, teams and subtitles and their harnesses
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 17:39:55 +02:00
Ludovic Marie 05228e0fe2 Document the loom, crafter and recipe book harnesses
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 17:39:45 +02:00
Ludovic Marie 8f80f8decf Document block entity removal, immediate drops and copper golems
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 17:33:49 +02:00
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 95c7e7ad2a Document the player list and world border parity harnesses
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 16:08:40 +02:00
Ludovic Marie fd79addba4 Merge branch 'parity/saves' into parity-base 2026-10-12 14:06:53 +02:00
Ludovic Marie b3b6194a91 Add the plans for after the rewrite to the README roadmap
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 02:49:42 +02:00
Ludovic Marie 6fdd7f3bd7 Add the Horizon logo, banner and in-game screenshots to the README
An original logo (a sun setting behind a blocky horizon), a banner and a social
preview card, and six screenshots captured in the Rust client. The README opens
with badges, a short pitch and a gallery; a test keeps the parity badge in step
with the subsystem table. Packaged builds use the logo as their menu icon.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 02:47:52 +02:00
Ludovic Marie 83bcfb15af Docs: professional README and no personal details
Restructure the README around what Horizon is, its status, how to build it
from your own copy of the game, and its parity table. The Java performance
pack material and the research lab notes move to docs/java-packs.md and
docs/research-lab.md. The target platform is stated generically instead of
naming a machine, the stale list of missing mobs is dropped in favour of the
audited table, and the legal notice follows Mojang's usage wording.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 02:14:10 +02:00
Ludovic Marie 37898e856b Build from the user's own copy of the game instead of downloading it
Horizon no longer fetches anything of Minecraft from Mojang's servers. The
client jar, version JSON, libraries and assets come from the user's official
launcher install, and the server jar is one they downloaded themselves
(--server-jar or HORIZON_SERVER_JAR). Every file is checked against checksums
pinned in research-lock.json, and the prepared .local/ layout is byte-identical
to the old downloads, so the harnesses and the native client are unchanged.

CI keeps the offline checks on GitHub's runners; the vanilla comparisons and
the mod build need the game, so they move to a manual job on a self-hosted
runner that holds the maintainer's own copy.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-12 02:00:18 +02:00
Ludovic Marie 4eb2f53ffb Merge branch 'parity-base' into parity/saves
# Conflicts:
#	README.md
2026-10-11 17:51:57 +02:00
Ludovic Marie 99057953e0 Mark dispensers as matching vanilla in the parity table
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 17:51:49 +02:00
Ludovic Marie 93b785a2ef Describe save upgrades from 1.18.2 in the status table
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 16:28:53 +02:00
Ludovic Marie 7994c1e8c5 Count natural spawning among the entity checks that match vanilla
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-11 16:19:49 +02:00
Ludovic Marie f2232c3ed7 Rescore the Java parity table at 84%
World generation and interaction now have every covering harness passing and
score 1. The other rows keep 0.75, with their gaps rewritten to name what is
still missing now that the block, command, entity model and item model
harnesses pass; the next steps follow the open gaps.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 21:22:38 +02:00
Ludovic Marie 76030a65cf Re-audit the Java parity table
The overnight work landed LAN hosting, the remaining mobs, client paletted
storage and 18 new differential harnesses, so the table was scored again from a
full run of all 232 harnesses: 223 pass, 8 fail and the item model harness runs
out of memory. Chunk storage, section meshing and lighting now match vanilla in
their harnesses and score 1, and multiplayer rises to 0.75 now that worlds open
to LAN. The other subsystems stay at 0.75 because a harness covering them still
fails or part of them is not yet compared with vanilla; their gaps and the next
steps now name what is left.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-10 13:03:53 +02:00