rust/lib-hwengine-future/src/lib.rs
branchtransitional_engine
changeset 15904 33798b649d9c
parent 15901 f39f0f614dbf
child 15905 022ec6b916b7
equal deleted inserted replaced
15903:230dc46487ea 15904:33798b649d9c
     1 use integral_geometry::{Point, Size};
     1 use integral_geometry::{Point, Size};
     2 use land2d;
     2 use land2d;
       
     3 use landgen::{template_based::TemplatedLandGenerator, LandGenerationParameters, LandGenerator};
       
     4 use lfprng::LaggedFibonacciPRNG;
       
     5 use mapgen::{theme::Theme, MapGenerator};
       
     6 use std::fs;
       
     7 use std::{ffi::CStr, path::Path};
     3 
     8 
     4 #[repr(C)]
     9 #[repr(C)]
     5 pub struct GameField {
    10 pub struct GameField {
     6     collision: land2d::Land2D<u16>,
    11     collision: land2d::Land2D<u16>,
     7     pixels: land2d::Land2D<u32>,
    12     pixels: land2d::Land2D<u32>,
     8 }
    13 }
     9 
    14 
    10 #[no_mangle]
    15 #[no_mangle]
    11 pub extern "C" fn create_game_field(width: u32, height: u32) -> *mut GameField {
    16 pub extern "C" fn get_game_field_parameters(
       
    17     game_field: &GameField,
       
    18     width: *mut i32,
       
    19     height: *mut i32,
       
    20 ) {
       
    21     unsafe {
       
    22         *width = game_field.collision.width() as i32;
       
    23         *height = game_field.collision.height() as i32;
       
    24     }
       
    25 }
       
    26 
       
    27 #[no_mangle]
       
    28 pub extern "C" fn create_empty_game_field(width: u32, height: u32) -> *mut GameField {
    12     let game_field = Box::new(GameField {
    29     let game_field = Box::new(GameField {
    13         collision: land2d::Land2D::new(Size::new(width as usize, height as usize), 0),
    30         collision: land2d::Land2D::new(Size::new(width as usize, height as usize), 0),
    14         pixels: land2d::Land2D::new(Size::new(width as usize, height as usize), 0),
    31         pixels: land2d::Land2D::new(Size::new(width as usize, height as usize), 0),
       
    32     });
       
    33 
       
    34     Box::leak(game_field)
       
    35 }
       
    36 
       
    37 #[no_mangle]
       
    38 pub extern "C" fn generate_templated_game_field(
       
    39     feature_size: u32,
       
    40     seed: *const i8,
       
    41     data_path: *const i8,
       
    42     theme_name: *const i8,
       
    43 ) -> *mut GameField {
       
    44     let data_path: &str = unsafe { CStr::from_ptr(data_path) }.to_str().unwrap();
       
    45     let data_path = Path::new(&data_path);
       
    46 
       
    47     let seed: &str = unsafe { CStr::from_ptr(seed) }.to_str().unwrap();
       
    48     let theme_name: &str = unsafe { CStr::from_ptr(theme_name) }.to_str().unwrap();
       
    49 
       
    50     let mut random_numbers_gen = LaggedFibonacciPRNG::new(seed.as_bytes());
       
    51 
       
    52     let yaml_templates =
       
    53         fs::read_to_string(data_path.join(Path::new("map_templates.yaml")).as_path())
       
    54             .expect("Error reading map templates file");
       
    55     let mut map_gen = MapGenerator::new();
       
    56     map_gen.import_yaml_templates(&yaml_templates);
       
    57 
       
    58     let distance_divisor = feature_size.pow(2) / 8 + 10;
       
    59     let params = LandGenerationParameters::new(0u16, 0x8000u16, distance_divisor, false, false);
       
    60     let template = map_gen
       
    61         .get_template("medium", &mut random_numbers_gen)
       
    62         .expect("Error reading map templates file")
       
    63         .clone();
       
    64     let landgen = TemplatedLandGenerator::new(template);
       
    65     let collision = landgen.generate_land(&params, &mut random_numbers_gen);
       
    66 
       
    67     let theme = Theme::load(
       
    68         data_path
       
    69             .join(Path::new("Themes"))
       
    70             .join(Path::new(theme_name))
       
    71             .as_path(),
       
    72     )
       
    73     .unwrap();
       
    74     let pixels = map_gen.make_texture(&collision, &params, &theme);
       
    75 
       
    76     let game_field = Box::new(GameField {
       
    77         collision,
       
    78         pixels: pixels.into(),
    15     });
    79     });
    16 
    80 
    17     Box::leak(game_field)
    81     Box::leak(game_field)
    18 }
    82 }
    19 
    83