Skip to main content

steel_worldgen/biomes/
mod.rs

1mod biome_source;
2mod climate_sampler;
3mod nether_climate_sampler;
4
5use sha2::{Digest, Sha256};
6
7pub use biome_source::{
8    BiomeSourceKind, ChunkBiomeSampler, EndBiomeSource, NetherBiomeSource, OverworldBiomeSource,
9};
10pub use climate_sampler::OverworldClimateSampler;
11pub use nether_climate_sampler::NetherClimateSampler;
12
13/// Hashes the world seed into the value biome sampling actually uses, so
14/// nearby seeds don't produce visibly correlated biome layouts.
15#[must_use]
16pub fn obfuscate_biome_seed(seed: i64) -> i64 {
17    let mut hasher = Sha256::new();
18    hasher.update(seed.to_le_bytes());
19    let result = hasher.finalize();
20    let mut bytes = [0; 8];
21    bytes.copy_from_slice(&result[..8]);
22    i64::from_le_bytes(bytes)
23}
24
25#[cfg(test)]
26mod tests {
27    use super::obfuscate_biome_seed;
28
29    #[test]
30    fn obfuscate_biome_seed_matches_guava_hash_long() {
31        assert_eq!(obfuscate_biome_seed(0), 8_794_265_229_978_523_055);
32        assert_eq!(obfuscate_biome_seed(1), -6_467_378_160_175_308_932);
33        assert_eq!(obfuscate_biome_seed(12_345), 293_737_985_876_514_017);
34        assert_eq!(obfuscate_biome_seed(-1), 6_759_447_113_877_070_610);
35    }
36}