nze_tiled/
lib.rs

1//! A library for deserializing tiled maps and tilesets made with the Tiled map editor.
2//!
3//! Use `Map::new()` to loads the map using a path,
4//! and also automatically loads any tilesets data.
5//!
6//! see <https://doc.mapeditor.org/en/stable/> for information on what the map data
7//! represents.
8//!
9//! Note: infinite maps and templates are unsupported
10
11pub mod error;
12
13mod tileset;
14mod layer;
15mod object_group;
16mod properties;
17mod image_layer;
18mod helper;
19mod map;
20
21pub use properties::Properties;
22pub use layer::{Layer, LayerData, LayerTiles};
23pub use object_group::*;
24pub use tileset::Tileset;
25pub use image_layer::ImageLayer;
26pub use map::*;
27
28use helper::*;
29use error::TiledError;
30
31pub struct Colour {
32    pub r : u8,
33    pub g : u8,
34    pub b : u8,
35    pub a : u8,
36}
37
38#[cfg(test)]
39mod tiled_tests {
40    use super::*;
41    use std::path::Path;
42    use geometry::*;
43    #[test]
44    fn test_map() {
45        let map = Map::new(Path::new("test-resources/test.tmx")).unwrap();
46        assert!(map.width == 4);
47        assert!(map.height == 4);
48        assert!(map.tile_width == 10);
49        assert!(map.tile_height == 10);
50        assert!(!map.infinite);
51        assert!(match map.orientation {
52            Orientation::Orthogonal => true,
53            _ => false,
54        });
55
56        assert!(map.tilesets.len() == 1);
57        assert!(map.tilesets[0].first_tile_id == 1);
58        assert!(map.tilesets[0].tile_width == 10);
59        assert!(map.tilesets[0].tile_height == 10);
60        assert!(map.tilesets[0].spacing == 2);
61        assert!(map.tilesets[0].margin == 5);
62        assert!(map.tilesets[0].tile_count == 4);
63        assert!(map.tilesets[0].column_count == 2);
64        assert!(map.tilesets[0].image_path == Path::new("test-resources/test-tileset.png"));
65        assert!(map.tilesets[0].image_width == 32);
66        assert!(map.tilesets[0].image_height == 32);
67
68        assert!(map.layers.len() == 2);
69        assert!(map.layers[0].width == 4);
70        assert!(map.layers[0].height == 4);
71        assert!(
72            map.layers[0].tiles == vec![
73                4, 4, 0, 0,
74                2, 2, 2, 0,
75                2, 2, 2, 0,
76                4, 4, 0, 0,
77            ]
78        );
79        assert!(map.layers[1].width == 4);
80        assert!(map.layers[1].height == 4);
81        assert!(map.layers[1].props.booleans["collidable"] == true);
82        assert!(
83            map.layers[1].tiles == vec![
84                0, 0, 0, 0,
85                0, 0, 0, 0,
86                1, 1, 1, 1,
87                1, 1, 1, 1,
88            ]
89        );
90        assert!(map.layers[1].info.id == 1);
91        assert!(map.layers[1].info.name == "Tile Layer 1");
92        assert!(map.layers[1].info.opacity == 0.90);
93        assert!(map.layers[1].info.tint.g == 0);
94
95        assert!(map.obj_groups.len() == 2);
96        assert!(map.obj_groups[0].props.booleans["obj_group"] == true);
97        assert!(map.obj_groups[0].objs.len() == 2);
98        assert!(map.obj_groups[0].polys.len() == 2);
99        assert!(map.obj_groups[0].points.len() == 1);
100        assert!(map.obj_groups[0].ellipse.len() == 1);
101        assert!(map.obj_groups[0].ellipse[0].rotation == 10.0);
102        assert!(map.obj_groups[0].points[0].info.name == "dd");
103        assert!(map.obj_groups[0].objs[1].props.integers["num"] == 5);
104        assert!(map.obj_groups[0].objs[1].props.booleans["test"] == true);
105        assert!(map.obj_groups[0].objs[1].rotation == 343.734);
106        assert!(map.obj_groups[0].objs[1].info.type_name == "asd");
107        assert!(map.obj_groups[0].objs[0].info.name == "barry");
108        assert!(map.obj_groups[0].objs[0].info.visible == false);
109        assert!(map.obj_groups[0].objs[1].info.id == 2);
110        assert!(map.obj_groups[0].objs[1].rect.x == 4.25998);
111        assert!(map.obj_groups[0].objs[1].rect.y == 10.0772);
112        assert!(map.obj_groups[0].objs[1].rect.w == 15.1719);
113        assert!(map.obj_groups[0].objs[1].rect.h == 18.3066);
114        assert!(map.obj_groups[0].objs[0].rect.x == 28.6511);
115        assert!(map.obj_groups[0].objs[0].rect.y == 10.658);
116        assert!(map.obj_groups[0].objs[0].rect.w == 7.71136);
117        assert!(map.obj_groups[0].objs[0].rect.h == 12.7269);
118        assert!(map.obj_groups[0].polys[1].obj.rect.x == 7.58597);
119        assert!(map.obj_groups[0].polys[1].obj.rect.y == 6.33209);
120        assert!(map.obj_groups[0].polys[1].obj.rect.w == 0.0);
121        assert!(map.obj_groups[0].polys[1].obj.rect.h == 0.0);
122        assert!(map.obj_groups[0].polys[1].obj.props.booleans["open"] == true);
123        assert!(map.obj_groups[0].polys[1].closed == false);
124        assert!(map.obj_groups[0].polys[1].points.iter()
125                .map(|Vec2 {x, y}| {
126                    (*x as i32,  *y as i32)
127                })
128                .collect::<Vec<(i32, i32)>>() ==
129                vec![
130                    (0, 0),
131                    (15, -3),
132                    (4, 13),
133                    ]
134        );
135        assert!(map.obj_groups[0].polys[0].obj.rect.x == 9.15332);
136        assert!(map.obj_groups[0].polys[0].obj.rect.y == 33.7294);
137        assert!(map.obj_groups[0].polys[0].obj.rect.w == 0.0);
138        assert!(map.obj_groups[0].polys[0].obj.rect.h == 0.0);
139        assert!(map.obj_groups[0].polys[0].closed == true);
140        assert!(map.obj_groups[0].polys[0].points.iter()
141                .map(|Vec2 {x, y}| {
142                    (*x as i32,  *y as i32)
143                })
144                .collect::<Vec<(i32, i32)>>() ==
145                vec![
146                    (0, 0),
147                    (0, -7),
148                    (9, -1),
149                    ]
150        );
151        assert!(map.obj_groups[0].text.len() == 1);
152        assert!(map.obj_groups[0].text[0].text == "Hello World");
153        assert!(map.obj_groups[0].text[0].font_family == "MS Sans Serif");
154        assert!(map.obj_groups[0].text[0].colour.r == 98);
155        assert!(map.obj_groups[0].text[0].horizontal_align == TextHorizontalAlign::Justify);
156        assert!(map.obj_groups[0].text[0].vertical_align == TextVerticalAlign::Center);
157        assert!(map.obj_groups[0].text[0].italic == true);
158        assert!(map.obj_groups[0].text[0].bold == true);
159        assert!(map.obj_groups[0].text[0].wrap == true);
160        assert!(map.obj_groups[0].text[0].pixel_size == 29);
161
162        assert!(map.obj_groups[1].info.id == 5);
163        assert!(map.obj_groups[1].info.name == "obj2s");
164        assert!(map.obj_groups[1].info.index_draw_order == true);
165        assert!(map.obj_groups[1].info.offset.x == 5.05);
166        assert!(map.obj_groups[1].info.parallax.x == 1.10);
167        assert!(map.obj_groups[1].info.colour.r == 85);
168        assert!(map.obj_groups[1].info.colour.a == 10);
169        assert!(map.obj_groups[1].info.visible == true);
170        assert!(map.obj_groups[1].info.locked == true);
171        assert!(map.obj_groups[1].info.tint.g == 115);
172        assert!(map.obj_groups[1].info.tint.a == 255);
173        assert!(map.obj_groups[1].props.booleans["collidable"] == true);
174        assert!(map.obj_groups[1].objs.len() == 2);
175        assert!(map.obj_groups[1].polys.len() == 0);
176        assert!(map.obj_groups[1].objs[1].info.id == 8);
177        assert!(map.obj_groups[1].objs[1].rect.x == 10.0);
178        assert!(map.obj_groups[1].objs[1].rect.y == 20.0);
179        assert!(map.obj_groups[1].objs[1].rect.w == 20.0);
180        assert!(map.obj_groups[1].objs[1].rect.h == 0.0);
181        assert!(map.obj_groups[1].objs[0].info.id == 9);
182        assert!(map.obj_groups[1].objs[0].rect.x == 0.0);
183        assert!(map.obj_groups[1].objs[0].rect.y == 0.0);
184        assert!(map.obj_groups[1].objs[0].rect.w == 20.0);
185        assert!(map.obj_groups[1].objs[0].rect.h == 10.0);
186        assert!(map.obj_groups[1].objs[0].props.booleans["test_coll"] == true);
187
188        assert!(map.img_layers.len() == 1);
189        assert!(map.img_layers[0].info.offset.x == 19.247);
190        assert!(map.img_layers[0].info.offset.y == -10.3445);
191        assert!(map.img_layers[0].image_path == Path::new("test-tileset.png"));
192        assert!(map.img_layers[0].width == 32);
193        assert!(map.img_layers[0].height == 32);
194        assert!(map.img_layers[0].repeat_x == false);
195        assert!(map.img_layers[0].repeat_y == true);
196        assert!(map.img_layers[0].info.parallax.x == 2.07);
197        assert!(map.img_layers[0].info.parallax.y ==  1.0);
198        assert!(map.img_layers[0].props.booleans["img"] == false);
199    }
200}