diff --git a/feather/server/src/main.rs b/feather/server/src/main.rs index 615857028..5f5dfcabb 100644 --- a/feather/server/src/main.rs +++ b/feather/server/src/main.rs @@ -64,7 +64,7 @@ fn init_world_source(game: &mut Game, config: &Config) { // world otherwise. This is a placeholder: // we don't have proper world generation yet. - let seed = 42; // FIXME: load from the level file + let seed = worldgen::seed_from_string(&config.world.seed); let generator: Arc = match &config.world.generator[..] { "flat" => Arc::new(SuperflatWorldGenerator::new( diff --git a/feather/worldgen/src/lib.rs b/feather/worldgen/src/lib.rs index 7737747e2..277af64c2 100644 --- a/feather/worldgen/src/lib.rs +++ b/feather/worldgen/src/lib.rs @@ -364,6 +364,18 @@ impl BiomeGenerator for StaticBiomeGenerator { } } +pub fn seed_from_string(s: &str) -> u64 { + s.parse().unwrap_or_else(|_| { + if s.is_empty() { + rand::random() + } else { + s.chars() + .fold(0i32, |val, ch| val.wrapping_mul(31).wrapping_add(ch as i32)) + as i64 + } + }) as u64 +} + #[cfg(test)] mod tests { use super::*; @@ -468,4 +480,10 @@ mod tests { assert_eq!(biomes.get_at_block(-1, 0, -1), Biome::Plains); assert_eq!(biomes.get_at_block(-1, 0, 0), Biome::BirchForest); } + + #[test] + fn test_seed_from_config() { + assert_eq!(seed_from_string("42"), 42); + assert_eq!(seed_from_string("Hello"), 69609650); + } }