use std::collections::HashMap;
use std::fs;
use serde::Deserialize;
use pixels_graphics_lib::image::Image;
use crate::{convert_image, ImageWrapperError};
use crate::ImageWrapperError::{TileError, TilesetFileError, TilesetFormatError, TilesetImageError};
#[derive(Debug, Deserialize, Clone, Eq, PartialEq)]
pub struct BasicTileset {
name: Option<String>,
image_file: String,
tile_sizes: TilesetSize,
tiles: Vec<TilesetTile>,
}
#[derive(Debug, Deserialize, Clone, Eq, PartialEq)]
struct TilesetSize {
width: usize,
height: usize,
}
#[derive(Debug, Deserialize, Clone, Eq, PartialEq)]
struct TilesetTile {
tile_id: String,
x: usize,
y: usize,
}
impl BasicTileset {
pub fn load_from_file(path: &str) -> Result<HashMap<String, Image>, ImageWrapperError> {
let mut map = HashMap::new();
let json = fs::read_to_string(path).map_err(|err| TilesetFileError(err))?;
let tileset: BasicTileset = serde_json::from_str(&json).map_err(|err| TilesetFormatError(err.to_string()))?;
let tileset_image = image::open(&tileset.image_file)
.map_err(|err| TilesetImageError(err))?;
for tile in tileset.tiles {
let image = convert_image(tileset_image.crop_imm(
(tile.x * tileset.tile_sizes.width) as u32,
(tile.y * tileset.tile_sizes.height) as u32,
tileset.tile_sizes.width as u32,
tileset.tile_sizes.height as u32))?;
map.insert(tile.tile_id, image);
}
Ok(map)
}
}