pub mod archive;
pub mod error;
pub mod sprites;
pub mod text;
use error::{Result, WszError};
#[derive(Debug, Clone)]
pub struct Wsz {
sprites: std::collections::HashMap<String, sprites::SpriteImage>,
vis_colors: text::viscolor::VisColors,
pledit: text::pledit::PleditSettings,
regions: text::region::Regions,
}
impl Wsz {
pub fn from_file_path<P: AsRef<std::path::Path>>(path: P) -> Result<Self> {
let contents = archive::unpack_wsz(path)?;
Self::from_archive(&contents)
}
pub fn from_bytes(data: &[u8]) -> Result<Self> {
let contents = archive::unpack_wsz_bytes(data)?;
Self::from_archive(&contents)
}
pub fn from_archive(archive: &archive::WszArchive) -> Result<Self> {
let sprite_manager = sprites::SpriteManager::new();
let sprites = sprite_manager.extract_all_sprites_from_archive(archive)?;
let vis_colors = match text::viscolor::VisColors::from_archive(archive) {
Ok(vis_colors) => vis_colors,
Err(WszError::NotFound(_)) => text::viscolor::VisColors::default(),
Err(e) => {
return Err(e);
}
};
let pledit = match text::pledit::PleditSettings::from_archive(archive) {
Ok(pledit) => pledit,
Err(WszError::NotFound(_)) => text::pledit::PleditSettings::default(),
Err(e) => {
return Err(e);
}
};
let regions = match text::region::Regions::from_archive(archive) {
Ok(regions) => regions,
Err(_) => text::region::Regions::default(),
};
Ok(Self {
sprites,
vis_colors,
pledit,
regions,
})
}
pub fn get_sprite(&self, name: &str) -> Option<&sprites::SpriteImage> {
self.sprites.get(name)
}
pub fn get_sprites(&self) -> &std::collections::HashMap<String, sprites::SpriteImage> {
&self.sprites
}
pub fn get_vis_colors(&self) -> &text::viscolor::VisColors {
&self.vis_colors
}
pub fn get_pledit_settings(&self) -> &text::pledit::PleditSettings {
&self.pledit
}
pub fn get_regions(&self) -> &text::region::Regions {
&self.regions
}
pub fn render_screenshot(&self) -> Result<sprites::WindowImage> {
let mut window_defs = sprites::SpriteWindowManager::new();
if let Some(bg_color) = self.pledit.normal_bg {
window_defs.set_bg_color(bg_color);
}
let window = window_defs.draw_all_sprites(&self.sprites)?;
Ok(window)
}
}