Implement underwater magma and preserve signed-zero codec rules

This commit is contained in:
Ludovic Marie
2026-10-06 12:51:12 +02:00
parent bc45763047
commit 4634364ed7
13 changed files with 544 additions and 43 deletions
+4
View File
@@ -131,6 +131,10 @@ jobs:
env:
RUSTUP_TOOLCHAIN: stable
run: python tools/test_vines_parity.py
- name: Compare underwater magma floor scans and occlusion
env:
RUSTUP_TOOLCHAIN: stable
run: python tools/test_underwater_magma_parity.py
- name: Compare ordered single-block replacement features
env:
RUSTUP_TOOLCHAIN: stable
@@ -5,24 +5,24 @@
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
"java": "openjdk 25.0.4.1 2026-08-18",
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
"fixtures": 41742,
"fixtures": 41746,
"candidate_states": 35723,
"double_plant_blocks": 10,
"mossy_carpet_blocks": 1,
"sources_sha256": {
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaSimpleBlockOracle.java": "82204d06e279275c5967f6d5fd80afe7416ba6c5f5ec19c682a30942f2fb6d7a",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaSimpleBlockOracle.java": "c72dae42f87b15980ac2155d736126fa2b88f5f15642acf9c739c17849287ade",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaPlacementOracle.java": "12b1c46cc397755ef6827da777faef3e71c008cafa48403669c03ca2bdc3c7cb",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaBlockSurvivalOracle.java": "4e7cc151617c1b02e872f9ca3e9fe4632379f225f4f07718ff6492df4ee551e7",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaBlockPropertiesOracle.java": "99a396b9b983f6ca9149133251f3ece9aaf76d3d16dafa1f322378212a19490c",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaBlockPropertiesOracle.java": "e871d3a01f15616a98ca9227c27a81e4d17e2d57ac4e68a5650a70fa29811497",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaBlockSupportOracle.java": "04350901a2d708fb8fa672de61d058f73f332d2e90df1b93a67781862f89c1ad",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaBlockStateCodecOracle.java": "5c217a8cb72094020082bd4846ed675a6399b9fa371be95a221bd92d227b2e09",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCollisionOracle.java": "60ff9ef7c1d5e23c080f9aec95ab2e7d3b7c5b5bcd67b9efa9518776c400629a",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaHeightmapOracle.java": "145c943637ed177cc4ef8a85f2484da8afd164868e84a8463882feec1653a860",
"tools/test_simple_block_parity.py": "8d789c02b88cfd019064b7407f886a2054d26554390a25f804773bb2197c6c35",
"tools/test_pillar_parity.py": "8fac172632ae35bacb83c39c8d166365b44b98d07b7a6913a15104c591c3f12a",
"tools/test_simple_block_parity.py": "50b783323051fe8cd369bb733448b0314f1e6e7994a950e4cb6cd2fe4f7f8e11",
"tools/test_pillar_parity.py": "c3df13e78a5f654d0c3525c57a28b5896395f2e7cd136b014666363b8aa4aa63",
"tools/test_block_survival_parity.py": "9e8dff3bd4b95dbfd29f8adc6a2f6d66abf19a6b1cd91423b794a345d4ec244a",
"tools/test_worldgen_parity.py": "b40972ab2ad222aa6d77537cc36b434a217baa1f1b56bbaad945d6e12fe776af",
"tools/test_rust_parity.py": "7efa699a38c5820424f5fc8992ee601dbfe26d6482da9d2dab2c17c41fe8f12a",
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
"Cargo.toml": "dc370d5fdde37238c3e4820046f11c3201020406a4edfa1308257c13edbdcda4",
"Cargo.lock": "7307d0c887364db36d327685ecf0671b75305e31e5ba5fbdcdbb15eaf156d20e",
@@ -87,7 +87,7 @@
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
"crates/horizon-world/src/block_collision.rs": "cec2af81d212d5eed7a2196e4cf0be2daf4cecf53248f78cc68f2190e4d83f9a",
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
"crates/horizon-world/src/block_properties.rs": "b3caf26bd3afc9d10cdcca3f7e794c30abf5ba09afa1fe80ba8f44713acdb274",
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
"crates/horizon-world/src/chunk.rs": "8843e6f48dbbc4245ce4e95564dfba3a4d7a051ba0b1577fb038c07adb0ff0f9",
@@ -95,15 +95,15 @@
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
"crates/horizon-world/src/dynamic_support.rs": "e799b31e5120cfdb04e0b342f2097d610ed98ef8c4be031620ee00368d82df59",
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
"crates/horizon-world/src/fluid.rs": "8a2834a9347ee2c2db7cf1c86a064907ec06e9ac16ba9cc3936e315fc4ad49ca",
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
"crates/horizon-world/src/lib.rs": "a8cd85f6223668c1446ff103276d80937b9707d9a7dc619a176b1b1ceed36a4a",
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
"crates/horizon-world/src/registry/json.rs": "40974e8ddbca79f4a4f866f91f1241a7ac7289874527d4729483995dcf9b4f7e",
"crates/horizon-world/src/registry.rs": "566d7ef6a0d0d7e492d73b7f963ff0158544560a86ba33e179ef4d17e1274706",
"crates/horizon-world/src/registry/json.rs": "1eae82604d2b3377fd35aaa3a914a67e5af28f93923815a49e895b4d437433cd",
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
@@ -116,8 +116,10 @@
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
"crates/horizon-world/src/worldgen/block_feature.rs": "2ea6d26fe88c633ad3efe7bdb6fc49f54961cbdf93b82919d79cf7d37a5c3c7d",
"crates/horizon-world/src/worldgen/block_feature.rs": "5ce5c6eaa5f8a2557a620e533788217b1eb430654801dcf6135d6c92d7a012ac",
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
@@ -129,10 +131,11 @@
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
"crates/horizon-world/src/worldgen/feature_catalog.rs": "431c523593e7db1e1b3ef446f8f0400dade5a13a097633d590774c2b6ed7c08a",
"crates/horizon-world/src/worldgen/feature_graph.rs": "198599a4c751df0e2dee52462f6b6e3df31ee6b90014fdf15a2e59c10ec5937d",
"crates/horizon-world/src/worldgen/feature_region.rs": "2c78e5f1bdb08307f8d982f231f1abbc3306cd54348d9023b86ee6ed3516fd33",
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
"crates/horizon-world/src/worldgen/feature_graph.rs": "fbc0dc49fa5a825e3a7aef74bd465de83fc12855b5a19d907c5b8388bb350b5f",
"crates/horizon-world/src/worldgen/feature_region.rs": "3b893ceafbdd1d7b4264f4022dbdb6a7142dfc7001a5cf5c304f5ca7695dfaa0",
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "e682d13a21f90605215b79f5d254bf2e524d35e89eab2e3b46384709af80b847",
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
@@ -147,26 +150,29 @@
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
"crates/horizon-world/src/worldgen/placement/context.rs": "2fc100f8861fe0e0519a53dc4ae4a1eaa8a96aff2f6bf546ce613bdf665df237",
"crates/horizon-world/src/worldgen/placement/context.rs": "c04a1f7e9409b0cea0ed9b90fd033fc5a398b66f2688b7f6c0583facc473c457",
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
"crates/horizon-world/src/worldgen/tags.rs": "d35ded93fe6e95ea045cadcf4925e656dc34ef832b742179b9ad0cc49f902f31",
"crates/horizon-world/src/worldgen/terrain.rs": "7fb7130111654563f7217f7b84563adde0b11c3ebd6a499a514dc98ebef7c733",
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
"crates/horizon-world/src/worldgen.rs": "2757f22706803afb3624afd65f4f5d05540acbc2bcb01f61e95fa40535575f0f",
"crates/horizon-world/examples/simple_block_fixture.rs": "d839de7fa2827189f8625903cedad84ab47c3e7384bed42e250f660f41d961dc"
"crates/horizon-world/src/worldgen.rs": "11804e16fe587ab8f2c613186de45b450e6d9c459a58e270f108b54223ae68c2",
"crates/horizon-world/examples/simple_block_fixture.rs": "1d2005bdc82c0c0d86d13d00b105983d431c7da6fa5357f4b1f6c43bdcc0019c"
},
"fixtures_sha256": {
".local/rust-pillar-parity/inputs.txt": "09bf497d889602d1f2bedbfbaddb131aa39c6879a2e019826dd645d96382f346",
".local/rust-pillar-parity/inputs.txt": "067db3ce1c72472e9f09341deec6a1bc92267716bd097c3d15722156b8676e52",
".local/rust-pillar-parity/block-properties.nbt": "1aba22092f70d16b8092014c058ddc210e4aaa77bac32f6ec62e4d0e91d92a99",
".local/rust-pillar-parity/block-registry.nbt": "5042073c80753f9548cb8fdb5b1000f0e5a1220127a0cc3c6a75737e180bf9bb",
".local/rust-pillar-parity/cached-collision.nbt": "f3a5c6a5b2d51dad6c52e486e2b9989e79fd55db1a9bda6196db399550b04078",
@@ -184,19 +190,19 @@
".local/rust-pillar-parity/survival-support-tags.json": "15d88d5bb5ad10d65124d5abb2cc055d251b06d129bca7be06f55b43dc13f6fd",
".local/rust-pillar-parity/tags.json": "36975358262568f32bf84778d63d9989a36e7394ed4796d70a34809a8f4a64f0"
},
"rust_output_sha256": "02bfd7e92539a357079e26d27058020f302e5f42c50e5cf3e3ff42967949796d",
"rust_output_sha256": "f989182cf82026dbcfe3011990b153bf820d3a06b1f4969a1e63bbb8cc6bd734",
"references": [
{
"side": "client",
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
"output_sha256": "02bfd7e92539a357079e26d27058020f302e5f42c50e5cf3e3ff42967949796d",
"matched_output_lines": 921075
"output_sha256": "f989182cf82026dbcfe3011990b153bf820d3a06b1f4969a1e63bbb8cc6bd734",
"matched_output_lines": 921111
},
{
"side": "server",
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
"output_sha256": "02bfd7e92539a357079e26d27058020f302e5f42c50e5cf3e3ff42967949796d",
"matched_output_lines": 921075
"output_sha256": "f989182cf82026dbcfe3011990b153bf820d3a06b1f4969a1e63bbb8cc6bd734",
"matched_output_lines": 921111
}
],
"scope": "Native single-block pillar codec and placement, all provider state descriptors, upward/downward traversal, replacement predicates before continuation draws, bounds checks after draws, cap placement one opposite step from the stopping position even when no column block was placed, ignored rejected writes and cap false results, partial failures, coordinate wrapping, independent world random stream, named holders, nested pillars and feature sequences. Shared graph work limits bound pathological traversals. Actual resident chunks, neighbor updates and complete gameplay remain pending."
@@ -0,0 +1,209 @@
{
"schema": 1,
"minecraft": "26.3",
"manifest_sha1": "4fe1aa1ef8da1cb95c5bad1fb98890ca56dd8ca3",
"platform": "Linux-7.0.0-31-generic-x86_64-with-glibc2.43",
"java": "openjdk 25.0.4.1 2026-08-18",
"rustc": "rustc 1.99.0 (b940084d7 2026-09-28)",
"fixtures": 253252,
"candidate_states": 35723,
"double_plant_blocks": 10,
"mossy_carpet_blocks": 1,
"sources_sha256": {
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaSimpleBlockOracle.java": "c72dae42f87b15980ac2155d736126fa2b88f5f15642acf9c739c17849287ade",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaPlacementOracle.java": "12b1c46cc397755ef6827da777faef3e71c008cafa48403669c03ca2bdc3c7cb",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaBlockSurvivalOracle.java": "4e7cc151617c1b02e872f9ca3e9fe4632379f225f4f07718ff6492df4ee551e7",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaBlockPropertiesOracle.java": "e871d3a01f15616a98ca9227c27a81e4d17e2d57ac4e68a5650a70fa29811497",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaBlockSupportOracle.java": "04350901a2d708fb8fa672de61d058f73f332d2e90df1b93a67781862f89c1ad",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaBlockStateCodecOracle.java": "5c217a8cb72094020082bd4846ed675a6399b9fa371be95a221bd92d227b2e09",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaCollisionOracle.java": "60ff9ef7c1d5e23c080f9aec95ab2e7d3b7c5b5bcd67b9efa9518776c400629a",
"mods/horizon/src/test/java/dev/horizonlab/parity/VanillaHeightmapOracle.java": "145c943637ed177cc4ef8a85f2484da8afd164868e84a8463882feec1653a860",
"tools/test_simple_block_parity.py": "50b783323051fe8cd369bb733448b0314f1e6e7994a950e4cb6cd2fe4f7f8e11",
"tools/test_underwater_magma_parity.py": "84481073a4b5ea812abe116e8636b57d224d3b94fd86dadc364a971fd29890bb",
"tools/test_block_survival_parity.py": "9e8dff3bd4b95dbfd29f8adc6a2f6d66abf19a6b1cd91423b794a345d4ec244a",
"tools/test_worldgen_parity.py": "b40972ab2ad222aa6d77537cc36b434a217baa1f1b56bbaad945d6e12fe776af",
"tools/test_rust_parity.py": "29d3db08005873528894b45ca10dcd6278753650473b3eb574e53e06ede40ec6",
"tools/lab.py": "d00bf107fa01b6c579734a082c3ca4ade3018f0d6851d46844acf17574f66e64",
"Cargo.toml": "dc370d5fdde37238c3e4820046f11c3201020406a4edfa1308257c13edbdcda4",
"Cargo.lock": "7307d0c887364db36d327685ecf0671b75305e31e5ba5fbdcdbb15eaf156d20e",
"crates/horizon-core/Cargo.toml": "e21b502c949da93cf67826592459b687a8cbf737ef92fee514e3ed2cc7cd27ad",
"crates/horizon-world/Cargo.toml": "977338bf3e654193685b015d383493b9f59ff6f5d6210bec212cef8ac4a50bed",
"crates/horizon-core/src/bin/density_parity.rs": "e5b1dd33b7d01306c73cf072629b4fb186e9ab87b672a00108999d1a72263fd0",
"crates/horizon-core/src/bin/float_log_parity.rs": "4a655fcf8822ee7668c4bd126bc84d0b118864a6fc7f5a6aeee667d8bf2590b1",
"crates/horizon-core/src/bin/geometry_parity.rs": "27f6c09fe5018ac3de8e70e0f0bbf78f9abb14f5e4783bcaf46e8ca87b9c6f8a",
"crates/horizon-core/src/bin/noise_parity.rs": "c135bfc708d853e7061e81487d2cfe10de64b2f65677d3b4837cbfe0b8341010",
"crates/horizon-core/src/bin/parity.rs": "f35d928c66f958de39fac5e7e836a657eed95f83599e84899f7ea7a5802ba481",
"crates/horizon-core/src/bin/tick_parity.rs": "a54c164fe4814034d369947a887f5273966f5a878ba849204b80d1c729526a8f",
"crates/horizon-core/src/biome/seed_hash.rs": "5afbb4921c750826b395a08bf06f382fc7f01b5759a93de02a2749c523e2a317",
"crates/horizon-core/src/biome.rs": "908efa8cd4aa0a7adf1cb5e1a222e3dfb640eed5e9172e0fe7f0d1287afae7e8",
"crates/horizon-core/src/carving/ellipsoid.rs": "09232a7588610e8a9176fd9c62d40afb1fb89f2ecab6d555536a1d847b142d86",
"crates/horizon-core/src/carving.rs": "0aa3093caa0437868a8c0ed52a6c6e1993bd51c03583c670a2837e749eae5426",
"crates/horizon-core/src/density/arithmetic.rs": "372faec96c923e2cf4aa6c66c1ac398e676853274557823850dbc8933dd15ab1",
"crates/horizon-core/src/density/beardifier.rs": "bb1052e27dae4a01954ca78d7d5babafef85f3b2c704ccaf1920cb85a098cb50",
"crates/horizon-core/src/density/cache.rs": "38d0b6c9dd04ffef979fdad3f29cfebf98d331c8c9d430be5f39aa34f6c30975",
"crates/horizon-core/src/density/end_islands.rs": "168b9384237bd2e41d0ae5a74e944da4dc74e493bdec31fb73184c9a49e3de55",
"crates/horizon-core/src/density/graph/compiler.rs": "ac67deeb16f16d0859aa20e5a165811a29aca0b910037ee6bf5098211f3a6ede",
"crates/horizon-core/src/density/graph/mod.rs": "b776e7da934cb03051a3053d56d461c71e9978e084922fe4194147aa580c07bf",
"crates/horizon-core/src/density/graph/seeded.rs": "6bcdcaa3dffcfa9df673bbbea35120057a16ba3d2b506c52709c36cf8976b74a",
"crates/horizon-core/src/density/graph/tests.rs": "6bfb8cbff462587dd147b0775ea01d370abbd97544b9bd596c792df1b5f7e634",
"crates/horizon-core/src/density/interpolation.rs": "8c890f52b6467f38a94c654986a6a484b8e0b296ab98c398e60a6ce465b5b010",
"crates/horizon-core/src/density/interval.rs": "b42629163baa6b599a233afe8596d1c370cd81d015cc6fc36a9663aa47b98424",
"crates/horizon-core/src/density/mod.rs": "ca0d77d3282e3746ddcbc92bee97dbf640b9a56214e6ac1537f51f9a5b63d6e7",
"crates/horizon-core/src/density/power.rs": "d5b7270a128d4264268cd772109ad16d71a8ec3ff2d3b63b84cb985296d54a91",
"crates/horizon-core/src/density/rounding.rs": "71840c5206ff8d218ac29bf6f66915d5212764ba270c675711a866ba5b55a7a6",
"crates/horizon-core/src/density/selection.rs": "0dd26af2e85004ec5e053039ad11c384c17c56ace9ab45eb3f5cb3503c0b0330",
"crates/horizon-core/src/density/slice.rs": "5d77605573c0deda47778f1f78f7fa3fbf1944d8f5efbcc65cf589181cadf80b",
"crates/horizon-core/src/density/spline.rs": "6bb2e40f940fc6544d6fb09cb0b8cac722be03bc663dbdfb0f61faae207400bc",
"crates/horizon-core/src/density/surface.rs": "159e0e69cda74f870e80ea64fe523c4397e64af4ccb861bb9fd07b2c3cb91b00",
"crates/horizon-core/src/density/terrain_noise.rs": "8d0059d25eb5d248cb97a4c5a2e670d61528928ea151495c004f25adb723fe3e",
"crates/horizon-core/src/density/tests.rs": "7817796ee40d0ae241bfbebec6bca190e0a8e7d5a1caa8ddf858c3eaa58b8858",
"crates/horizon-core/src/density/world_fields.rs": "c1ce305cb8046b384d90c564cafb24af7365d580389637910f3d8b0cc18eb583",
"crates/horizon-core/src/geometry/mod.rs": "dc92f73885dd0a7760743bf74f1ab8afa839d61cef2dfef890f8a23b67b4742e",
"crates/horizon-core/src/geometry/movement.rs": "930e34abef6f6eeec1ee7a6c920b5ba01bfe37b90678884490f4be53241f6b96",
"crates/horizon-core/src/geometry/shape/create.rs": "189812b91d5e0e3ad963afcd1a6e2831b31b8188df91a904ef27061e644806ad",
"crates/horizon-core/src/geometry/shape/face.rs": "f243bce81384040a95ce7984b02b5699206c596c537b2713097e86005b4d3a5c",
"crates/horizon-core/src/geometry/shape/join.rs": "f1b51887b7bf9482557e3ffa99e136f2e5db07ceeb05fdb116adf45e87129075",
"crates/horizon-core/src/geometry/shape.rs": "e8d88a763de1525f77a30b99591641e8a8b80946263acbde035a9bcc356df960",
"crates/horizon-core/src/geometry/sweep.rs": "abd6009c61555161ef2f18b431b2aa384b126c0871cae8b96a62358498a56a1d",
"crates/horizon-core/src/geometry/traversal.rs": "77a3da570a0b85582b669cf4d841cba4b06327006dda26d4a26df4e8ce05bae4",
"crates/horizon-core/src/geometry/trig.rs": "05cef9341a298a474221a0556a11ddf47650393ea7a97b4b2022a4da6628fe37",
"crates/horizon-core/src/lib.rs": "47350edab5791f5074a54563ba98108818c5c6b1c5818a591388eab2ac9f5490",
"crates/horizon-core/src/noise/mod.rs": "1dab5a713abf702402e69ace1bf9e476bba544b0ede5a61c3c3afc60af0a03f3",
"crates/horizon-core/src/noise/normal.rs": "e9e7a46472a54a02c98c46da819842090567153b32fe0c84249009ef19af7aad",
"crates/horizon-core/src/noise/perlin.rs": "e73815447432eab7542f67366cb3f1b368d164e33f6c9cdbd045ac8e4db0932a",
"crates/horizon-core/src/noise/simplex.rs": "6c0dbc15b2b7510195dd28fceca01dcaac1847ccc4a84d299c351589c642fe7a",
"crates/horizon-core/src/noise/stack.rs": "7f6ef0e7d920139ef1a6ad3ec5640f92765715f86dcc5ec29f1a149984f45fa3",
"crates/horizon-core/src/noise/volume.rs": "3f05d2b1780acfdfee60037677d309937a5033b45ef428fc2d540942d4b56b43",
"crates/horizon-core/src/position/iter.rs": "32d2d8e74821cc4e49e3354202d35d3120e4415bfdda9375a73f2137ef651129",
"crates/horizon-core/src/position.rs": "e10101088e6902386b9b6d27773d44312f1ff72bebb19e57967a54945dde9dcd",
"crates/horizon-core/src/random/hash.rs": "0f88a127a1ba2705d3d6c0ebd009324d6ba86ffa2d27edf2d2a84765e690e4a3",
"crates/horizon-core/src/random/positional.rs": "35494745e5d4cf89e282c3ae0ee245e9f2640ddbbc03bc0055df742006a9c862",
"crates/horizon-core/src/random/worldgen.rs": "9f07ff33bcc038d34e27aa5465753bb21df18f2975e43cae201f709bc186945a",
"crates/horizon-core/src/random.rs": "ddb95d3a83e28ad605ff1f49f5df270cc543ca5ef1130e37d989dc74c8d861e6",
"crates/horizon-core/src/storage.rs": "f6c32201c64aefde06e57a2c767be46918df613548a322801546b133799cc33d",
"crates/horizon-core/src/ticks/heap.rs": "bf28afab8af77c3d243aa96cd8a1fb8d934140a4dbd07dbfdbf4e7908bb4b845",
"crates/horizon-core/src/ticks/index.rs": "1f1a6a568c2a30eafecb020ca4d5f5fc414860de85b8b381fc419a2e3e65c24a",
"crates/horizon-core/src/ticks/mod.rs": "84852599dde78687d782f115a5b4b3ef6856c1f9cc92917255167e89c72ab01e",
"crates/horizon-world/src/bin/worldgen_parity.rs": "3143ceb9b56eecfd7667e5feb5f9f0cd13cfb8754b38d4ea338dbba97f2819da",
"crates/horizon-world/src/block_collision.rs": "cec2af81d212d5eed7a2196e4cf0be2daf4cecf53248f78cc68f2190e4d83f9a",
"crates/horizon-world/src/block_placement.rs": "524f4892d50bab77b7d89d19f7b048ffe746996f2ed7f376db2c6ab00ed75c24",
"crates/horizon-world/src/block_properties.rs": "b0bd8a983336c48e488a20caa77dd5c39b1a74bbd14ebc03b3b64556a1c864fc",
"crates/horizon-world/src/block_support.rs": "ade4fbd47284b450dabdd682dc86138b2ac05a0fd379525d7110648908245476",
"crates/horizon-world/src/block_survival.rs": "28ce64375e09819a4f13da9cfbe37c08b5ad0daf01b289c1c360b4567e50e811",
"crates/horizon-world/src/chunk.rs": "8843e6f48dbbc4245ce4e95564dfba3a4d7a051ba0b1577fb038c07adb0ff0f9",
"crates/horizon-world/src/collision.rs": "05313e0c1f3089524fe029f9aac3e439cd47f1c9584c8c7e154c9adcfa88c335",
"crates/horizon-world/src/compression.rs": "4db73e6ca9a0d552d415ce60e7e88b89c9cf2b7d060a669ff8328f518316e101",
"crates/horizon-world/src/dynamic_support.rs": "e799b31e5120cfdb04e0b342f2097d610ed98ef8c4be031620ee00368d82df59",
"crates/horizon-world/src/entity_obstruction.rs": "a4b28a19bf83b23611c59d94535c488db37e4aee24b22c973c545910894a809f",
"crates/horizon-world/src/fluid.rs": "a0a1f34ba94d8b59dc975becee8952960764d67ae08cf2d6a8bcd40a614b15c4",
"crates/horizon-world/src/heightmap.rs": "a5edef082b5af40d814421ea17e129b3b06d70abee6434ed263e4bba58571698",
"crates/horizon-world/src/lib.rs": "a8cd85f6223668c1446ff103276d80937b9707d9a7dc619a176b1b1ceed36a4a",
"crates/horizon-world/src/main.rs": "fce57418b8c22a6a0a9044baa89ed3d9c243bc2e8413fea3ff0f32985daba021",
"crates/horizon-world/src/nbt.rs": "60262c3de8c8f68bc2da0370ccb17393d32b85f5f5022c6358599a7d32119ea6",
"crates/horizon-world/src/piston_shape.rs": "399c2337103b8e7e0eb5667227c5aa14f9549d6a467b7be7da3d0717f0263500",
"crates/horizon-world/src/region.rs": "72b642e87fed37ed17f54d4c30f96c3b64d26c14bc0589c31ef40ff1616188fc",
"crates/horizon-world/src/registry/json.rs": "1eae82604d2b3377fd35aaa3a914a67e5af28f93923815a49e895b4d437433cd",
"crates/horizon-world/src/registry.rs": "f2e58b2b4d944ac8fc6226bd3352cefc3d2052d8473e02ccf7dc402b176df435",
"crates/horizon-world/src/tick_data.rs": "f8d04a69ea263f4168bce33f92e5b4ee2fe07d7caf50a1621c6b3ef6eb2479f3",
"crates/horizon-world/src/worldgen/anchor.rs": "d156b8a0b147a274cdd143409b441f4f43edecde6e8ee14ef9cf0309f743143a",
"crates/horizon-world/src/worldgen/aquifer/config.rs": "fcd2cc3a520c1527c88f095a3b5d38487e7ebb1ccecc5f757f93d04a069add4f",
"crates/horizon-world/src/worldgen/aquifer/noise_based.rs": "74daaa389b5c3dfdc99214dfff256a9e172f83548d2326cbc941d9637cc53fb7",
"crates/horizon-world/src/worldgen/aquifer.rs": "cb4b66d87de3f9f79ae6ffe4badd6f0f44886cd42ad9de2771b8b56c4f1e28c7",
"crates/horizon-world/src/worldgen/biome.rs": "3fe316b875aa32683759c337dc71f624910faf0812a2d6d83b8098d6d0bac7a0",
"crates/horizon-world/src/worldgen/biome_chunk.rs": "d6389c8d1adf900eb8f0e6c8833feafe43dc92d74e5c7ffa6f3950975529d624",
"crates/horizon-world/src/worldgen/biome_predicate.rs": "bfc581bc40077cc74ffda43e990a55fe997adc04c7130f98e039c3305ca79aac",
"crates/horizon-world/src/worldgen/biome_source/codec.rs": "2b9e4f5d679eb444cb73174f511e3b9f32e9eb138248ab12cffc6cfd76adf3a8",
"crates/horizon-world/src/worldgen/biome_source/runtime.rs": "f0b02c1521178e4d0377c6ca62694604b6a773f1f234f070ff0cde4685911d45",
"crates/horizon-world/src/worldgen/biome_source.rs": "e181e1736f3e0b75f7091a24c88de3fd116e01b98424d02382aea7a503d1eb54",
"crates/horizon-world/src/worldgen/biome_temperature.rs": "cde4bbab5e260c4065b113376c423b8511ade93c5aa5fd976e245ee8a58b5ad1",
"crates/horizon-world/src/worldgen/block_blob.rs": "c608c57b3d77279646ecb89e50677dd8e452b0422ffd357ba755536c5589eb89",
"crates/horizon-world/src/worldgen/block_column.rs": "f72c21a9066ee0aa68c2fb79fba436d05afb14c6ef5a2cb012f1ed35fc17cd22",
"crates/horizon-world/src/worldgen/block_feature.rs": "5ce5c6eaa5f8a2557a620e533788217b1eb430654801dcf6135d6c92d7a012ac",
"crates/horizon-world/src/worldgen/block_pile.rs": "623e369b77e0526ed2756485a6c0bb09683cd28ad8876dea907360ca6665b39d",
"crates/horizon-world/src/worldgen/block_predicate.rs": "074c692367e3f2191a1bb28d87b23402430a843c246bd30a4ea838ee3500280e",
"crates/horizon-world/src/worldgen/bulk_section.rs": "eecf61532d7793f853884c5a18a7f436a59835c7b13d3ec9075804511553c9ba",
"crates/horizon-world/src/worldgen/carver/canyon.rs": "509c4d5a9d689849e98e894ab14a9fbf82d10707d38e9cc688ded3c4778df3e2",
"crates/horizon-world/src/worldgen/carver/generation.rs": "a4498d0d1457536de3922a08e9c40ccce8d2ef9cc263801c15a412327513c098",
"crates/horizon-world/src/worldgen/carver.rs": "46b251e28225fe1250de38f49dec5dacda4e2c4ba1e556e21e6d1e14e2651fc3",
"crates/horizon-world/src/worldgen/carving.rs": "4e77d4e5c4a0ca55ca3563b9bdf6f379342e0bdf9d019d60f7bc57ce4afb5fbd",
"crates/horizon-world/src/worldgen/climate/codec.rs": "d567adeb5d837816fca69102db51d790f71aec1b51c09298230d24612e400a14",
"crates/horizon-world/src/worldgen/climate/index.rs": "c5ce61679a5f0e0f2f0af2a373424effa124d0cce8250609eff38b7034650756",
"crates/horizon-world/src/worldgen/climate.rs": "1b9ad44407f40aee4c1cd5357a5c9c443c1b105728f01cf5c644072f99f8357e",
"crates/horizon-world/src/worldgen/decoration.rs": "75a79b20b21e133816e729f16e758be6165d0db18a64bfbd5fd3618325a2adf3",
"crates/horizon-world/src/worldgen/density.rs": "65a98c156a290a6b374ef670d28cd5dfbe0aa93171824d1bbd96422536273f84",
"crates/horizon-world/src/worldgen/disk.rs": "6f8f9e059755af44c9bfa1b91eba54a7d13fad811dce31717c5502d7f6df33d7",
"crates/horizon-world/src/worldgen/feature.rs": "40500af71ee6628dfb27518262d99f08d0383ae6c7b9397452feef0c213eadd9",
"crates/horizon-world/src/worldgen/feature_catalog.rs": "efc7b17b227e71622ef34108be9abd010f5675b68ea0409fcab82581d9aab88a",
"crates/horizon-world/src/worldgen/feature_graph.rs": "fbc0dc49fa5a825e3a7aef74bd465de83fc12855b5a19d907c5b8388bb350b5f",
"crates/horizon-world/src/worldgen/feature_region.rs": "3b893ceafbdd1d7b4264f4022dbdb6a7142dfc7001a5cf5c304f5ca7695dfaa0",
"crates/horizon-world/src/worldgen/feature_sort.rs": "3488a093dfe1321aaa29d8a30cfb115d8e666a81bf195514e87b170de626835c",
"crates/horizon-world/src/worldgen/fluid_predicate.rs": "e682d13a21f90605215b79f5d254bf2e524d35e89eab2e3b46384709af80b847",
"crates/horizon-world/src/worldgen/height_provider.rs": "368d4dc119854742a045c4a717679c921456da681fc5f71aa9b37102d6f33b47",
"crates/horizon-world/src/worldgen/material_condition/codec.rs": "09b909bc384472f76d163c8069ec6b507c7d5c6a028a36d5e0e3df20deff7b3b",
"crates/horizon-world/src/worldgen/material_condition/density.rs": "df9d0761e978e5010663ae8b44f2d6c1ecb4907331e333bdb6a2b487c1e107de",
"crates/horizon-world/src/worldgen/material_condition/library.rs": "a55534c5da97575a819af5a7dc0dbec9069993fa8b2619c6c9d5576946e683fa",
"crates/horizon-world/src/worldgen/material_condition/noise.rs": "ffb59cc6be2275d7a5621bf7d768527e74a8326ed7ad78618746711540921675",
"crates/horizon-world/src/worldgen/material_condition/rule.rs": "fed643352efbcb1f68f29b6241896617db889fc7c577a6247564e01922fec1fe",
"crates/horizon-world/src/worldgen/material_condition.rs": "d638dcb8cbcb5da20b3cb29602b0ae6a86c4fdf9d8c0fb725de8ec5fc108717e",
"crates/horizon-world/src/worldgen/material_extensions.rs": "ab806eb679d5116e1aebb64fca70e1499ae71f83c9507a8cb4c3201c2b1bf037",
"crates/horizon-world/src/worldgen/material_stage.rs": "698cbc786eff13c246e2bc2ea062401918cd4265899fbc3d53abc87e45a8e7a1",
"crates/horizon-world/src/worldgen/material_surface.rs": "5d37b90099df3d6da0845dab164e71469fb287019c2ee74bc6714f3b9d6d6d5b",
"crates/horizon-world/src/worldgen/ore_feature.rs": "83b89fd3be691c5412c0215b6abefdcaa44119a05aa41217e061970eb7e12ebd",
"crates/horizon-world/src/worldgen/placement/chain.rs": "9218399b4d3757f7bbc550d7729a7201f32a1c83a7030865e0c12aab8a80d116",
"crates/horizon-world/src/worldgen/placement/context.rs": "c04a1f7e9409b0cea0ed9b90fd033fc5a398b66f2688b7f6c0583facc473c457",
"crates/horizon-world/src/worldgen/placement/layer.rs": "a0f5ca776f33f9d4f72b8fdcd163426152e5e43cb4a7572fc1d4fc57bf965de1",
"crates/horizon-world/src/worldgen/placement.rs": "b0397e5818fae84358546193a95f84bcb0b5bffafce909e6fcb3386179ee8023",
"crates/horizon-world/src/worldgen/router.rs": "2cee7cf15a0d2ada12be6b39d83e78177fd3033922e4f4cce87a64073cec2847",
"crates/horizon-world/src/worldgen/rule_test.rs": "d1662ec492489ebaa4b87e20f9a8c809dcf3a223a151211bd65ec241a63692fc",
"crates/horizon-world/src/worldgen/settings.rs": "a8fe87752e1982ef11cb67f8d80d8e3428b2c27db178044cb425ba803e689e59",
"crates/horizon-world/src/worldgen/simple_block.rs": "9ba1a88d5db4925f8c37366557887f776c805f9a6444781615b5dbaff52e92a4",
"crates/horizon-world/src/worldgen/spring.rs": "830849e9b89fcdf09e9b06fbefdcdebe3c8c3f82804f60b8bd5de04ba303cb62",
"crates/horizon-world/src/worldgen/state_provider/catalog.rs": "c8687e15a4887a9200c8d365857d801efaa8f90e669eee3e600a1db4905119eb",
"crates/horizon-world/src/worldgen/state_provider/noise.rs": "7ee369c2a032e5620cb9bdf9ee7adad1f70870fb0a27efb7b7c514d92f83491f",
"crates/horizon-world/src/worldgen/state_provider/properties.rs": "9909139aaca1dc4f743957257fadaa9d423d21fa401fa9abc050505f79365139",
"crates/horizon-world/src/worldgen/state_provider.rs": "be29ada818826a90afe01ab60916360fdfc4cbde5af15c9359cd56b1f1f7b156",
"crates/horizon-world/src/worldgen/tags.rs": "d35ded93fe6e95ea045cadcf4925e656dc34ef832b742179b9ad0cc49f902f31",
"crates/horizon-world/src/worldgen/terrain.rs": "7fb7130111654563f7217f7b84563adde0b11c3ebd6a499a514dc98ebef7c733",
"crates/horizon-world/src/worldgen/underwater_magma.rs": "7317e40af5ee5a9780f90ce358fa5d3e7f5b3d513b731df6ff97754d9c2a0154",
"crates/horizon-world/src/worldgen/value_provider.rs": "3358b563db8cb0bc8a9cfbbe2b8b3e70941cd2d37a0b519fbb6545f8d0dcbb69",
"crates/horizon-world/src/worldgen/vines.rs": "ee9b79b65012bd86a838241d2ef708680f7fe8eafc8aa656dae9cf2abf3c6418",
"crates/horizon-world/src/worldgen/weighted.rs": "839840aae25302933bbd97a81a2336330e2d03a0ad1684e1e16ac769ed408e6b",
"crates/horizon-world/src/worldgen.rs": "11804e16fe587ab8f2c613186de45b450e6d9c459a58e270f108b54223ae68c2",
"crates/horizon-world/examples/simple_block_fixture.rs": "1d2005bdc82c0c0d86d13d00b105983d431c7da6fa5357f4b1f6c43bdcc0019c"
},
"fixtures_sha256": {
".local/rust-underwater-magma-parity/inputs.txt": "332d2930db1501eb70466c5ff6f9ed1c180c83fc7db308c538f33d1aaf5f74c3",
".local/rust-underwater-magma-parity/block-properties.nbt": "1aba22092f70d16b8092014c058ddc210e4aaa77bac32f6ec62e4d0e91d92a99",
".local/rust-underwater-magma-parity/block-registry.nbt": "5042073c80753f9548cb8fdb5b1000f0e5a1220127a0cc3c6a75737e180bf9bb",
".local/rust-underwater-magma-parity/cached-collision.nbt": "f3a5c6a5b2d51dad6c52e486e2b9989e79fd55db1a9bda6196db399550b04078",
".local/rust-underwater-magma-parity/cached-support.nbt": "b6fdc9471b0b61e904206d3f099f4dc235aad6d723536c210be0cb7c3560d82c",
".local/rust-underwater-magma-parity/catalog.json": "93581107e3564e60261044fdca61e3b7f237b9e6724c14b86e335ccc01198ba9",
".local/rust-underwater-magma-parity/facts.json": "5e89a805514cabfe46e082d651db406b9479781e1d97b65faa2ab9f6f871309b",
".local/rust-underwater-magma-parity/feature-catalog.json": "c048c761c5084a40560731955cc999a364d14055bdd86fa50989a92e4a771286",
".local/rust-underwater-magma-parity/fluid-tags.json": "f1e5eb6d22ea7effbb118a2282709cfdeef1bfae4516b775a55ad7a4df29d7d0",
".local/rust-underwater-magma-parity/placement-definitions.json": "f8a972ec87c2352500af6481158a3192bdbf699951025639bea744e4127b97c4",
".local/rust-underwater-magma-parity/support-cached-states.json": "353945a58fe69b352925473f1693f9b14a9ad19f13c15159c4184f2c29258622",
".local/rust-underwater-magma-parity/survival-classes.json": "361832008eea0aa9151d367a125a19c6353d99a0b88b27dd0682f55b7954553e",
".local/rust-underwater-magma-parity/survival-extra-definitions.json": "170f2db5bc97a49fa25cc249540aa7f04beea455cdbaf43742ed9415f5090a02",
".local/rust-underwater-magma-parity/survival-placement-classes.json": "7fdbf48ab18c87098bbe1b6176cb81f4842b6c5d9a4d6bbaf7037ff61cb1848c",
".local/rust-underwater-magma-parity/survival-rules.json": "8805c18b3195bb1eac1f1e5281333df56e2892505f64023e5403c58ce2ec4368",
".local/rust-underwater-magma-parity/survival-support-tags.json": "15d88d5bb5ad10d65124d5abb2cc055d251b06d129bca7be06f55b43dc13f6fd",
".local/rust-underwater-magma-parity/tags.json": "36975358262568f32bf84778d63d9989a36e7394ed4796d70a34809a8f4a64f0"
},
"rust_output_sha256": "70e10d29d4283e391ca2e09b9e04e6e71ab0e99d90c1cf460f544b2997cf44b8",
"references": [
{
"side": "client",
"jar_sha256": "4508d006323f24fa02876310c192d739af56516eb259000ac50f0909a68c9a2d",
"output_sha256": "70e10d29d4283e391ca2e09b9e04e6e71ab0e99d90c1cf460f544b2997cf44b8",
"matched_output_lines": 6523072
},
{
"side": "server",
"jar_sha256": "a362163eec5d1612d520772bc16e5b39c09e3b234fdc045f56bf544284ee8ae6",
"output_sha256": "70e10d29d4283e391ca2e09b9e04e6e71ab0e99d90c1cf460f544b2997cf44b8",
"matched_output_lines": 6523072
}
],
"scope": "Native UnderwaterMagmaFeature codecs and Column.scan floor selection. Initial water identity, upward scan before downward scan, repeated boundary reads, all scan endpoints, every state at origin/floor/below and each horizontal neighbor, exact full-face occlusion, cubic traversal, per-position float draws before block tests, flags 2, rejected writes and partial failures are compared. Both random modes include the complete radius-64 cube with probability zero (2146689 draws), wrapped radius-zero columns and nested placement. Rust allows the entire valid codec radius domain and bounds pathological overflow iteration at 2^23 visits. Actual chunk update callbacks, magma gameplay and full world generation remain pending."
}
+1
View File
@@ -40,6 +40,7 @@ pub mod spring;
pub mod state_provider;
pub mod tags;
pub mod terrain;
pub mod underwater_magma;
pub mod value_provider;
pub mod vines;
pub mod weighted;
@@ -49,6 +49,7 @@ pub enum FeatureDefinition {
Disk(super::disk::DiskFeature),
Spring(super::spring::SpringFeature),
Vines(super::vines::VinesFeature),
UnderwaterMagma(super::underwater_magma::UnderwaterMagmaFeature),
BlockBlob(super::block_blob::BlockBlobFeature),
SimpleBlock(super::simple_block::SimpleBlockFeature),
FillLayer(FillLayerFeature),
@@ -73,6 +74,7 @@ pub enum FeatureExecutionError<E> {
BlockPile(super::block_pile::BlockPileError<E>),
Disk(super::disk::DiskError<E>),
BlockBlob(super::block_blob::BlockBlobError<E>),
UnderwaterMagma(super::underwater_magma::UnderwaterMagmaError<E>),
SimpleBlock(super::simple_block::SimpleBlockError<E>),
Random(InvalidBound),
Query(PlacementQueryError),
@@ -88,6 +90,7 @@ impl<E: std::fmt::Display> std::fmt::Display for FeatureExecutionError<E> {
Self::BlockPile(e) => e.fmt(f),
Self::Disk(e) => e.fmt(f),
Self::BlockBlob(e) => e.fmt(f),
Self::UnderwaterMagma(e) => e.fmt(f),
Self::SimpleBlock(e) => e.fmt(f),
Self::Random(e) => e.fmt(f),
Self::Query(e) => e.fmt(f),
@@ -254,6 +257,13 @@ impl FeatureDefinition {
)?)?;
match kind.as_str() {
"minecraft:no_op" => Ok(Self::NoOp),
"minecraft:underwater_magma" => {
super::underwater_magma::UnderwaterMagmaFeature::from_json(
json,
blocks.ok_or(DecodeError::Field("underwater magma bindings"))?,
)
.map(Self::UnderwaterMagma)
}
"minecraft:vines" => super::vines::VinesFeature::new(
blocks.ok_or(DecodeError::Field("vine feature bindings"))?,
)
@@ -368,7 +378,7 @@ impl FeatureDefinition {
as f32,
None => 1.0,
};
if !(0.0..=1.0).contains(&chance) {
if !(0.0..=1.0).contains(&chance) || chance.is_sign_negative() {
return Err(DecodeError::Field("pillar chance"));
}
let cap = super::optional(&object, "cap_feature")
@@ -582,6 +592,9 @@ impl FeatureDefinition {
.place(world, random, origin, run.blocks)
.map_err(FeatureExecutionError::Basic),
Self::NoOp => Ok(true),
Self::UnderwaterMagma(feature) => feature
.place(world, random, origin)
.map_err(FeatureExecutionError::UnderwaterMagma),
Self::Vines(feature) => feature.place(world, origin).map_err(|e| match e {
BlockFeatureError::World(e) => FeatureExecutionError::Basic(FeatureError::World(e)),
BlockFeatureError::Query(e) => FeatureExecutionError::Query(e),
@@ -0,0 +1,187 @@
//! Water-column floor scans and randomized magma replacement in occluded cells.
use super::{
DecodeError, Object, block_feature::FeatureBlockBindings,
block_predicate::PredicateBlockResolver, feature::FeatureWorld, int_range, number_text,
required,
};
use crate::{block_properties::BoundOcclusionFaces, registry::BlockStateId};
use horizon_core::{geometry::Direction, random::RandomSource};
use std::{collections::BTreeSet, sync::Arc};
#[derive(Clone, Debug)]
pub struct UnderwaterMagmaFeature {
search: i32,
radius: i32,
probability: f32,
water: Arc<BTreeSet<BlockStateId>>,
air: [BlockStateId; 3],
magma: BlockStateId,
faces: BoundOcclusionFaces,
}
#[derive(Debug)]
pub enum UnderwaterMagmaError<E> {
World(E),
Registry(std::io::Error),
InvalidColumn,
WorkLimit,
}
impl<E: std::fmt::Display> std::fmt::Display for UnderwaterMagmaError<E> {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
match self {
Self::World(e) => e.fmt(f),
Self::Registry(e) => e.fmt(f),
Self::InvalidColumn => f.write_str("negative scanned column height"),
Self::WorkLimit => f.write_str("magma placement work limit exceeded"),
}
}
}
impl<E: std::error::Error + 'static> std::error::Error for UnderwaterMagmaError<E> {}
impl UnderwaterMagmaFeature {
pub fn from_json(json: &str, bindings: &FeatureBlockBindings<'_>) -> Result<Self, DecodeError> {
let object: Object = serde_json::from_str(json)?;
let probability = number_text(required(
&object,
"placement_probability_per_valid_position",
)?)?
.parse::<f64>()
.map_err(|_| DecodeError::Field("magma probability"))? as f32;
if !(0.0..=1.0).contains(&probability) || probability.is_sign_negative() {
return Err(DecodeError::Field("magma probability"));
}
Ok(Self {
search: int_range(
required(&object, "floor_search_range")?,
"magma floor range",
0,
512,
)?,
radius: int_range(
required(&object, "placement_radius_around_floor")?,
"magma radius",
0,
64,
)?,
probability,
water: bindings.predicate_block_set(r#""minecraft:water""#)?,
air: bindings.air,
magma: bindings
.registry()
.default_state("minecraft:magma_block")
.ok_or(DecodeError::Field("magma block"))?,
faces: bindings
.occlusion_faces
.clone()
.ok_or(DecodeError::Field("magma occlusion bindings"))?,
})
}
pub fn place<W: FeatureWorld>(
&self,
world: &mut W,
random: &mut impl RandomSource,
origin: [i32; 3],
) -> Result<bool, UnderwaterMagmaError<W::Error>> {
if !self
.water
.contains(&world.block(origin).map_err(UnderwaterMagmaError::World)?)
{
return Ok(false);
}
let ceiling = self.scan(world, origin, 1)?;
let floor = self.scan(world, origin, -1)?;
if let (Some(floor), Some(ceiling)) = (floor, ceiling) {
if ceiling.wrapping_sub(floor).wrapping_sub(1) < 0 {
return Err(UnderwaterMagmaError::InvalidColumn);
}
}
let Some(y) = floor else {
return Ok(false);
};
let center = [origin[0], y, origin[2]];
let a: [i32; 3] = std::array::from_fn(|i| center[i].wrapping_sub(self.radius));
let b: [i32; 3] = std::array::from_fn(|i| center[i].wrapping_add(self.radius));
let min: [i32; 3] = std::array::from_fn(|i| a[i].min(b[i]));
let sizes: [i32; 3] =
std::array::from_fn(|i| a[i].max(b[i]).wrapping_sub(min[i]).wrapping_add(1));
let count = sizes[0].wrapping_mul(sizes[1]).wrapping_mul(sizes[2]);
let mut index: i32 = 0;
let mut any = false;
while index != count {
// Includes the full valid radius-64 cube (2,146,689 positions).
if index == 8_388_608 {
return Err(UnderwaterMagmaError::WorkLimit);
}
let quotient = index / sizes[0];
let p = [
min[0].wrapping_add(index % sizes[0]),
min[1].wrapping_add(quotient % sizes[1]),
min[2].wrapping_add(quotient / sizes[1]),
];
index += 1;
if random.next_float() < self.probability && self.valid(world, p)? {
world
.set_block(p, self.magma, 2)
.map_err(UnderwaterMagmaError::World)?;
any = true;
}
}
Ok(any)
}
fn scan<W: FeatureWorld>(
&self,
world: &mut W,
mut p: [i32; 3],
step: i32,
) -> Result<Option<i32>, UnderwaterMagmaError<W::Error>> {
let mut distance = 1;
while distance < self.search {
if !self
.water
.contains(&world.block(p).map_err(UnderwaterMagmaError::World)?)
{
break;
}
p[1] = p[1].wrapping_add(step);
distance += 1;
}
Ok((!self
.water
.contains(&world.block(p).map_err(UnderwaterMagmaError::World)?))
.then_some(p[1]))
}
fn valid<W: FeatureWorld>(
&self,
world: &mut W,
p: [i32; 3],
) -> Result<bool, UnderwaterMagmaError<W::Error>> {
let state = world.block(p).map_err(UnderwaterMagmaError::World)?;
if self.water.contains(&state) || self.air.contains(&state) {
return Ok(false);
}
if !self.occluded(world, [p[0], p[1].wrapping_sub(1), p[2]], Direction::Up)? {
return Ok(false);
}
for direction in [
Direction::North,
Direction::East,
Direction::South,
Direction::West,
] {
let step = direction.normal();
let at = std::array::from_fn(|i| p[i].wrapping_add(step[i]));
if !self.occluded(world, at, direction.opposite())? {
return Ok(false);
}
}
Ok(true)
}
fn occluded<W: FeatureWorld>(
&self,
world: &mut W,
p: [i32; 3],
direction: Direction,
) -> Result<bool, UnderwaterMagmaError<W::Error>> {
let state = world.block(p).map_err(UnderwaterMagmaError::World)?;
self.faces
.is_full(state, direction)
.map_err(UnderwaterMagmaError::Registry)
}
}
+3 -3
View File
@@ -173,10 +173,10 @@ a shared property table. Predicates query this table in constant time.
`python3 tools/test_block_properties_parity.py` compares all **35,723 states** and
**18,096 synthetic cache/flag/shape cases**, including adjacent floating-point values
around solidity thresholds and both occlusion flag values. The [block-properties report](../benchmarks/rust-block-properties-2026-10-06/scoped-parity.json)
records **143,361 matching lines per JAR**. Definition flags, collision and raw
records **197,180 matching lines per JAR**. Definition flags, collision and raw
occlusion data are private runtime inputs; Rust calculates solidity and solid
rendering. The report was produced in an isolated staging copy and archived only
after the integrated sources and copied fixtures matched every recorded hash.
rendering and caches full-face occlusion masks. Every state and synthetic shape
is compared on all six faces; source and fixture hashes are recorded.
Item/fluid-context replacement and collision with live entities remain separate work.
Face selection now preserves native cube-axis shortcuts, epsilon sample points,
+18 -8
View File
@@ -181,14 +181,15 @@ routing, missing-neighbor errors and mutation-callback flag/return handling.
`FeatureDefinition` and `PlacedFeatureDefinition` compose the initial block-writing
features with no-op, sequence, boolean choice, uniform choice, chance-based
choice and weighted-choice features. Sequences stop on the first false child. Selectors return the
choice, weighted-choice and overlay features. Overlays execute every child and
accumulate success. Sequences stop on the first false child. Selectors return the
chosen child's result directly. Child modifiers and features share world state
and randomness; each sequence uses one fresh placer across its children.
Native single-object holder-set shorthand is accepted for sequence/uniform lists.
Run `python3 tools/test_feature_graph_parity.py`. The
[graph report](../benchmarks/rust-feature-graph-2026-10-06/scoped-parity.json) records
**737,779 matching lines per JAR** for actual native feature codecs and nested
**1,146,057 matching lines per JAR** for actual native feature codecs and nested
placement. Cases include empty/malformed lists, singleton and nested choices,
zero/one probabilities, negative zero, false child results, partial writes, world
failures, repeated calls and top-level modifier chains.
@@ -217,9 +218,9 @@ names, missing dependencies and cycles return errors.
Run `python3 tools/test_feature_catalog_parity.py`. The
[catalog report](../benchmarks/rust-feature-catalog-2026-10-06/scoped-parity.json)
records **1,734,390 matching lines per JAR** against actual registry-aware holder
codecs, registered feature snapshots and native `TagLoader`. It compares nine
named features, fourteen placed features, five tag files, nested/duplicate references,
records **2,528,704 matching lines per JAR** against actual registry-aware holder
codecs, registered feature snapshots and native `TagLoader`. It compares ten
named features, fifteen placed features, five tag files, nested/duplicate references,
optional/required missing tags, namespace shorthand and subsequent execution.
Configured fill layers, single-block replacements and scattered ore bind block-state
metadata through named roots, nested tags and modifier chains. Block-set
@@ -228,7 +229,7 @@ the mutable world, including repeated placement after earlier writes and flowing
that changes later fluid-predicate results.
Empty named tags retain a native distinction from empty inline lists: a sequence
can resolve an empty tag and succeed, while a uniform selector resolves it and
can resolve an empty tag and succeed, an overlay returns false, while a uniform selector resolves it and
then fails its zero-bound random choice. The inline list codecs reject empty
lists during decoding. These cases and their random-state effects are compared.
@@ -604,9 +605,10 @@ and nested pillars use the same feature catalog and graph work budget.
Run `python3 tools/test_pillar_parity.py`. The
[pillar report](../benchmarks/rust-pillar-2026-10-06/scoped-parity.json) records
**921,075 matching lines per JAR** across **41,742 fixtures**, including every
**921,111 matching lines per JAR** across **41,746 fixtures**, including every
candidate descriptor, both vertical directions, continuation boundaries,
replacement conditions, cap composition, failures, rejected writes and random
signed-zero probability rejection, replacement conditions, cap composition,
failures, rejected writes and random
stream tails. Workspace tests and all-target Clippy passed. Resident world
updates and complete generation/gameplay remain unfinished.
@@ -626,3 +628,11 @@ states, all direction masks, bounded integer providers, named/empty holder sets,
mutable repeated attempts, partial failures and nested feature/modifier calls.
Workspace tests and all-target Clippy passed. These feature algorithms still
require complete chunk mutation, neighbor updates and gameplay integration.
## Additional verified feature algorithms
The executable feature graph also includes overlay composition, block piles,
disks, block blobs, springs, vines and underwater magma. Their version-specific
reports and remaining integration limits are recorded in [Rust rewrite status](rust-parity.md#overlay-feature-composition).
These comparisons cover ordered world requests; complete world updates and
playable gameplay remain pending.
+22 -3
View File
@@ -326,11 +326,11 @@ modifier chains and resident neighboring chunks, including live heightmap update
World-region side effects and complete feature generation remain pending.
The [inline feature-graph comparison](feature-placement.md#inline-feature-composition)
adds **737,779 matching lines per JAR** for nested sequences and random selectors,
adds **1,146,057 matching lines per JAR** for nested sequences, overlays and random selectors,
including short-circuit results, shared randomness and partial mutations.
The [named feature-resource comparison](feature-placement.md#named-feature-resources)
adds **1,734,390 matching lines per JAR** for registry-aware feature/placed-feature
adds **2,528,704 matching lines per JAR** for registry-aware feature/placed-feature
holders, ordered tags and subsequent nested execution. Complete registry loading,
reloads and remaining feature algorithms are still pending.
@@ -394,7 +394,7 @@ query failures. Named holder references are resolved through immutable resource
snapshots. Additional predicates, complete registry loading and complete feature placement remain pending.
The [contained-fluid comparison](world-data.md#contained-fluid-states) adds
**239,190 matching lines per JAR** for fluid-state mapping, liquid-block conversion
**243,331 matching lines per JAR** for fluid-state mapping, liquid-block conversion
and surface/camera height queries. It covers every pinned block state and query
failures; fluid spreading, entity interactions and rendering remain pending.
@@ -511,3 +511,22 @@ The expanded [block-property comparison](../benchmarks/rust-block-properties-202
matches **197,180 lines per reference JAR**, including all 35,723 states and
18,096 synthetic shape/flag combinations. Workspace tests and all-target Clippy
pass. Lighting and renderer integration remain separate work.
## Underwater magma and probability decoding
Underwater magma now performs native water-column scans, including the upper
scan before the lower scan and repeated boundary reads. Each cube position draws
a probability value before testing block identity and the five required full
occlusion faces. Rejected writes still count as successful placements.
The [underwater magma comparison](../benchmarks/rust-underwater-magma-2026-10-06/scoped-parity.json)
matches **6,523,072 lines per reference JAR** over **253,252 fixtures**. Both RNG
modes cover the complete radius-64 cube, consuming **2,146,689 draws** with zero
placement probability. Every state in the origin/floor/neighbor roles, scan
limits, partial failures, wrapped radius-zero columns and composition are tested.
The native comparison exposed signed-zero codec behavior: bounded probabilities
reject `-0.0`, including negative values that round to float zero. Magma and
pillar decoding now preserve this. The expanded pillar gate passes **921,111
lines per JAR** over **41,746 fixtures**. Workspace tests and all-target Clippy
pass. World updates and magma/fluid gameplay remain pending.
+5 -4
View File
@@ -138,10 +138,11 @@ block's support shape.
Run `python3 tools/test_fluid_parity.py`. The
[fluid report](../benchmarks/rust-fluid-2026-10-06/scoped-parity.json) records
**239,190 matching lines per JAR**. It compares all 35,723 block states, five fluid
**243,331 matching lines per JAR**. It compares all 35,723 block states, five fluid
identities, every fluid-family pair, own-height bits, source/falling/full flags and
legacy block conversion. The 40,344 world fixtures request 80,688 surface/camera
legacy block conversion. An additional 2,432 fluid-state JSON fixtures compare
all 37 fluid states, native defaults, malformed properties and encoding. The 40,344 world fixtures request 80,688 surface/camera
height queries, including coordinate overflow and injected failures. The support
fixtures use actual vanilla stone and air states. Fluid spreading, scheduled
updates, entity interactions and rendering remain pending. Workspace tests,
Clippy and 137 Python tests passed at this stage.
updates, entity interactions and rendering remain pending. Workspace tests
and all-target Clippy pass.
@@ -59,6 +59,7 @@ public final class VanillaSimpleBlockOracle {
public Object invoke(Object proxy,Method method,Object[] args)throws Throwable {
String name=method.getName();
if(name.equals("getRandom"))return random;
if(name.equals("isStateAtPosition")){var p=(BlockPos)args[0];event("get "+xyz(p));var state=at(p);out.println("state "+Block.getId(state));return ((java.util.function.Predicate<BlockState>)args[1]).test(state);}
if(name.equals("getChunk")&&args.length==1&&args[0] instanceof BlockPos)return chunk((BlockPos)args[0]);
if(name.equals("getMinY"))return -64;
if(name.equals("getHeight")&&(args==null||args.length==0))return 384;
+1 -1
View File
@@ -26,7 +26,7 @@ def corpus(facts,placement):
yield case(pillar(provider,can_replace=predicate,cap_feature='horizon:moss'),fallback=get(neighbor),fail=fail)
for origin,direction,chance in itertools.product([[0,-65,0],[0,-64,0],[0,319,0],[0,320,0],[2147483647,-2147483648,-2147483648],[-2147483648,2147483647,2147483647]],['up','down'],[0.0,0.5,1.0]):
yield case(pillar(direction=direction,chance_to_continue=chance,cap_feature='horizon:stone'),origin=origin)
for key,values in [('block',[None,False,0,{},'missing']),('can_replace',[None,False,0,{}, {'type':'true'}]),('direction',[None,'north','UP',False,0]),('chance_to_continue',[None,False,'0.5',-0.01,1.01,0,1]),('cap_feature',[None,'missing',{},False])]:
for key,values in [('block',[None,False,0,{},'missing']),('can_replace',[None,False,0,{}, {'type':'true'}]),('direction',[None,'north','UP',False,0]),('chance_to_continue',[None,False,'0.5',-0.01,1.01,-0.0,-1e-100,1e-100,1.0000000001,0,1]),('cap_feature',[None,'missing',{},False])]:
for value in values:
definition=pillar();definition[key]=value;yield case(definition)
definition=pillar();definition.pop(key,None);yield case(definition)
+50
View File
@@ -0,0 +1,50 @@
#!/usr/bin/env python3
"""Compare underwater magma scans, face occlusion and randomized placement."""
import itertools
import json
try:
from . import test_simple_block_parity as harness
except ImportError:
import test_simple_block_parity as harness
def corpus(facts, placement):
states=facts['states'];get=lambda name:facts['defaults']['minecraft:'+name]
def magma(**extra):
value={'type':'underwater_magma','floor_search_range':2,'placement_radius_around_floor':0,'placement_probability_per_valid_position':1.0};value.update(extra);return value
def case(definition=None, **extra):
origin=extra.pop('origin',[0,64,0])
value={'definition':json.dumps(definition if definition is not None else magma(),separators=(',',':')),
'mode':'feature','origin':origin,'legacy':False,'seed':0,'world_seed':1,'fail':-1,'reject':0,
'brightness':15,'fallback':get('stone'),'states':[[*origin,get('water')]],'repeats':1}
value.update(extra);return value
for state in range(len(states)):
for position in [[0,64,0],[0,63,0],[0,62,0],[0,63,-1],[1,63,0],[0,63,1],[-1,63,0]]:
initial={(0,64,0):get('water')};initial[tuple(position)]=state
yield case(states=[[*p,s] for p,s in initial.items()])
for search,above,below,legacy,fail in itertools.product([0,1,2,3,4,8,512],range(4),range(4),[False,True],[-1,0,1,2,3,5,9]):
initial=[[0,64+y,0,get('water')] for y in range(-below,above+1)]
yield case(magma(floor_search_range=search),states=initial,legacy=legacy,fail=fail)
for radius,probability,legacy,seed,fail,reject in itertools.product([0,1,2],[0.0,0.1,0.5,1.0],[False,True],
[0,-1,0x123456789abcdef],[-1,0,2,6,8,12,19],[0,1,3]):
yield case(magma(placement_radius_around_floor=radius,placement_probability_per_valid_position=probability),
legacy=legacy,seed=seed,fail=fail,reject=reject,repeats=2)
for legacy in [False,True]:
yield case(magma(placement_radius_around_floor=64,placement_probability_per_valid_position=0.0),legacy=legacy)
for origin,search in itertools.product([[2147483647,2147483647,2147483647],[-2147483648,-2147483648,-2147483648],[-17,-64,-33]],[0,1,2,3,512]):
yield case(magma(floor_search_range=search),origin=origin)
for key,values in [('floor_search_range',[None,-1,0,1,512,513,False,'2',4294967298]),
('placement_radius_around_floor',[None,-1,0,64,65,False,'0']),
('placement_probability_per_valid_position',[None,-1,-0.0,-1e-100,0,1e-100,1,1.0000000001,1.01,False,'1'])]:
for value in values:
definition=magma(placement_probability_per_valid_position=0.0);definition[key]=value;yield case(definition)
definition=magma();del definition[key];yield case(definition)
for legacy,seed,fail,reject in itertools.product([False,True],[0,-1],[-1,0,5,12],[0,3]):
placed={'feature':magma(placement_radius_around_floor=1,placement_probability_per_valid_position=0.5),'placement':[{'type':'count','count':2}]}
yield case(placed,mode='placed',legacy=legacy,seed=seed,fail=fail,reject=reject)
yield case({'type':'overlay','features':[placed,{'feature':'horizon:moss','placement':[]}]},legacy=legacy,seed=seed,fail=fail,reject=reject)
if __name__=='__main__':
harness.run(corpus,'rust-underwater-magma-parity',__file__,
'Native UnderwaterMagmaFeature codecs and Column.scan floor selection. Initial water identity, upward scan before downward scan, repeated boundary reads, all scan endpoints, every state at origin/floor/below and each horizontal neighbor, exact full-face occlusion, cubic traversal, per-position float draws before block tests, flags 2, rejected writes and partial failures are compared. Both random modes include the complete radius-64 cube with probability zero (2146689 draws), wrapped radius-zero columns and nested placement. Rust allows the entire valid codec radius domain and bounds pathological overflow iteration at 2^23 visits. Actual chunk update callbacks, magma gameplay and full world generation remain pending.')