codename-routes/routes-native/src/stateserver/world.rs

114 lines
4.1 KiB
Rust

use gdnative::prelude::*;
mod gen;
mod tiles;
pub struct World {
pub xsize: usize,
pub ysize: usize,
pub zsize: usize,
tiles: Vec<Vec<Vec<tiles::Tiletypes>>>,
seed: String,
tileattributes: tiles::Attributelists,
}
impl World {
pub fn get_tile_at(&self, x: usize, y: usize, z: usize) -> u16 {
self.tiles[x][y][z] as u16
}
pub fn is_tile_hidden(&self, x: usize, y: usize, z: usize) -> bool {
if x == self.xsize - 1 || y == self.ysize - 1 || z == self.zsize - 1 {
return false;
}
if !tiles::Tile::new(self.tiles[x + 1][y][z]).hide_top_left
|| !tiles::Tile::new(self.tiles[x][y + 1][z]).hide_top_right
|| !tiles::Tile::new(self.tiles[x][y][z + 1]).hide_below
{
return false;
}
true
}
pub fn generate(&mut self) -> Vector3Array {
self.tiles = get_vec3(self.xsize, self.ysize, self.zsize);
let mut rng = gen::get_rng(self.seed.to_owned());
let noisemap = gen::get_noise(&mut rng, (self.xsize, self.ysize));
// return array with all changed tiles, needs rework
let mut ret: Vector3Array = Vector3Array::new();
for x in 0..self.xsize {
for y in 0..self.ysize {
ret.push(Vector3::new(x as f32, y as f32, 0.0));
if noisemap.get_value(x, y) > 0.5 {
self.tiles[x][y][0] = tiles::Tiletypes::Rock;
self.tiles[x][y][1] = tiles::Tiletypes::Rock;
ret.push(Vector3::new(x as f32, y as f32, 1.0));
self.tiles[x][y][2] = tiles::Tiletypes::Rock;
ret.push(Vector3::new(x as f32, y as f32, 2.0));
self.tiles[x][y][3] = tiles::Tiletypes::Rock;
ret.push(Vector3::new(x as f32, y as f32, 3.0));
if noisemap.get_value(x, y) > 0.6 {
self.tiles[x][y][4] = tiles::Tiletypes::Rock;
ret.push(Vector3::new(x as f32, y as f32, 4.0));
}
if noisemap.get_value(x, y) > 0.7 {
self.tiles[x][y][5] = tiles::Tiletypes::Rock;
ret.push(Vector3::new(x as f32, y as f32, 5.0));
}
}
else if noisemap.get_value(x, y) > 0.2 {
self.tiles[x][y][0] = tiles::Tiletypes::Dirt;
if noisemap.get_value(x, y) > 0.3 {
self.tiles[x][y][1] = tiles::Tiletypes::Dirt;
ret.push(Vector3::new(x as f32, y as f32, 1.0));
self.tiles[x][y][2] = tiles::Tiletypes::Grass;
ret.push(Vector3::new(x as f32, y as f32, 2.0));
}
else {
self.tiles[x][y][1] = tiles::Tiletypes::Grass;
ret.push(Vector3::new(x as f32, y as f32, 1.0));
}
}
else if noisemap.get_value(x, y) > 0.0 {
self.tiles[x][y][0] = tiles::Tiletypes::Grass;
}
else if noisemap.get_value(x, y) > -0.1 {
self.tiles[x][y][0] = tiles::Tiletypes::Sand;
}
else {
self.tiles[x][y][0] = tiles::Tiletypes::WaterSlab;
}
}
}
ret
}
pub fn new(xsize: usize, ysize: usize, zsize: usize, seed: String) -> World {
World {
xsize,
ysize,
zsize,
tiles: get_vec3(xsize, ysize, zsize),
seed,
tileattributes: tiles::Attributelists::new(),
}
}
}
fn get_vec3(xsize: usize, ysize: usize, zsize: usize) -> Vec<Vec<Vec<tiles::Tiletypes>>> {
let mut zvec: Vec<tiles::Tiletypes> = Vec::with_capacity(zsize);
zvec.resize(zsize, tiles::Tiletypes::Air);
let mut yvec: Vec<Vec<tiles::Tiletypes>> = Vec::with_capacity(ysize);
yvec.resize(ysize, zvec.clone());
let mut xvec: Vec<Vec<Vec<tiles::Tiletypes>>> = Vec::with_capacity(xsize);
xvec.resize(ysize, yvec.clone());
yvec.push(zvec);
xvec.push(yvec);
xvec
}