use bevy::prelude::*;
use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Clone, Serialize, Deserialize, Asset, TypePath)]
#[serde(rename_all = "camelCase")]
pub struct SpriteFusionMap {
pub tile_size: u32,
pub map_width: u32,
pub map_height: u32,
pub layers: Vec<SpriteFusionLayer>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpriteFusionLayer {
pub name: String,
#[serde(default)]
pub collider: bool,
pub tiles: Vec<SpriteFusionTile>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct SpriteFusionTile {
pub id: String,
pub x: i32,
pub y: i32,
#[serde(default)]
pub attributes: Option<HashMap<String, serde_json::Value>>,
}
impl SpriteFusionTile {
pub fn tile_id(&self) -> u32 {
self.id.parse().unwrap_or(0)
}
}
#[derive(Component, Debug, Clone)]
pub struct SpriteFusionMapMarker {
pub map: SpriteFusionMap,
}
#[derive(Component, Debug, Clone)]
pub struct SpriteFusionLayerMarker {
pub name: String,
pub index: usize,
pub collider: bool,
}
#[derive(Component, Debug, Clone)]
pub struct TileAttributes(pub HashMap<String, serde_json::Value>);
impl TileAttributes {
pub fn get_str(&self, key: &str) -> Option<&str> {
self.0.get(key).and_then(|v| v.as_str())
}
pub fn get_bool(&self, key: &str) -> Option<bool> {
self.0.get(key).and_then(|v| v.as_bool())
}
pub fn get_i64(&self, key: &str) -> Option<i64> {
self.0.get(key).and_then(|v| v.as_i64())
}
pub fn get_f64(&self, key: &str) -> Option<f64> {
self.0.get(key).and_then(|v| v.as_f64())
}
pub fn contains(&self, key: &str) -> bool {
self.0.contains_key(key)
}
}
#[derive(Component, Debug, Clone, Copy, Default)]
pub struct Collider;