mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'build.rs')
| -rw-r--r-- | build.rs | 87 |
1 files changed, 29 insertions, 58 deletions
@@ -1,67 +1,38 @@ +#![feature(let_chains)] +use image::codecs::png::PngDecoder; +use image::DynamicImage; use std::fs::File; -use std::io::prelude::*; -use std::io::{Seek, Write}; +use std::io::{BufReader, Write as _}; use std::iter::Iterator; use std::path::Path; -use walkdir::{DirEntry, WalkDir}; -use zip::result::ZipError; -use zip::write::FileOptions; +use walkdir::WalkDir; -fn zip_dir<T>( - it: &mut dyn Iterator<Item = DirEntry>, - prefix: &str, - writer: T, -) -> zip::result::ZipResult<()> -where - T: Write + Seek, -{ - let mut zip = zip::ZipWriter::new(writer); - let mut options = FileOptions::default() - .compression_method(zip::CompressionMethod::Zstd) - .unix_permissions(0o755); - if let Ok(v) = std::env::var("COMPRESS") { - if v == "1" { - options = options.compression_level(Some(22)); - } - } - - let mut buffer = Vec::new(); - for entry in it { - let path = entry.path(); - let name = path.strip_prefix(Path::new(prefix)).unwrap(); - - // Write file or directory explicitly - // Some unzip tools unzip files with directory paths correctly, some do not! - if path.is_file() { - println!("adding file {path:?} as {name:?} ..."); - #[allow(deprecated)] - zip.start_file_from_path(name, options)?; - let mut f = File::open(path)?; - - f.read_to_end(&mut buffer)?; - zip.write_all(&buffer)?; - buffer.clear(); - } else if !name.as_os_str().is_empty() { - // Only if not root! Avoids path spec / warning - // and mapname conversion failed error on unzip - println!("adding dir {path:?} as {name:?} ..."); - #[allow(deprecated)] - zip.add_directory_from_path(name, options)?; - } - } - zip.finish()?; - Result::Ok(()) -} - -fn main() -> Result<(), ZipError> { +fn main() { let _ = std::fs::remove_dir_all("target/out"); let walkdir = WalkDir::new("assets"); - let it = walkdir.into_iter(); println!("cargo:rerun-if-changed=assets/"); println!("cargo:rerun-if-changed=build.rs"); - zip_dir( - &mut it.filter_map(|e| e.ok()), - "assets", - File::create(std::env::var("OUT_DIR").unwrap() + "/asset").unwrap(), - ) + let o = std::env::var("OUT_DIR").unwrap(); + let mut f = File::create(Path::new(&o).join("asset")).unwrap(); + let mut n = 1usize; + f.write_all(b"fn put(map: &DashMap<String, RgbaImage>) {") + .unwrap(); + let mut s = String::new(); // idk write_all / write wasnt working + for e in walkdir.into_iter().filter_map(|e| e.ok()) { + let path = e.path(); + if path.is_file() && let Some(e) = path.extension() && e == "png" { + let p = DynamicImage::from_decoder(PngDecoder::new(BufReader::new(File::open(path).unwrap())).unwrap()).unwrap().into_rgba8(); + let x = p.width(); + let y = p.height(); + let path = path.with_extension(""); + let path = path.file_name().unwrap().to_str().unwrap(); + let mut f = File::create(Path::new(&o).join(n.to_string())).unwrap(); + f.write_all(&p.into_raw()).unwrap(); + println!("writing {path:?}"); + s+= &format!("\tmap.insert(String::from(\"{path}\"), RgbaImage::from_vec({x}, {y}, include_bytes!(concat!(env!(\"OUT_DIR\"), \"/{n}\")).to_vec()).unwrap());\n"); + n += 1; + } + } + f.write_all(s.as_bytes()).unwrap(); + f.write_all(b"}").unwrap(); } |