2022-05-01 21:49:48 +00:00
|
|
|
use gdnative::prelude::*;
|
2022-05-01 20:23:01 +00:00
|
|
|
|
2022-05-19 17:12:10 +00:00
|
|
|
use self::gen::GameRng;
|
|
|
|
|
2022-05-03 22:06:50 +00:00
|
|
|
mod world;
|
2022-05-19 17:01:57 +00:00
|
|
|
mod gen;
|
2022-05-01 21:49:48 +00:00
|
|
|
|
2022-05-01 17:47:50 +00:00
|
|
|
#[derive(NativeClass)]
|
|
|
|
#[inherit(Node)]
|
2022-05-04 10:46:12 +00:00
|
|
|
#[register_with(Self::register)]
|
2022-05-01 20:23:01 +00:00
|
|
|
pub struct StateServer {
|
2022-05-19 17:12:10 +00:00
|
|
|
rng: GameRng,
|
2022-05-04 14:46:58 +00:00
|
|
|
world: world::World,
|
2022-05-01 20:23:01 +00:00
|
|
|
}
|
2022-05-01 17:47:50 +00:00
|
|
|
|
|
|
|
#[methods]
|
|
|
|
impl StateServer {
|
|
|
|
fn new(_owner: &Node) -> Self {
|
2022-05-04 14:46:58 +00:00
|
|
|
StateServer {
|
2022-05-19 17:12:10 +00:00
|
|
|
world: world::World::new(0, 0, 0),
|
|
|
|
rng: gen::get_rng("seed".to_string())
|
2022-05-04 14:46:58 +00:00
|
|
|
}
|
2022-05-03 22:06:50 +00:00
|
|
|
}
|
|
|
|
|
2022-05-01 17:47:50 +00:00
|
|
|
#[export]
|
2022-05-05 09:13:29 +00:00
|
|
|
fn _ready(&self, _owner: &Node) {}
|
2022-05-01 17:47:50 +00:00
|
|
|
|
2022-05-01 20:23:01 +00:00
|
|
|
#[export]
|
2022-05-08 19:52:42 +00:00
|
|
|
fn generate_world(&mut self, _owner: &Node, xsize: usize, ysize: usize, zsize: usize, seed: String) {
|
2022-05-19 17:12:10 +00:00
|
|
|
self.rng = gen::get_rng(seed);
|
|
|
|
self.world = world::World::new(xsize, ysize, zsize);
|
|
|
|
let w = self.world.generate(&mut self.rng);
|
2022-05-05 09:13:29 +00:00
|
|
|
_owner.emit_signal("request_init", &[]);
|
2022-05-05 14:59:11 +00:00
|
|
|
_owner.emit_signal("changed_tiletypes", &[Variant::new(&w)]);
|
2022-05-04 14:46:58 +00:00
|
|
|
}
|
|
|
|
|
2022-05-08 15:56:37 +00:00
|
|
|
#[export]
|
|
|
|
fn get_world_size(&self, _ownser: &Node) -> Vector3 {
|
2022-05-08 18:14:35 +00:00
|
|
|
Vector3::new(
|
|
|
|
self.world.xsize as f32,
|
|
|
|
self.world.ysize as f32,
|
|
|
|
self.world.zsize as f32,
|
|
|
|
)
|
2022-05-08 15:56:37 +00:00
|
|
|
}
|
|
|
|
|
2022-05-04 14:46:58 +00:00
|
|
|
#[export]
|
2022-05-06 19:43:22 +00:00
|
|
|
fn get_tile_at(&self, _owner: &Node, x: usize, y: usize, z: usize) -> u16 {
|
|
|
|
self.world.get_tile_at(x, y, z)
|
2022-05-01 20:23:01 +00:00
|
|
|
}
|
2022-05-08 16:53:27 +00:00
|
|
|
|
|
|
|
#[export]
|
2022-05-08 18:14:35 +00:00
|
|
|
fn is_tile_hidden(&self, _owner: &Node, x: usize, y: usize, z: usize) -> bool {
|
2022-05-08 16:53:27 +00:00
|
|
|
self.world.is_tile_hidden(x, y, z)
|
|
|
|
}
|
2022-05-19 17:35:28 +00:00
|
|
|
|
|
|
|
#[export]
|
|
|
|
fn can_put_tile_at(&self, _owner: &Node, x: usize, y: usize, z: usize, id: usize) -> bool{
|
|
|
|
self.world.can_put_tile_at(x, y, z, id)
|
|
|
|
}
|
|
|
|
|
|
|
|
#[export]
|
2022-05-20 16:18:08 +00:00
|
|
|
fn put_tile_at(&mut self, _owner: &Node, x: usize, y: usize, z: usize, id: usize) {
|
|
|
|
let changed = self.world.put_tile_at(x, y, z, id);
|
|
|
|
_owner.emit_signal("changed_tiletypes", &[Variant::new(&changed)]);
|
2022-05-19 17:35:28 +00:00
|
|
|
}
|
2022-05-04 10:46:12 +00:00
|
|
|
}
|
2022-05-03 22:06:50 +00:00
|
|
|
|
2022-05-04 10:46:12 +00:00
|
|
|
// signals
|
|
|
|
impl StateServer {
|
|
|
|
fn register(builder: &ClassBuilder<StateServer>) {
|
|
|
|
builder
|
2022-05-05 09:13:29 +00:00
|
|
|
.signal("changed_tiletypes")
|
|
|
|
.with_param("tile_positions", VariantType::Vector3Array)
|
2022-05-04 10:46:12 +00:00
|
|
|
.done();
|
2022-05-05 09:13:29 +00:00
|
|
|
builder.signal("request_init").done();
|
2022-05-03 22:06:50 +00:00
|
|
|
}
|
2022-05-01 20:23:01 +00:00
|
|
|
}
|