diff --git a/godot/native/libroutes_native.so b/godot/native/libroutes_native.so index 1258ac6..b0e1836 100755 Binary files a/godot/native/libroutes_native.so and b/godot/native/libroutes_native.so differ diff --git a/godot/world/StateApi.gd b/godot/world/StateApi.gd index ca86319..0fc8951 100644 --- a/godot/world/StateApi.gd +++ b/godot/world/StateApi.gd @@ -1,7 +1,7 @@ extends Node -export var xsize = 16 -export var ysize = 16 +export var xsize = 256 +export var ysize = 256 export var zsize = 3 export var cityname = "night city" diff --git a/routes-native/src/stateserver/world.rs b/routes-native/src/stateserver/world.rs index a5bcf24..fd37d65 100644 --- a/routes-native/src/stateserver/world.rs +++ b/routes-native/src/stateserver/world.rs @@ -1,6 +1,6 @@ use gdnative::prelude::*; use rand::prelude::StdRng; -use rand::prelude::*; +use rand::seq::SliceRandom; use rand_seeder::Seeder; mod tiles; @@ -37,14 +37,30 @@ impl World { // fill edges with water for x in 0..self.ysize { - self.tiles[x][0][0] = tiles::Tiletypes::WaterSlab; - self.tiles[x][self.ysize - 1][0] = tiles::Tiletypes::WaterSlab; + self.tiles[x][0][0] = tiles::Tiletypes::WaterSlab; + self.tiles[x][self.ysize - 1][0] = tiles::Tiletypes::WaterSlab; } for y in 0..self.xsize { self.tiles[0][y][0] = tiles::Tiletypes::WaterSlab; self.tiles[self.xsize - 1][y][0] = tiles::Tiletypes::WaterSlab; } + for x in 1..self.xsize - 1 { + for y in 1..self.ysize - 1 { + if self.tile_is_next_to(x, y, 0, tiles::Tiletypes::WaterSlab){ + let available = vec![tiles::Tiletypes::WaterSlab, tiles::Tiletypes::Sand]; + self.tiles[x][y][0] = available.choose(&mut rng).unwrap().to_owned(); + } + else if self.tile_is_next_to(x, y, 0, tiles::Tiletypes::Sand) { + let available = vec![tiles::Tiletypes::Grass, tiles::Tiletypes::Sand]; + self.tiles[x][y][0] = available.choose(&mut rng).unwrap().to_owned(); + } + else { + self.tiles[x][y][0] = tiles::Tiletypes::Air; + } + } + } + let mut ret: Vector3Array = Vector3Array::new(); for x in 0..self.xsize { for y in 0..self.ysize { @@ -56,6 +72,17 @@ impl World { ret } + fn tile_is_next_to(&self, x: usize, y: usize, z: usize, neighbor: tiles::Tiletypes) -> bool { + if self.tiles[x - 1][y - 1][z] == neighbor + || self.tiles[x - 1][y][z] == neighbor + || self.tiles[x][y + 1][z] == neighbor + || self.tiles[x + 1][y + 1][z] == neighbor + { + return true; + } + false + } + pub fn new(xsize: usize, ysize: usize, zsize: usize, seed: String) -> World { World { xsize,