rust/lib-hwengine-future/src/lib.rs
branchtransitional_engine
changeset 15904 33798b649d9c
parent 15901 f39f0f614dbf
child 15905 022ec6b916b7
--- a/rust/lib-hwengine-future/src/lib.rs	Wed Jan 04 10:40:40 2023 +0100
+++ b/rust/lib-hwengine-future/src/lib.rs	Wed Jan 04 10:42:21 2023 +0100
@@ -1,5 +1,10 @@
 use integral_geometry::{Point, Size};
 use land2d;
+use landgen::{template_based::TemplatedLandGenerator, LandGenerationParameters, LandGenerator};
+use lfprng::LaggedFibonacciPRNG;
+use mapgen::{theme::Theme, MapGenerator};
+use std::fs;
+use std::{ffi::CStr, path::Path};
 
 #[repr(C)]
 pub struct GameField {
@@ -8,7 +13,19 @@
 }
 
 #[no_mangle]
-pub extern "C" fn create_game_field(width: u32, height: u32) -> *mut GameField {
+pub extern "C" fn get_game_field_parameters(
+    game_field: &GameField,
+    width: *mut i32,
+    height: *mut i32,
+) {
+    unsafe {
+        *width = game_field.collision.width() as i32;
+        *height = game_field.collision.height() as i32;
+    }
+}
+
+#[no_mangle]
+pub extern "C" fn create_empty_game_field(width: u32, height: u32) -> *mut GameField {
     let game_field = Box::new(GameField {
         collision: land2d::Land2D::new(Size::new(width as usize, height as usize), 0),
         pixels: land2d::Land2D::new(Size::new(width as usize, height as usize), 0),
@@ -18,6 +35,53 @@
 }
 
 #[no_mangle]
+pub extern "C" fn generate_templated_game_field(
+    feature_size: u32,
+    seed: *const i8,
+    data_path: *const i8,
+    theme_name: *const i8,
+) -> *mut GameField {
+    let data_path: &str = unsafe { CStr::from_ptr(data_path) }.to_str().unwrap();
+    let data_path = Path::new(&data_path);
+
+    let seed: &str = unsafe { CStr::from_ptr(seed) }.to_str().unwrap();
+    let theme_name: &str = unsafe { CStr::from_ptr(theme_name) }.to_str().unwrap();
+
+    let mut random_numbers_gen = LaggedFibonacciPRNG::new(seed.as_bytes());
+
+    let yaml_templates =
+        fs::read_to_string(data_path.join(Path::new("map_templates.yaml")).as_path())
+            .expect("Error reading map templates file");
+    let mut map_gen = MapGenerator::new();
+    map_gen.import_yaml_templates(&yaml_templates);
+
+    let distance_divisor = feature_size.pow(2) / 8 + 10;
+    let params = LandGenerationParameters::new(0u16, 0x8000u16, distance_divisor, false, false);
+    let template = map_gen
+        .get_template("medium", &mut random_numbers_gen)
+        .expect("Error reading map templates file")
+        .clone();
+    let landgen = TemplatedLandGenerator::new(template);
+    let collision = landgen.generate_land(&params, &mut random_numbers_gen);
+
+    let theme = Theme::load(
+        data_path
+            .join(Path::new("Themes"))
+            .join(Path::new(theme_name))
+            .as_path(),
+    )
+    .unwrap();
+    let pixels = map_gen.make_texture(&collision, &params, &theme);
+
+    let game_field = Box::new(GameField {
+        collision,
+        pixels: pixels.into(),
+    });
+
+    Box::leak(game_field)
+}
+
+#[no_mangle]
 pub extern "C" fn land_get(game_field: &mut GameField, x: i32, y: i32) -> u16 {
     game_field.collision.map(y, x, |p| *p)
 }