use serde::*;
use std::collections::HashMap;
#[derive(Serialize, Deserialize)]
pub struct Project {
#[serde(rename = "backupLimit")]
pub backup_limit: i64,
#[serde(rename = "backupOnSave")]
pub backup_on_save: bool,
#[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 = "defaultLevelHeight")]
pub default_level_height: i64,
#[serde(rename = "defaultLevelWidth")]
pub default_level_width: i64,
#[serde(rename = "defaultPivotX")]
pub default_pivot_x: f64,
#[serde(rename = "defaultPivotY")]
pub default_pivot_y: f64,
pub defs: Definitions,
#[serde(rename = "exportPng")]
pub export_png: Option<bool>,
#[serde(rename = "exportTiled")]
pub export_tiled: bool,
#[serde(rename = "externalLevels")]
pub external_levels: bool,
pub flags: Vec<Flag>,
#[serde(rename = "imageExportMode")]
pub image_export_mode: ImageExportMode,
#[serde(rename = "jsonVersion")]
pub json_version: String,
#[serde(rename = "levelNamePattern")]
pub level_name_pattern: String,
pub levels: Vec<Level>,
#[serde(rename = "minifyJson")]
pub minify_json: bool,
#[serde(rename = "nextUid")]
pub next_uid: i64,
#[serde(rename = "pngFilePattern")]
pub png_file_pattern: Option<String>,
#[serde(rename = "worldGridHeight")]
pub world_grid_height: i64,
#[serde(rename = "worldGridWidth")]
pub world_grid_width: i64,
#[serde(rename = "worldLayout")]
pub world_layout: WorldLayout,
}
#[derive(Serialize, Deserialize)]
pub struct Definitions {
pub entities: Vec<EntityDefinition>,
pub enums: Vec<EnumDefinition>,
#[serde(rename = "externalEnums")]
pub external_enums: Vec<EnumDefinition>,
pub layers: Vec<LayerDefinition>,
#[serde(rename = "levelFields")]
pub level_fields: Vec<FieldDefinition>,
pub tilesets: Vec<TilesetDefinition>,
}
#[derive(Serialize, Deserialize)]
pub struct EntityDefinition {
pub color: String,
#[serde(rename = "fieldDefs")]
pub field_defs: Vec<FieldDefinition>,
#[serde(rename = "fillOpacity")]
pub fill_opacity: f64,
pub height: i64,
pub hollow: bool,
pub identifier: String,
#[serde(rename = "keepAspectRatio")]
pub keep_aspect_ratio: bool,
#[serde(rename = "limitBehavior")]
pub limit_behavior: LimitBehavior,
#[serde(rename = "limitScope")]
pub limit_scope: LimitScope,
#[serde(rename = "lineOpacity")]
pub line_opacity: f64,
#[serde(rename = "maxCount")]
pub max_count: i64,
#[serde(rename = "pivotX")]
pub pivot_x: f64,
#[serde(rename = "pivotY")]
pub pivot_y: f64,
#[serde(rename = "renderMode")]
pub render_mode: RenderMode,
#[serde(rename = "resizableX")]
pub resizable_x: bool,
#[serde(rename = "resizableY")]
pub resizable_y: bool,
#[serde(rename = "showName")]
pub show_name: bool,
pub tags: Vec<String>,
#[serde(rename = "tileId")]
pub tile_id: Option<i64>,
#[serde(rename = "tileRenderMode")]
pub tile_render_mode: TileRenderMode,
#[serde(rename = "tilesetId")]
pub tileset_id: Option<i64>,
pub uid: i64,
pub width: i64,
}
#[derive(Serialize, Deserialize)]
pub struct FieldDefinition {
#[serde(rename = "__type")]
pub field_definition_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: Option<serde_json::Value>,
#[serde(rename = "editorAlwaysShow")]
pub editor_always_show: bool,
#[serde(rename = "editorCutLongValues")]
pub editor_cut_long_values: bool,
#[serde(rename = "editorDisplayMode")]
pub editor_display_mode: EditorDisplayMode,
#[serde(rename = "editorDisplayPos")]
pub editor_display_pos: EditorDisplayPos,
pub identifier: String,
#[serde(rename = "isArray")]
pub is_array: bool,
pub max: Option<f64>,
pub min: Option<f64>,
pub regex: Option<String>,
#[serde(rename = "textLanguageMode")]
pub text_language_mode: Option<TextLanguageMode>,
#[serde(rename = "type")]
pub purple_type: Option<serde_json::Value>,
pub uid: i64,
}
#[derive(Serialize, Deserialize)]
pub struct EnumDefinition {
#[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>,
pub identifier: String,
pub uid: i64,
pub values: Vec<EnumValueDefinition>,
}
#[derive(Serialize, Deserialize)]
pub struct EnumValueDefinition {
#[serde(rename = "__tileSrcRect")]
pub tile_src_rect: Option<Vec<i64>>,
pub color: i64,
pub id: String,
#[serde(rename = "tileId")]
pub tile_id: Option<i64>,
}
#[derive(Serialize, Deserialize)]
pub struct LayerDefinition {
#[serde(rename = "__type")]
pub layer_definition_type: String,
#[serde(rename = "autoRuleGroups")]
pub auto_rule_groups: Vec<AutoLayerRuleGroup>,
#[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 = "excludedTags")]
pub excluded_tags: Vec<String>,
#[serde(rename = "gridSize")]
pub grid_size: i64,
pub identifier: String,
#[serde(rename = "intGridValues")]
pub int_grid_values: Vec<IntGridValueDefinition>,
#[serde(rename = "pxOffsetX")]
pub px_offset_x: i64,
#[serde(rename = "pxOffsetY")]
pub px_offset_y: i64,
#[serde(rename = "requiredTags")]
pub required_tags: Vec<String>,
#[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: Type,
pub uid: i64,
}
#[derive(Serialize, Deserialize)]
pub struct AutoLayerRuleGroup {
pub active: bool,
pub collapsed: bool,
#[serde(rename = "isOptional")]
pub is_optional: bool,
pub name: String,
pub rules: Vec<AutoLayerRuleDefinition>,
pub uid: i64,
}
#[derive(Serialize, Deserialize)]
pub struct AutoLayerRuleDefinition {
pub active: bool,
#[serde(rename = "breakOnMatch")]
pub break_on_match: bool,
pub chance: f64,
pub checker: Checker,
#[serde(rename = "flipX")]
pub flip_x: bool,
#[serde(rename = "flipY")]
pub flip_y: bool,
#[serde(rename = "outOfBoundsValue")]
pub out_of_bounds_value: Option<i64>,
pub pattern: Vec<i64>,
#[serde(rename = "perlinActive")]
pub perlin_active: bool,
#[serde(rename = "perlinOctaves")]
pub perlin_octaves: f64,
#[serde(rename = "perlinScale")]
pub perlin_scale: f64,
#[serde(rename = "perlinSeed")]
pub perlin_seed: f64,
#[serde(rename = "pivotX")]
pub pivot_x: f64,
#[serde(rename = "pivotY")]
pub pivot_y: f64,
pub size: i64,
#[serde(rename = "tileIds")]
pub tile_ids: Vec<i64>,
#[serde(rename = "tileMode")]
pub tile_mode: TileMode,
pub uid: i64,
#[serde(rename = "xModulo")]
pub x_modulo: i64,
#[serde(rename = "yModulo")]
pub y_modulo: i64,
}
#[derive(Serialize, Deserialize)]
pub struct IntGridValueDefinition {
pub color: String,
pub identifier: Option<String>,
pub value: i64,
}
#[derive(Serialize, Deserialize)]
pub struct TilesetDefinition {
#[serde(rename = "__cHei")]
pub c_hei: i64,
#[serde(rename = "__cWid")]
pub c_wid: i64,
#[serde(rename = "cachedPixelData")]
pub cached_pixel_data: Option<HashMap<String, Option<serde_json::Value>>>,
#[serde(rename = "customData")]
pub custom_data: Vec<HashMap<String, Option<serde_json::Value>>>,
#[serde(rename = "enumTags")]
pub enum_tags: Vec<HashMap<String, Option<serde_json::Value>>>,
pub identifier: String,
pub padding: i64,
#[serde(rename = "pxHei")]
pub px_hei: i64,
#[serde(rename = "pxWid")]
pub px_wid: i64,
#[serde(rename = "relPath")]
pub rel_path: String,
#[serde(rename = "savedSelections")]
pub saved_selections: Vec<HashMap<String, Option<serde_json::Value>>>,
pub spacing: i64,
#[serde(rename = "tagsSourceEnumUid")]
pub tags_source_enum_uid: Option<i64>,
#[serde(rename = "tileGridSize")]
pub tile_grid_size: i64,
pub uid: i64,
}
#[derive(Serialize, Deserialize)]
pub struct Level {
#[serde(rename = "__bgColor")]
pub bg_color: String,
#[serde(rename = "__bgPos")]
pub bg_pos: Option<LevelBackgroundPosition>,
#[serde(rename = "__neighbours")]
pub neighbours: Vec<NeighbourLevel>,
#[serde(rename = "bgColor")]
pub level_bg_color: Option<String>,
#[serde(rename = "bgPivotX")]
pub bg_pivot_x: f64,
#[serde(rename = "bgPivotY")]
pub bg_pivot_y: f64,
#[serde(rename = "bgPos")]
pub level_bg_pos: Option<BgPos>,
#[serde(rename = "bgRelPath")]
pub bg_rel_path: Option<String>,
#[serde(rename = "externalRelPath")]
pub external_rel_path: Option<String>,
#[serde(rename = "fieldInstances")]
pub field_instances: Vec<FieldInstance>,
pub identifier: String,
#[serde(rename = "layerInstances")]
pub layer_instances: Option<Vec<LayerInstance>>,
#[serde(rename = "pxHei")]
pub px_hei: i64,
#[serde(rename = "pxWid")]
pub px_wid: i64,
pub uid: i64,
#[serde(rename = "useAutoIdentifier")]
pub use_auto_identifier: bool,
#[serde(rename = "worldX")]
pub world_x: i64,
#[serde(rename = "worldY")]
pub world_y: i64,
}
#[derive(Serialize, Deserialize)]
pub struct LevelBackgroundPosition {
#[serde(rename = "cropRect")]
pub crop_rect: Vec<f64>,
pub scale: Vec<f64>,
#[serde(rename = "topLeftPx")]
pub top_left_px: Vec<i64>,
}
#[derive(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<Option<serde_json::Value>>,
}
#[derive(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: String,
#[serde(rename = "autoLayerTiles")]
pub auto_layer_tiles: Vec<TileInstance>,
#[serde(rename = "entityInstances")]
pub entity_instances: Vec<EntityInstance>,
#[serde(rename = "gridTiles")]
pub grid_tiles: Vec<TileInstance>,
#[serde(rename = "intGrid")]
pub int_grid: Option<Vec<IntGridValueInstance>>,
#[serde(rename = "intGridCsv")]
pub int_grid_csv: Vec<i64>,
#[serde(rename = "layerDefUid")]
pub layer_def_uid: i64,
#[serde(rename = "levelId")]
pub level_id: i64,
#[serde(rename = "optionalRules")]
pub optional_rules: Vec<i64>,
#[serde(rename = "overrideTilesetUid")]
pub override_tileset_uid: Option<i64>,
#[serde(rename = "pxOffsetX")]
pub px_offset_x: i64,
#[serde(rename = "pxOffsetY")]
pub px_offset_y: i64,
pub seed: i64,
pub visible: bool,
}
#[derive(Serialize, Deserialize)]
pub struct TileInstance {
pub d: Vec<i64>,
pub f: i64,
pub px: Vec<i64>,
pub src: Vec<i64>,
pub t: i64,
}
#[derive(Serialize, Deserialize)]
pub struct EntityInstance {
#[serde(rename = "__grid")]
pub grid: Vec<i64>,
#[serde(rename = "__identifier")]
pub identifier: String,
#[serde(rename = "__pivot")]
pub pivot: Vec<f64>,
#[serde(rename = "__tile")]
pub tile: Option<EntityInstanceTile>,
#[serde(rename = "defUid")]
pub def_uid: i64,
#[serde(rename = "fieldInstances")]
pub field_instances: Vec<FieldInstance>,
pub height: i64,
pub px: Vec<i64>,
pub width: i64,
}
#[derive(Serialize, Deserialize)]
pub struct EntityInstanceTile {
#[serde(rename = "srcRect")]
pub src_rect: Vec<i64>,
#[serde(rename = "tilesetUid")]
pub tileset_uid: i64,
}
#[derive(Serialize, Deserialize)]
pub struct IntGridValueInstance {
#[serde(rename = "coordId")]
pub coord_id: i64,
pub v: i64,
}
#[derive(Serialize, Deserialize)]
pub struct NeighbourLevel {
pub dir: String,
#[serde(rename = "levelUid")]
pub level_uid: i64,
}
#[derive(Serialize, Deserialize)]
pub enum EditorDisplayMode {
EntityTile,
Hidden,
NameAndValue,
PointPath,
PointPathLoop,
PointStar,
Points,
RadiusGrid,
RadiusPx,
ValueOnly,
}
#[derive(Serialize, Deserialize)]
pub enum EditorDisplayPos {
Above,
Beneath,
Center,
}
#[derive(Serialize, Deserialize)]
pub enum TextLanguageMode {
LangC,
LangHaxe,
#[serde(rename = "LangJS")]
LangJs,
LangJson,
LangLua,
LangMarkdown,
LangPython,
LangRuby,
LangXml,
}
#[derive(Serialize, Deserialize)]
pub enum LimitBehavior {
DiscardOldOnes,
MoveLastOne,
PreventAdding,
}
#[derive(Serialize, Deserialize)]
pub enum LimitScope {
PerLayer,
PerLevel,
PerWorld,
}
#[derive(Serialize, Deserialize)]
pub enum RenderMode {
Cross,
Ellipse,
Rectangle,
Tile,
}
#[derive(Serialize, Deserialize)]
pub enum TileRenderMode {
Cover,
FitInside,
Repeat,
Stretch,
}
#[derive(Serialize, Deserialize)]
pub enum Checker {
Horizontal,
None,
Vertical,
}
#[derive(Serialize, Deserialize)]
pub enum TileMode {
Single,
Stamp,
}
#[derive(Serialize, Deserialize)]
pub enum Type {
AutoLayer,
Entities,
IntGrid,
Tiles,
}
#[derive(Serialize, Deserialize)]
pub enum Flag {
DiscardPreCsvIntGrid,
IgnoreBackupSuggest,
}
#[derive(Serialize, Deserialize)]
pub enum ImageExportMode {
None,
OneImagePerLayer,
OneImagePerLevel,
}
#[derive(Serialize, Deserialize)]
pub enum BgPos {
Contain,
Cover,
CoverDirty,
Unscaled,
}
#[derive(Serialize, Deserialize)]
pub enum WorldLayout {
Free,
GridVania,
LinearHorizontal,
LinearVertical,
}