use serde::{Deserialize, Serialize};
use std::collections::HashMap;
#[derive(Debug, Serialize, Deserialize)]
pub struct Project {
#[serde(rename = "bgColor")]
pub bg_color: String,
#[serde(rename = "defaultGridSize")]
pub default_grid_size: i64,
#[serde(rename = "defaultLevelBgColor")]
pub default_level_bg_color: String,
#[serde(rename = "defaultPivotX")]
pub default_pivot_x: f64,
#[serde(rename = "defaultPivotY")]
pub default_pivot_y: f64,
#[serde(rename = "defs")]
pub defs: Option<Definitions>,
#[serde(rename = "exportTiled")]
pub export_tiled: bool,
#[serde(rename = "jsonVersion")]
pub json_version: String,
#[serde(rename = "levels")]
pub levels: Vec<Level>,
#[serde(rename = "minifyJson")]
pub minify_json: bool,
#[serde(rename = "nextUid")]
pub next_uid: i64,
#[serde(rename = "worldGridHeight")]
pub world_grid_height: i64,
#[serde(rename = "worldGridWidth")]
pub world_grid_width: i64,
#[serde(rename = "worldLayout")]
pub world_layout: String,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Definitions {
#[serde(rename = "entities")]
pub entities: Vec<EntityDef>,
#[serde(rename = "enums")]
pub enums: Vec<EnumDef>,
#[serde(rename = "externalEnums")]
pub external_enums: Vec<EnumDef>,
#[serde(rename = "layers")]
pub layers: Vec<LayerDef>,
#[serde(rename = "tilesets")]
pub tilesets: Vec<TilesetDef>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct EntityDef {
#[serde(rename = "color")]
pub color: String,
#[serde(rename = "fieldDefs")]
pub field_defs: Vec<FieldDef>,
#[serde(rename = "height")]
pub height: i64,
#[serde(rename = "identifier")]
pub identifier: String,
#[serde(rename = "limitBehavior")]
pub limit_behavior: String,
#[serde(rename = "maxPerLevel")]
pub max_per_level: i64,
#[serde(rename = "pivotX")]
pub pivot_x: f64,
#[serde(rename = "pivotY")]
pub pivot_y: f64,
#[serde(rename = "renderMode")]
pub render_mode: String,
#[serde(rename = "showName")]
pub show_name: bool,
#[serde(rename = "tileId")]
pub tile_id: Option<i64>,
#[serde(rename = "tileRenderMode")]
pub tile_render_mode: String,
#[serde(rename = "tilesetId")]
pub tileset_id: Option<i64>,
#[serde(rename = "uid")]
pub uid: i64,
#[serde(rename = "width")]
pub width: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct FieldDef {
#[serde(rename = "__type")]
pub field_def_type: String,
#[serde(rename = "acceptFileTypes")]
pub accept_file_types: Option<Vec<String>>,
#[serde(rename = "arrayMaxLength")]
pub array_max_length: Option<i64>,
#[serde(rename = "arrayMinLength")]
pub array_min_length: Option<i64>,
#[serde(rename = "canBeNull")]
pub can_be_null: bool,
#[serde(rename = "defaultOverride")]
pub default_override: serde_json::Value,
#[serde(rename = "editorAlwaysShow")]
pub editor_always_show: bool,
#[serde(rename = "editorDisplayMode")]
pub editor_display_mode: String,
#[serde(rename = "editorDisplayPos")]
pub editor_display_pos: String,
#[serde(rename = "identifier")]
pub identifier: String,
#[serde(rename = "isArray")]
pub is_array: bool,
#[serde(rename = "max")]
pub max: Option<f64>,
#[serde(rename = "min")]
pub min: Option<f64>,
#[serde(rename = "regex")]
pub regex: Option<String>,
#[serde(rename = "type")]
pub field_type: serde_json::Value,
#[serde(rename = "uid")]
pub uid: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct EnumDef {
#[serde(rename = "externalFileChecksum")]
pub external_file_checksum: Option<String>,
#[serde(rename = "externalRelPath")]
pub external_rel_path: Option<String>,
#[serde(rename = "iconTilesetUid")]
pub icon_tileset_uid: Option<i64>,
#[serde(rename = "identifier")]
pub identifier: String,
#[serde(rename = "uid")]
pub uid: i64,
#[serde(rename = "values")]
pub values: Vec<HashMap<String, Option<serde_json::Value>>>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct LayerDef {
#[serde(rename = "__type")]
pub layer_def_type: String,
#[serde(rename = "autoRuleGroups")]
pub auto_rule_groups: Vec<HashMap<String, Option<serde_json::Value>>>,
#[serde(rename = "autoSourceLayerDefUid")]
pub auto_source_layer_def_uid: Option<i64>,
#[serde(rename = "autoTilesetDefUid")]
pub auto_tileset_def_uid: Option<i64>,
#[serde(rename = "displayOpacity")]
pub display_opacity: f64,
#[serde(rename = "gridSize")]
pub grid_size: i64,
#[serde(rename = "identifier")]
pub identifier: String,
#[serde(rename = "intGridValues")]
pub int_grid_values: Vec<HashMap<String, Option<serde_json::Value>>>,
#[serde(rename = "pxOffsetX")]
pub px_offset_x: i64,
#[serde(rename = "pxOffsetY")]
pub px_offset_y: i64,
#[serde(rename = "tilePivotX")]
pub tile_pivot_x: f64,
#[serde(rename = "tilePivotY")]
pub tile_pivot_y: f64,
#[serde(rename = "tilesetDefUid")]
pub tileset_def_uid: Option<i64>,
#[serde(rename = "type")]
pub purple_type: String,
#[serde(rename = "uid")]
pub uid: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct TilesetDef {
#[serde(rename = "cachedPixelData")]
pub cached_pixel_data: Option<HashMap<String, Option<serde_json::Value>>>,
#[serde(rename = "identifier")]
pub identifier: String,
#[serde(rename = "padding")]
pub padding: i64,
#[serde(rename = "pxHei")]
pub px_height: i64,
#[serde(rename = "pxWid")]
pub px_width: i64,
#[serde(rename = "relPath")]
pub rel_path: String,
#[serde(rename = "savedSelections")]
pub saved_selections: Vec<HashMap<String, Option<serde_json::Value>>>,
#[serde(rename = "spacing")]
pub spacing: i64,
#[serde(rename = "tileGridSize")]
pub tile_grid_size: i64,
#[serde(rename = "uid")]
pub uid: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Level {
#[serde(rename = "__bgColor")]
pub bg_color: String,
#[serde(rename = "__neighbours")]
pub neighbours: Vec<HashMap<String, Option<serde_json::Value>>>,
#[serde(rename = "bgColor")]
pub level_bg_color: Option<String>,
#[serde(rename = "identifier")]
pub identifier: String,
#[serde(rename = "layerInstances")]
pub layer_instances: Vec<LayerInstance>,
#[serde(rename = "pxHei")]
pub px_hei: i64,
#[serde(rename = "pxWid")]
pub px_wid: i64,
#[serde(rename = "uid")]
pub uid: i64,
#[serde(rename = "worldX")]
pub world_x: i64,
#[serde(rename = "worldY")]
pub world_y: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct LayerInstance {
#[serde(rename = "__cHei")]
pub c_hei: i64,
#[serde(rename = "__cWid")]
pub c_wid: i64,
#[serde(rename = "__gridSize")]
pub grid_size: i64,
#[serde(rename = "__identifier")]
pub identifier: String,
#[serde(rename = "__opacity")]
pub opacity: f64,
#[serde(rename = "__pxTotalOffsetX")]
pub px_total_offset_x: i64,
#[serde(rename = "__pxTotalOffsetY")]
pub px_total_offset_y: i64,
#[serde(rename = "__tilesetDefUid")]
pub tileset_def_uid: Option<i64>,
#[serde(rename = "__tilesetRelPath")]
pub tileset_rel_path: Option<String>,
#[serde(rename = "__type")]
pub layer_instance_type: LayerType,
#[serde(rename = "autoLayerTiles")]
pub auto_layer_tiles: Vec<Tile>,
#[serde(rename = "entityInstances")]
pub entity_instances: Vec<EntityInstance>,
#[serde(rename = "gridTiles")]
pub grid_tiles: Vec<Tile>,
#[serde(rename = "intGrid")]
pub int_grid: Vec<HashMap<String, Option<serde_json::Value>>>,
#[serde(rename = "layerDefUid")]
pub layer_def_uid: i64,
#[serde(rename = "levelId")]
pub level_id: i64,
#[serde(rename = "pxOffsetX")]
pub px_offset_x: i64,
#[serde(rename = "pxOffsetY")]
pub px_offset_y: i64,
#[serde(rename = "seed")]
pub seed: i64,
}
#[derive(Debug, Serialize, Deserialize)]
pub enum LayerType {
IntGrid,
Entities,
Tiles,
AutoLayer,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct Tile {
#[serde(rename = "d")]
pub _data: Vec<i64>,
#[serde(rename = "f")]
pub flip: TileFlip,
#[serde(rename = "px")]
pub layer_coord: (i64, i64),
#[serde(rename = "src")]
pub src_coord: (i64, i64),
#[serde(rename = "t")]
pub index: i64,
}
#[derive(Debug, Clone, Eq, PartialEq)]
pub struct TileFlip {
pub x: bool,
pub y: bool,
}
impl<'de> Deserialize<'de> for TileFlip {
fn deserialize<D>(deserializer: D) -> Result<Self, D::Error>
where
D: serde::de::Deserializer<'de>,
{
let bits: i32 = Deserialize::deserialize(deserializer)?;
let x_bit = 0b01;
let y_bit = 0b10;
let mut flip = Self { x: false, y: false };
if bits & x_bit != 0 {
flip.x = true;
}
if bits & y_bit != 0 {
flip.y = true;
}
Ok(flip)
}
}
impl Serialize for TileFlip {
fn serialize<S>(&self, serializer: S) -> Result<S::Ok, S::Error>
where
S: serde::ser::Serializer,
{
let mut flip_bits = 0;
let x_bit = 0b01;
let y_bit = 0b10;
if self.x {
flip_bits = flip_bits | x_bit;
}
if self.y {
flip_bits = flip_bits | y_bit;
}
serializer.serialize_i32(flip_bits)
}
}
#[derive(Debug, Serialize, Deserialize)]
pub struct EntityInstance {
#[serde(rename = "__grid")]
pub grid: Vec<i64>,
#[serde(rename = "__identifier")]
pub identifier: String,
#[serde(rename = "__tile")]
pub tile: Option<HashMap<String, serde_json::Value>>,
#[serde(rename = "defUid")]
pub def_uid: i64,
#[serde(rename = "fieldInstances")]
pub field_instances: Vec<FieldInstance>,
#[serde(rename = "px")]
pub px: Vec<i64>,
}
#[derive(Debug, Serialize, Deserialize)]
pub struct FieldInstance {
#[serde(rename = "__identifier")]
pub identifier: String,
#[serde(rename = "__type")]
pub field_instance_type: String,
#[serde(rename = "__value")]
pub value: Option<serde_json::Value>,
#[serde(rename = "defUid")]
pub def_uid: i64,
#[serde(rename = "realEditorValues")]
pub real_editor_values: Vec<serde_json::Value>,
}