Implement underwater magma and preserve signed-zero codec rules
This commit is contained in:
@@ -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."
|
||||
}
|
||||
@@ -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)
|
||||
}
|
||||
}
|
||||
@@ -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,
|
||||
|
||||
@@ -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
@@ -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
@@ -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;
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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.')
|
||||
Reference in New Issue
Block a user