include!(concat!(env!("OUT_DIR"), "/appearances.rs"));
use std::ops::Deref;
use crate::SpriteLayout;
use glam::UVec2;
use serde::{Deserialize, Serialize};
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
#[serde(tag = "type")]
pub enum ContentType {
#[serde(rename = "appearances")]
Appearances { file: String },
#[serde(rename = "staticdata")]
StaticData { file: String },
#[serde(rename = "staticmapdata")]
StaticMapData { file: String },
#[serde(rename = "map")]
Map { file: String },
#[serde(rename = "sprite")]
Sprite(SpriteSheetData),
}
#[derive(Serialize, Deserialize, Debug, Clone, PartialEq)]
pub struct SpriteSheetData {
pub file: String,
#[serde(rename = "spritetype")]
pub layout: SpriteLayout,
#[serde(rename = "firstspriteid")]
pub first_sprite_id: u32,
#[serde(rename = "lastspriteid")]
pub last_sprite_id: u32,
pub area: u32,
}
impl SpriteSheetData {
pub fn has_sprite(&self, sprite_id: u32) -> bool {
self.first_sprite_id <= sprite_id && self.last_sprite_id >= sprite_id
}
pub fn get_sprite_index(&self, sprite_id: u32) -> Option<usize> {
if self.has_sprite(sprite_id) {
Some((sprite_id - self.first_sprite_id) as usize)
} else {
None
}
}
pub fn get_tile_size(&self, tile_size: &UVec2) -> UVec2 {
let width = self.layout.get_width(tile_size);
let height = self.layout.get_height(tile_size);
UVec2::new(width, height)
}
}
#[derive(Debug, Default, Clone)]
pub struct SpriteSheetDataSet(Vec<SpriteSheetData>);
impl Deref for SpriteSheetDataSet {
type Target = Vec<SpriteSheetData>;
fn deref(&self) -> &Self::Target {
&self.0
}
}
impl SpriteSheetDataSet {
pub fn from_content(content: &[ContentType]) -> Self {
let sprite_sheets = content
.iter()
.filter_map(|content_type| match content_type {
ContentType::Sprite(sprite_sheet) => Some(sprite_sheet),
_ => None,
})
.cloned()
.collect::<Vec<_>>();
Self(sprite_sheets)
}
pub fn get_by_sprite_id(&self, sprite_id: u32) -> Option<&SpriteSheetData> {
self.iter().find(|sheet| sheet.has_sprite(sprite_id))
}
}
pub fn is_true(value: Option<bool>) -> bool {
value == Some(true)
}
#[cfg(test)]
mod tests;