2 |
2 |
3 use landgen::{ |
3 use landgen::{ |
4 wavefront_collapse::generator::{ |
4 wavefront_collapse::generator::{ |
5 TemplateDescription as WfcTemplate, |
5 TemplateDescription as WfcTemplate, |
6 }, |
6 }, |
|
7 outline_template_based::outline_template::OutlineTemplate, |
7 LandGenerationParameters, LandGenerator, |
8 LandGenerationParameters, LandGenerator, |
8 }; |
9 }; |
9 use lfprng::LaggedFibonacciPRNG; |
10 use lfprng::LaggedFibonacciPRNG; |
10 use mapgen::{theme::Theme, MapGenerator}; |
11 use mapgen::{theme::Theme, MapGenerator}; |
11 use std::fs; |
12 use std::fs; |
60 let template_type: &str = unsafe { CStr::from_ptr(template_type) }.to_str().unwrap(); |
61 let template_type: &str = unsafe { CStr::from_ptr(template_type) }.to_str().unwrap(); |
61 |
62 |
62 let mut random_numbers_gen = LaggedFibonacciPRNG::new(seed.as_bytes()); |
63 let mut random_numbers_gen = LaggedFibonacciPRNG::new(seed.as_bytes()); |
63 |
64 |
64 let yaml_templates = |
65 let yaml_templates = |
|
66 fs::read_to_string(data_path.join(Path::new("map_templates.yaml")).as_path()) |
|
67 .expect("Error reading map templates file"); |
|
68 let mut map_gen = MapGenerator::<OutlineTemplate>::new(data_path); |
|
69 map_gen.import_yaml_templates(&yaml_templates); |
|
70 |
|
71 let distance_divisor = feature_size.pow(2) / 8 + 10; |
|
72 let params = LandGenerationParameters::new(0u16, 0x8000u16, distance_divisor, false, false); |
|
73 let template = map_gen |
|
74 .get_template(template_type, &mut random_numbers_gen) |
|
75 .expect("Error reading outline templates file") |
|
76 .clone(); |
|
77 let landgen = map_gen.build_generator(template); |
|
78 let collision = landgen.generate_land(¶ms, &mut random_numbers_gen); |
|
79 let size = collision.size().size(); |
|
80 |
|
81 let game_field = Box::new(GameField { |
|
82 collision, |
|
83 pixels: land2d::Land2D::new(&size, 0), |
|
84 landgen_parameters: Some(params), |
|
85 }); |
|
86 |
|
87 Box::leak(game_field) |
|
88 } |
|
89 |
|
90 #[no_mangle] |
|
91 pub extern "C" fn generate_wfc_templated_game_field( |
|
92 feature_size: u32, |
|
93 seed: *const i8, |
|
94 template_type: *const i8, |
|
95 data_path: *const i8, |
|
96 ) -> *mut GameField { |
|
97 let data_path: &str = unsafe { CStr::from_ptr(data_path) }.to_str().unwrap(); |
|
98 let data_path = Path::new(&data_path); |
|
99 |
|
100 let seed: &str = unsafe { CStr::from_ptr(seed) }.to_str().unwrap(); |
|
101 let template_type: &str = unsafe { CStr::from_ptr(template_type) }.to_str().unwrap(); |
|
102 |
|
103 let mut random_numbers_gen = LaggedFibonacciPRNG::new(seed.as_bytes()); |
|
104 |
|
105 let yaml_templates = |
65 fs::read_to_string(data_path.join(Path::new("wfc_templates.yaml")).as_path()) |
106 fs::read_to_string(data_path.join(Path::new("wfc_templates.yaml")).as_path()) |
66 .expect("Error reading map templates file"); |
107 .expect("Error reading map templates file"); |
67 let mut map_gen = MapGenerator::<WfcTemplate>::new(data_path); |
108 let mut map_gen = MapGenerator::<WfcTemplate>::new(data_path); |
68 map_gen.import_yaml_templates(&yaml_templates); |
109 map_gen.import_yaml_templates(&yaml_templates); |
69 |
110 |
70 let distance_divisor = feature_size.pow(2) / 8 + 10; |
111 let distance_divisor = feature_size.pow(2) / 8 + 10; |
71 let params = LandGenerationParameters::new(0u16, 0x8000u16, distance_divisor, false, false); |
112 let params = LandGenerationParameters::new(0u16, 0x8000u16, distance_divisor, false, false); |
72 let template = map_gen |
113 let template = map_gen |
73 .get_template(template_type, &mut random_numbers_gen) |
114 .get_template(template_type, &mut random_numbers_gen) |
74 .expect("Error reading templates file") |
115 .expect("Error reading wfc templates file") |
75 .clone(); |
116 .clone(); |
76 let landgen = map_gen.build_generator(template); |
117 let landgen = map_gen.build_generator(template); |
77 let collision = landgen.generate_land(¶ms, &mut random_numbers_gen); |
118 let collision = landgen.generate_land(¶ms, &mut random_numbers_gen); |
78 let size = collision.size().size(); |
119 let size = collision.size().size(); |
79 |
120 |