#![cfg_attr(feature = "set-timestamps", allow(stable_features))]
#![cfg_attr(feature = "set-timestamps", feature(file_set_times))]
#[cfg(feature = "png")]
extern crate png;
extern crate unciv;
use std::fs::File;
#[cfg(feature = "png")]
use std::io::Read;
#[cfg(feature = "png")]
use std::io::Seek;
use std::io::Write;
#[cfg(feature = "png")]
pub fn save_rim_image(entry : &unciv::ZfsEntry, reader : &mut (impl Read + Seek)) -> std::io::Result<()> {
let rim_image = entry.read_rim_image(reader)?;
let out_file = File::create(format!("{}.png", &entry.name))?;
{
let mut png_encoder = png::Encoder::new(&out_file, rim_image.width as u32, rim_image.height as u32);
png_encoder.set_color(png::ColorType::RGBA);
png_encoder.set_depth(png::BitDepth::Eight);
let mut px_writer = png_encoder.write_header()?;
px_writer.write_image_data(&rim_image.to_rgba_bytes())?;
}
#[cfg(feature = "set-timestamps")]
out_file.set_modified(entry.timestamp)?;
Ok(())
}
fn main() {
let args : Vec<std::string::String> = std::env::args().collect();
if args.len() != 2 {
println!("unciv: An Uncivilized File Extractor for Civilization: Call to Power");
println!("By David Gow <david@davidgow.net>");
println!("");
println!("Usage: unciv <zfs-file>");
return;
}
println!("File: {}", &args[1]);
let mut file = File::open(&args[1]).unwrap();
let zfs_file = unciv::ZfsFile::from_stream(&mut file).unwrap();
for entry in zfs_file.files {
if cfg!(feature = "png") && entry.name.ends_with(".rim") {
#[cfg(feature = "png")]
save_rim_image(&entry, &mut file).unwrap();
} else {
let data = entry.read_data(&mut file).unwrap();
println!("Extracting file \"{}\"…", entry.name);
let mut out_file = File::create(entry.name).unwrap();
out_file.write_all(&data).unwrap();
#[cfg(feature = "set-timestamps")]
out_file.set_modified(entry.timestamp).unwrap();
}
}
}