use serde::{Deserialize, Serialize};
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Ldtk {
#[serde(rename = "__FORCED_REFS")]
#[serde(skip_serializing_if = "Option::is_none")]
pub forced_refs: Option<ForcedRefs>,
pub bg_color: String,
pub defs: Definitions,
pub external_levels: bool,
pub iid: String,
pub json_version: String,
pub levels: Vec<Level>,
pub toc: Vec<LdtkTableOfContentEntry>,
#[serde(skip_serializing_if = "Option::is_none")]
pub world_grid_height: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub world_grid_width: Option<i64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub world_layout: Option<WorldLayout>,
pub worlds: Vec<World>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Definitions {
pub entities: Vec<EntityDefinition>,
pub enums: Vec<EnumDefinition>,
pub external_enums: Vec<EnumDefinition>,
pub layers: Vec<LayerDefinition>,
pub level_fields: Vec<FieldDefinition>,
pub tilesets: Vec<TilesetDefinition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EntityDefinition {
pub color: String,
pub height: i64,
pub identifier: String,
pub nine_slice_borders: Vec<i64>,
pub pivot_x: f64,
pub pivot_y: f64,
#[serde(skip_serializing_if = "Option::is_none")]
pub tile_rect: Option<TilesetRectangle>,
pub tile_render_mode: TileRenderMode,
#[serde(skip_serializing_if = "Option::is_none")]
pub tileset_id: Option<i64>,
pub uid: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub ui_tile_rect: Option<TilesetRectangle>,
pub width: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TilesetRectangle {
pub h: i64,
pub tileset_uid: i64,
pub w: i64,
pub x: i64,
pub y: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum TileRenderMode {
Cover,
#[serde(rename = "FitInside")]
FitInside,
#[serde(rename = "FullSizeCropped")]
FullSizeCropped,
#[serde(rename = "FullSizeUncropped")]
FullSizeUncropped,
#[serde(rename = "NineSlice")]
NineSlice,
Repeat,
Stretch,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EnumDefinition {
#[serde(skip_serializing_if = "Option::is_none")]
pub external_rel_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub icon_tileset_uid: Option<i64>,
pub identifier: String,
pub tags: Vec<String>,
pub uid: i64,
pub values: Vec<EnumValueDefinition>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EnumValueDefinition {
pub color: i64,
pub id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub tile_rect: Option<TilesetRectangle>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LayerDefinition {
#[serde(rename = "__type")]
pub layer_definition_type: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub auto_source_layer_def_uid: Option<i64>,
pub display_opacity: f64,
pub grid_size: i64,
pub identifier: String,
pub int_grid_values: Vec<IntGridValueDefinition>,
pub int_grid_values_groups: Vec<IntGridValueGroupDefinition>,
pub parallax_factor_x: f64,
pub parallax_factor_y: f64,
pub parallax_scaling: bool,
pub px_offset_x: i64,
pub px_offset_y: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub tileset_def_uid: Option<i64>,
pub uid: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct IntGridValueDefinition {
pub color: String,
pub group_uid: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub identifier: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tile: Option<TilesetRectangle>,
pub value: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct IntGridValueGroupDefinition {
#[serde(skip_serializing_if = "Option::is_none")]
pub color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub identifier: Option<String>,
pub uid: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct FieldDefinition {}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TilesetDefinition {
#[serde(rename = "__cHei")]
pub c_hei: i64,
#[serde(rename = "__cWid")]
pub c_wid: i64,
pub custom_data: Vec<TileCustomMetadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub embed_atlas: Option<EmbedAtlas>,
pub enum_tags: Vec<EnumTagValue>,
pub identifier: String,
pub padding: i64,
pub px_hei: i64,
pub px_wid: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub rel_path: Option<String>,
pub spacing: i64,
pub tags: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tags_source_enum_uid: Option<i64>,
pub tile_grid_size: i64,
pub uid: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct TileCustomMetadata {
pub data: String,
pub tile_id: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum EmbedAtlas {
#[serde(rename = "LdtkIcons")]
LdtkIcons,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct EnumTagValue {
pub enum_value_id: String,
pub tile_ids: Vec<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "PascalCase")]
pub struct ForcedRefs {
#[serde(skip_serializing_if = "Option::is_none")]
pub auto_layer_rule_group: Option<AutoLayerRuleGroup>,
#[serde(skip_serializing_if = "Option::is_none")]
pub auto_rule_def: Option<AutoLayerRuleDefinition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub custom_command: Option<LdtkCustomCommand>,
#[serde(skip_serializing_if = "Option::is_none")]
pub definitions: Option<Definitions>,
#[serde(skip_serializing_if = "Option::is_none")]
pub entity_def: Option<EntityDefinition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub entity_instance: Option<EntityInstance>,
#[serde(skip_serializing_if = "Option::is_none")]
pub entity_reference_infos: Option<ReferenceToAnEntityInstance>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enum_def: Option<EnumDefinition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enum_def_values: Option<EnumValueDefinition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub enum_tag_value: Option<EnumTagValue>,
#[serde(skip_serializing_if = "Option::is_none")]
pub field_def: Option<FieldDefinition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub field_instance: Option<FieldInstance>,
#[serde(skip_serializing_if = "Option::is_none")]
pub grid_point: Option<GridPoint>,
#[serde(skip_serializing_if = "Option::is_none")]
pub int_grid_value_def: Option<IntGridValueDefinition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub int_grid_value_group_def: Option<IntGridValueGroupDefinition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub int_grid_value_instance: Option<IntGridValueInstance>,
#[serde(skip_serializing_if = "Option::is_none")]
pub layer_def: Option<LayerDefinition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub layer_instance: Option<LayerInstance>,
#[serde(skip_serializing_if = "Option::is_none")]
pub level: Option<Level>,
#[serde(skip_serializing_if = "Option::is_none")]
pub level_bg_pos_infos: Option<LevelBackgroundPosition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub neighbour_level: Option<NeighbourLevel>,
#[serde(skip_serializing_if = "Option::is_none")]
pub table_of_content_entry: Option<LdtkTableOfContentEntry>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tile: Option<TileInstance>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tile_custom_metadata: Option<TileCustomMetadata>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tileset_def: Option<TilesetDefinition>,
#[serde(skip_serializing_if = "Option::is_none")]
pub tileset_rect: Option<TilesetRectangle>,
#[serde(skip_serializing_if = "Option::is_none")]
pub toc_instance_data: Option<LdtkTocInstanceData>,
#[serde(skip_serializing_if = "Option::is_none")]
pub world: Option<World>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct AutoLayerRuleGroup {
pub active: bool,
pub biome_requirement_mode: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub color: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub icon: Option<TilesetRectangle>,
pub is_optional: bool,
pub name: String,
pub required_biome_values: Vec<String>,
pub rules: Vec<AutoLayerRuleDefinition>,
pub uid: i64,
pub uses_wizard: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct AutoLayerRuleDefinition {}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct LdtkCustomCommand {
pub command: String,
pub when: When,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum When {
#[serde(rename = "AfterLoad")]
AfterLoad,
#[serde(rename = "AfterSave")]
AfterSave,
#[serde(rename = "BeforeSave")]
BeforeSave,
Manual,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
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 = "__smartColor")]
pub smart_color: String,
#[serde(rename = "__tags")]
pub tags: Vec<String>,
#[serde(rename = "__tile")]
#[serde(skip_serializing_if = "Option::is_none")]
pub tile: Option<TilesetRectangle>,
#[serde(rename = "__worldX")]
#[serde(skip_serializing_if = "Option::is_none")]
pub world_x: Option<i64>,
#[serde(rename = "__worldY")]
#[serde(skip_serializing_if = "Option::is_none")]
pub world_y: Option<i64>,
pub def_uid: i64,
pub field_instances: Vec<FieldInstance>,
pub height: i64,
pub iid: String,
pub px: Vec<i64>,
pub width: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct FieldInstance {
#[serde(rename = "__identifier")]
pub identifier: String,
#[serde(rename = "__tile")]
#[serde(skip_serializing_if = "Option::is_none")]
pub tile: Option<TilesetRectangle>,
#[serde(rename = "__type")]
pub field_instance_type: String,
#[serde(rename = "__value")]
pub value: Option<serde_json::Value>,
pub def_uid: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct ReferenceToAnEntityInstance {
pub entity_iid: String,
pub layer_iid: String,
pub level_iid: String,
pub world_iid: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct GridPoint {
pub cx: i64,
pub cy: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct IntGridValueInstance {
pub coord_id: i64,
pub v: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
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")]
#[serde(skip_serializing_if = "Option::is_none")]
pub tileset_def_uid: Option<i64>,
#[serde(rename = "__tilesetRelPath")]
#[serde(skip_serializing_if = "Option::is_none")]
pub tileset_rel_path: Option<String>,
#[serde(rename = "__type")]
pub layer_instance_type: String,
pub auto_layer_tiles: Vec<TileInstance>,
pub entity_instances: Vec<EntityInstance>,
pub grid_tiles: Vec<TileInstance>,
pub iid: String,
pub int_grid_csv: Vec<i64>,
pub layer_def_uid: i64,
pub level_id: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub override_tileset_uid: Option<i64>,
pub px_offset_x: i64,
pub px_offset_y: i64,
pub visible: bool,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub struct TileInstance {
pub a: f64,
pub f: i64,
pub px: Vec<i64>,
pub src: Vec<i64>,
pub t: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct Level {
#[serde(rename = "__bgColor")]
pub bg_color: String,
#[serde(rename = "__bgPos")]
#[serde(skip_serializing_if = "Option::is_none")]
pub bg_pos: Option<LevelBackgroundPosition>,
#[serde(rename = "__neighbours")]
pub neighbours: Vec<NeighbourLevel>,
#[serde(skip_serializing_if = "Option::is_none")]
pub bg_rel_path: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub external_rel_path: Option<String>,
pub field_instances: Vec<FieldInstance>,
pub identifier: String,
pub iid: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub layer_instances: Option<Vec<LayerInstance>>,
pub px_hei: i64,
pub px_wid: i64,
pub uid: i64,
pub world_depth: i64,
pub world_x: i64,
pub world_y: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LevelBackgroundPosition {
pub crop_rect: Vec<f64>,
pub scale: Vec<f64>,
pub top_left_px: Vec<i64>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct NeighbourLevel {
pub dir: String,
pub level_iid: String,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LdtkTableOfContentEntry {
pub identifier: String,
pub instances_data: Vec<LdtkTocInstanceData>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct LdtkTocInstanceData {
pub fields: Option<serde_json::Value>,
pub hei_px: i64,
pub iids: ReferenceToAnEntityInstance,
pub wid_px: i64,
pub world_x: i64,
pub world_y: i64,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct World {
pub identifier: String,
pub iid: String,
pub levels: Vec<Level>,
pub world_grid_height: i64,
pub world_grid_width: i64,
#[serde(skip_serializing_if = "Option::is_none")]
pub world_layout: Option<WorldLayout>,
}
#[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
pub enum WorldLayout {
Free,
#[serde(rename = "GridVania")]
GridVania,
#[serde(rename = "LinearHorizontal")]
LinearHorizontal,
#[serde(rename = "LinearVertical")]
LinearVertical,
}