4 use integral_geometry::Size; |
4 use integral_geometry::Size; |
5 use png::Decoder; |
5 use png::Decoder; |
6 use std::collections::HashSet; |
6 use std::collections::HashSet; |
7 use std::fs::File; |
7 use std::fs::File; |
8 use std::io::{BufReader, Result}; |
8 use std::io::{BufReader, Result}; |
9 use std::path::Path; |
9 use std::path::{Path, PathBuf}; |
10 |
10 |
11 #[derive(Clone)] |
11 #[derive(Clone)] |
12 pub struct EdgeDescription { |
12 pub struct EdgeDescription { |
13 pub name: String, |
13 pub name: String, |
14 pub reversed: Option<bool>, |
14 pub reversed: Option<bool>, |
51 pub wrap: bool, |
51 pub wrap: bool, |
52 } |
52 } |
53 |
53 |
54 pub struct WavefrontCollapseLandGenerator { |
54 pub struct WavefrontCollapseLandGenerator { |
55 pub template: TemplateDescription, |
55 pub template: TemplateDescription, |
|
56 data_path: PathBuf, |
56 } |
57 } |
57 |
58 |
58 impl WavefrontCollapseLandGenerator { |
59 impl WavefrontCollapseLandGenerator { |
59 pub fn new(template: TemplateDescription) -> Self { |
60 pub fn new(template: TemplateDescription, data_path: &Path) -> Self { |
60 Self { template } |
61 Self { template, data_path: data_path.to_owned() } |
61 } |
62 } |
62 |
63 |
63 fn load_image_tiles<T: Copy + PartialEq + Default>( |
64 fn load_image_tiles<T: Copy + PartialEq + Default>( |
|
65 &self, |
64 parameters: &LandGenerationParameters<T>, |
66 parameters: &LandGenerationParameters<T>, |
65 tile_description: &TileDescription, |
67 tile_description: &TileDescription, |
66 ) -> Result<Vec<TileImage<T, String>>> { |
68 ) -> Result<Vec<TileImage<T, String>>> { |
67 let mut result = Vec::new(); |
69 let mut result = Vec::new(); |
68 |
70 |
69 let file = File::open( |
71 let file = File::open( |
70 Path::new("../share/hedgewars/Data/Tiles") |
72 self.data_path.join("Tiles") |
71 .join(&tile_description.name) |
73 .join(&tile_description.name) |
72 .as_path(), |
74 .as_path(), |
73 )?; |
75 )?; |
74 let decoder = Decoder::new(BufReader::new(file)); |
76 let decoder = Decoder::new(BufReader::new(file)); |
75 let mut reader = decoder.read_info().unwrap(); |
77 let mut reader = decoder.read_info().unwrap(); |
158 parameters: &LandGenerationParameters<T>, |
160 parameters: &LandGenerationParameters<T>, |
159 ) -> Vec<TileImage<T, String>> { |
161 ) -> Vec<TileImage<T, String>> { |
160 let mut result = Vec::new(); |
162 let mut result = Vec::new(); |
161 |
163 |
162 for tile_description in self.template.tiles.iter() { |
164 for tile_description in self.template.tiles.iter() { |
163 if let Ok(mut tiles) = Self::load_image_tiles(parameters, tile_description) { |
165 if let Ok(mut tiles) = self.load_image_tiles(parameters, tile_description) { |
164 result.append(&mut tiles); |
166 result.append(&mut tiles); |
165 } else { |
167 } else { |
166 eprintln!("Failed to load a tile!"); |
168 eprintln!("Failed to load a tile!"); |
167 } |
169 } |
168 } |
170 } |