mindustry logic execution, map- and schematic- parsing and rendering
Diffstat (limited to 'build.rs')
-rw-r--r--build.rs87
1 files changed, 29 insertions, 58 deletions
diff --git a/build.rs b/build.rs
index daa0ccd..ab1cc61 100644
--- a/build.rs
+++ b/build.rs
@@ -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();
}