diff --git a/README.md b/README.md index fe49e0dbf..aa79015f2 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,23 @@ +

+ Horizon: Minecraft Java Edition 26.3, rewritten from scratch in Rust +

+ +

+ CI + Minecraft Java 26.3 + Rust + Vanilla parity 80% + Linux + MIT license +

+ +

+ Get started · + Screenshots · + Parity status · + Native client guide +

+ # Horizon A Rust rewrite of Minecraft: Java Edition 26.3 that aims for one-to-one vanilla parity, checked against the game itself with differential tests. @@ -6,6 +26,30 @@ A Rust rewrite of Minecraft: Java Edition 26.3 that aims for one-to-one vanilla > Not an official Minecraft product. Not approved by or associated with Mojang or Microsoft. Horizon contains no Minecraft code, assets or data: you need your own legally obtained copy of Minecraft: Java Edition 26.3. +## Screenshots + +Captured in the Rust client itself, with vanilla assets and no mods or shaders. + + + + + + + + + + + + + + + + + +
Sunset over a savanna river valley and a plains village
A plains village with farms, an iron golem and animalsSurvival at dusk: a zombie attacks near the village
A crimson forest in the Nether with a zombified piglinMoonrise over a torch-lit village and river
Salmon swimming in a river + Vanilla world generation ported to Rust (terrain, aquifers, carvers, features, villages and the Nether), every block model with smooth lighting and biome tints, the vanilla sky and fog, mobs, the HUD, chat and advancements: everything in these frames is drawn by Horizon. +
+ ## What it does Horizon reimplements the Minecraft Java client and its game logic in Rust, one subsystem at a time, and compares each piece with the vanilla game. Each `tools/test_*_parity.py` harness drives the same inputs through Horizon and through the vanilla client and server bytecode from your own copy of the game, then checks that the outputs are identical. It is for players and developers interested in game reimplementation, and for anyone who wants to see how far a behaviour-exact native rewrite can go. diff --git a/docs/media/banner.jpg b/docs/media/banner.jpg new file mode 100644 index 000000000..a722c36cd Binary files /dev/null and b/docs/media/banner.jpg differ diff --git a/docs/media/icon-256.png b/docs/media/icon-256.png new file mode 100644 index 000000000..9635be7fd Binary files /dev/null and b/docs/media/icon-256.png differ diff --git a/docs/media/logo.png b/docs/media/logo.png new file mode 100644 index 000000000..57b2451b4 Binary files /dev/null and b/docs/media/logo.png differ diff --git a/docs/media/logo.svg b/docs/media/logo.svg new file mode 100644 index 000000000..2ef5c91a4 --- /dev/null +++ b/docs/media/logo.svg @@ -0,0 +1,62 @@ + + Horizon + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/docs/media/nether.jpg b/docs/media/nether.jpg new file mode 100644 index 000000000..fdf2d9c61 Binary files /dev/null and b/docs/media/nether.jpg differ diff --git a/docs/media/night.jpg b/docs/media/night.jpg new file mode 100644 index 000000000..bb5424f50 Binary files /dev/null and b/docs/media/night.jpg differ diff --git a/docs/media/social-preview.jpg b/docs/media/social-preview.jpg new file mode 100644 index 000000000..6775b1fb3 Binary files /dev/null and b/docs/media/social-preview.jpg differ diff --git a/docs/media/sunset.jpg b/docs/media/sunset.jpg new file mode 100644 index 000000000..33bbe2be2 Binary files /dev/null and b/docs/media/sunset.jpg differ diff --git a/docs/media/survival.jpg b/docs/media/survival.jpg new file mode 100644 index 000000000..01a350961 Binary files /dev/null and b/docs/media/survival.jpg differ diff --git a/docs/media/underwater.jpg b/docs/media/underwater.jpg new file mode 100644 index 000000000..5d799ffba Binary files /dev/null and b/docs/media/underwater.jpg differ diff --git a/docs/media/village.jpg b/docs/media/village.jpg new file mode 100644 index 000000000..4d1d7ef02 Binary files /dev/null and b/docs/media/village.jpg differ diff --git a/tests/test_parity.py b/tests/test_parity.py index 81c822602..dc23aeea5 100644 --- a/tests/test_parity.py +++ b/tests/test_parity.py @@ -14,6 +14,9 @@ class ParityTests(unittest.TestCase): scores = [float(score) for score in re.findall(r'^\| [^|]+ \| (0|0\.25|0\.5|0\.75|1) \| [^|]+ \|$', table, re.MULTILINE)] self.assertEqual(len(scores), table.count('\n|') - 1, 'Every row needs a score of 0, 0.25, 0.5, 0.75 or 1') self.assertEqual(int(heading.group(1)), round(sum(scores) * 100 / len(scores))) + badge = re.search(r'badge/vanilla%20parity-(\d+)%25-', text) + self.assertIsNotNone(badge, 'README parity badge is missing') + self.assertEqual(badge.group(1), heading.group(1), 'The parity badge must match the table') if __name__ == '__main__': diff --git a/tools/package_native_client.py b/tools/package_native_client.py index 9acce9f57..82847ee4b 100644 --- a/tools/package_native_client.py +++ b/tools/package_native_client.py @@ -33,7 +33,7 @@ Type=Application Name=Horizon Comment=Minecraft Java Edition 26.3 in Rust Exec="$here/horizon.sh" -Icon=$here/resources/assets/minecraft/textures/block/grass_block_side.png +Icon=$here/horizon.png Terminal=false Categories=Game; EOF @@ -103,6 +103,7 @@ def main(): with tarfile.open(archive, 'w:gz', compresslevel=1) as tar: tar.add(args.binary, 'horizon/horizon-client') add_bytes(tar, 'horizon/horizon.sh', LAUNCHER.encode(), 0o755) + tar.add(ROOT / 'docs/media/icon-256.png', 'horizon/horizon.png') add_bytes(tar, 'horizon/README.txt', README.format(version=version, commit=commit, platform=plat).encode()) for path in sorted(args.resources.iterdir()): if path.name not in SKIP: