summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLawnCable <git@lawncable.net>2022-04-15 08:36:36 +0200
committerLawnCable <git@lawncable.net>2022-04-15 08:36:36 +0200
commitec09c0ae43799846a68a4e100a68353730edfed1 (patch)
treeaddf32caaad9b2968abb633476b02ed31e85f50f
downloadfast-tiled.rs-ec09c0ae43799846a68a4e100a68353730edfed1.tar.gz
fast-tiled.rs-ec09c0ae43799846a68a4e100a68353730edfed1.tar.bz2
fast-tiled.rs-ec09c0ae43799846a68a4e100a68353730edfed1.tar.xz
fast-tiled.rs-ec09c0ae43799846a68a4e100a68353730edfed1.zip
init
-rw-r--r--.gitignore1
-rw-r--r--Cargo.lock53
-rw-r--r--Cargo.toml13
-rw-r--r--readme.md20
-rw-r--r--src/lib.rs3
-rw-r--r--src/lowlevel/map.rs176
-rw-r--r--src/lowlevel/mod.rs3
-rw-r--r--src/lowlevel/property.rs201
-rw-r--r--testing_data/tiled_examples/AUTHORS11
-rw-r--r--testing_data/tiled_examples/buch-outdoor.pngbin0 -> 16549 bytes
-rw-r--r--testing_data/tiled_examples/desert.tmx9
-rw-r--r--testing_data/tiled_examples/desert.tsx68
-rw-r--r--testing_data/tiled_examples/hexagonal-mini.tmx12
-rw-r--r--testing_data/tiled_examples/hexmini.pngbin0 -> 5784 bytes
-rw-r--r--testing_data/tiled_examples/isometric_grass_and_water.pngbin0 -> 104828 bytes
-rw-r--r--testing_data/tiled_examples/isometric_grass_and_water.tmx43
-rw-r--r--testing_data/tiled_examples/isometric_staggered_grass_and_water.tmx66
-rw-r--r--testing_data/tiled_examples/orthogonal-outside.tmx284
-rw-r--r--testing_data/tiled_examples/perspective_walls.pngbin0 -> 3700 bytes
-rw-r--r--testing_data/tiled_examples/perspective_walls.tmx19
-rw-r--r--testing_data/tiled_examples/perspective_walls.tsx20
-rw-r--r--testing_data/tiled_examples/rpg/beach_tileset.pngbin0 -> 36457 bytes
-rw-r--r--testing_data/tiled_examples/rpg/beach_tileset.tsx20
-rw-r--r--testing_data/tiled_examples/rpg/island.tmx26
-rw-r--r--testing_data/tiled_examples/rpg/readme.txt28
-rw-r--r--testing_data/tiled_examples/sewer_automap/rule_001.tmx29
-rw-r--r--testing_data/tiled_examples/sewer_automap/rule_002.tmx24
-rw-r--r--testing_data/tiled_examples/sewer_automap/rule_003.tmx30
-rw-r--r--testing_data/tiled_examples/sewer_automap/rule_004.tmx29
-rw-r--r--testing_data/tiled_examples/sewer_automap/rule_005.tmx29
-rw-r--r--testing_data/tiled_examples/sewer_automap/rule_006.tmx39
-rw-r--r--testing_data/tiled_examples/sewer_automap/rule_007.tmx34
-rw-r--r--testing_data/tiled_examples/sewer_automap/rule_008.tmx35
-rw-r--r--testing_data/tiled_examples/sewer_automap/rule_009.tmx30
-rw-r--r--testing_data/tiled_examples/sewer_automap/rules.txt142
-rw-r--r--testing_data/tiled_examples/sewer_automap/rules_sewers.pngbin0 -> 314 bytes
-rw-r--r--testing_data/tiled_examples/sewer_automap/sewers.tmx15
-rw-r--r--testing_data/tiled_examples/sewer_tileset.pngbin0 -> 22249 bytes
-rw-r--r--testing_data/tiled_examples/sewers.tmx16
-rw-r--r--testing_data/tiled_examples/sticker-knight/README.md8
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/alter.pngbin0 -> 2230 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/backgroundArch.pngbin0 -> 797 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/backgroundMountain.pngbin0 -> 1411 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/backgroundTower.pngbin0 -> 1503 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/backgroundTree.pngbin0 -> 1137 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/blobBlue.pngbin0 -> 2915 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/blobGreen.pngbin0 -> 2891 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/blue.pngbin0 -> 136 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/bombStroked.pngbin0 -> 2444 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/castleWall.pngbin0 -> 136 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/cloud.pngbin0 -> 1674 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/column1.pngbin0 -> 2620 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/column2.pngbin0 -> 2605 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/doorBlueStroked.pngbin0 -> 4528 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/doorGreenStroke.pngbin0 -> 4546 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/doorRedStroked.pngbin0 -> 4439 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/doorStroked.pngbin0 -> 4292 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/earthWall.pngbin0 -> 136 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/earthWall2.pngbin0 -> 136 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/exit.pngbin0 -> 1182 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/flare.pngbin0 -> 4248 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/gemBlueStroked.pngbin0 -> 1393 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/gemRedStroked.pngbin0 -> 4235 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/grassLarge.pngbin0 -> 1505 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/grassSmall.pngbin0 -> 1180 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/grey.pngbin0 -> 135 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/hero.pngbin0 -> 4155 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/keyGreenStroked.pngbin0 -> 909 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/keyRedStroked.pngbin0 -> 5063 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/keyYellowStroked.pngbin0 -> 1013 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/objs.tsx189
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platform1.pngbin0 -> 2101 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platform2.pngbin0 -> 2006 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platform3.pngbin0 -> 1281 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platform4.pngbin0 -> 1277 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platformBase1.pngbin0 -> 3166 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platformBase2.pngbin0 -> 3162 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platformBase3.pngbin0 -> 2445 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platformBase4.pngbin0 -> 2425 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platformBlock1.pngbin0 -> 1139 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platformBlock2.pngbin0 -> 1127 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platformBlock3.pngbin0 -> 1115 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platformBlock4.pngbin0 -> 1158 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platformConnector1.pngbin0 -> 668 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platformConnector2.pngbin0 -> 659 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platformConnector3.pngbin0 -> 662 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/platformConnector4.pngbin0 -> 666 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/pushBlock1.pngbin0 -> 5018 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/pushBlock2.pngbin0 -> 4147 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/pushBlock3.pngbin0 -> 4117 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/sandbox.tmx234
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/sandbox2.tmx301
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/shadow.pngbin0 -> 84 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/shieldStroked.pngbin0 -> 2259 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/sign.pngbin0 -> 1682 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/skeleton.pngbin0 -> 5129 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/swordStroked.pngbin0 -> 1460 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/templates/block.tx11
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/templates/diamond.tx5
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/templates/hero.tx5
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/torch.pngbin0 -> 1511 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/trap.pngbin0 -> 5467 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/wallDecor1.pngbin0 -> 1875 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/wallDecor2.pngbin0 -> 1869 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/wallDecor3.pngbin0 -> 1578 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/window1.pngbin0 -> 1134 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/window2.pngbin0 -> 1141 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/map/window3.pngbin0 -> 745 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/preview.pngbin0 -> 898097 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/sprites.pngbin0 -> 83899 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/ui/backgroundSet.pngbin0 -> 9664 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/ui/block.pngbin0 -> 137 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/ui/buttonHelp.pngbin0 -> 2567 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/ui/buttonStart.pngbin0 -> 2668 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/ui/cloud.pngbin0 -> 1674 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/ui/gem.pngbin0 -> 1171 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/ui/heart.pngbin0 -> 1367 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/ui/helpBackground.pngbin0 -> 47994 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/ui/shield.pngbin0 -> 1702 bytes
-rw-r--r--testing_data/tiled_examples/sticker-knight/ui/title.json281
-rw-r--r--testing_data/tiled_examples/sticker-knight/ui/title.pngbin0 -> 12428 bytes
-rw-r--r--testing_data/tiled_examples/test_hexagonal_tile_60x60x30.pngbin0 -> 2934 bytes
-rw-r--r--testing_data/tiled_examples/test_hexagonal_tile_60x60x30.tmx30
-rw-r--r--testing_data/tiled_examples/tmw_desert_spacing.pngbin0 -> 37830 bytes
124 files changed, 2592 insertions, 0 deletions
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 0000000..c41cc9e
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1 @@
+/target \ No newline at end of file
diff --git a/Cargo.lock b/Cargo.lock
new file mode 100644
index 0000000..3df5c0d
--- /dev/null
+++ b/Cargo.lock
@@ -0,0 +1,53 @@
+# This file is automatically @generated by Cargo.
+# It is not intended for manual editing.
+[[package]]
+name = "anyhow"
+version = "1.0.40"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b"
+
+[[package]]
+name = "bytemuck"
+version = "1.5.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "bed57e2090563b83ba8f83366628ce535a7584c9afa4c9fc0612a03925c6df58"
+
+[[package]]
+name = "fast-tiled"
+version = "0.1.0"
+dependencies = [
+ "anyhow",
+ "read_color",
+ "rgb",
+ "roxmltree",
+]
+
+[[package]]
+name = "read_color"
+version = "1.0.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "9f4c8858baa4ad3c8bcc156ae91a0ffe22b76a3975c40c49b4f04c15c6bce0da"
+
+[[package]]
+name = "rgb"
+version = "0.8.27"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "8fddb3b23626145d1776addfc307e1a1851f60ef6ca64f376bcb889697144cf0"
+dependencies = [
+ "bytemuck",
+]
+
+[[package]]
+name = "roxmltree"
+version = "0.14.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "921904a62e410e37e215c40381b7117f830d9d89ba60ab5236170541dd25646b"
+dependencies = [
+ "xmlparser",
+]
+
+[[package]]
+name = "xmlparser"
+version = "0.13.3"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "114ba2b24d2167ef6d67d7d04c8cc86522b87f490025f39f0303b7db5bf5e3d8"
diff --git a/Cargo.toml b/Cargo.toml
new file mode 100644
index 0000000..f4267e6
--- /dev/null
+++ b/Cargo.toml
@@ -0,0 +1,13 @@
+[package]
+name = "fast-tiled"
+version = "0.1.0"
+authors = ["LawnCable <gitlab@lawncable.net>"]
+edition = "2018"
+
+# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
+
+[dependencies]
+anyhow = "1.0.40"
+rgb = "0.8.27"
+roxmltree = "0.14.1"
+read_color = "1.0.0" \ No newline at end of file
diff --git a/readme.md b/readme.md
new file mode 100644
index 0000000..6453a5e
--- /dev/null
+++ b/readme.md
@@ -0,0 +1,20 @@
+# fast_tiled
+
+Parser for the tmx format Version 1.5
+
+## Goals
+
+- fast parsing of tiled files
+- a low level (to parse single files)
+- a higher level API (point to a map and it loads all tile-maps it references, or loads an entire world from a world file and stuff like that)
+
+## The plan
+
+The idea is to first have something low level that just parses the tmx/tsx files and provides them in rust types.
+
+After that is done there could be more high level methods/struct that provide more high level functionality.
+
+Wishlist (things that would be nice):
+
+- serializing from rust types back to tmx/tsx (this needs including another xml lib, because roxmltree if fast because it is read-only)
+- parsing from and serializing back to the tiled json based formats
diff --git a/src/lib.rs b/src/lib.rs
new file mode 100644
index 0000000..3c9002e
--- /dev/null
+++ b/src/lib.rs
@@ -0,0 +1,3 @@
+
+
+pub mod lowlevel; \ No newline at end of file
diff --git a/src/lowlevel/map.rs b/src/lowlevel/map.rs
new file mode 100644
index 0000000..c2a33cf
--- /dev/null
+++ b/src/lowlevel/map.rs
@@ -0,0 +1,176 @@
+use anyhow::anyhow;
+use rgb::RGBA;
+
+// https://doc.mapeditor.org/en/stable/reference/tmx-map-format/#map
+
+/// Map orientation
+/// Tiled supports “orthogonal”, “isometric”, “staggered” and “hexagonal” (since 0.11).
+pub enum MapOrientation {
+ Orthogonal,
+ Isometric,
+ Staggered,
+ Hexagonal,
+}
+
+impl MapOrientation {
+ pub fn from_string(string: &str) -> anyhow::Result<MapOrientation> {
+ match string {
+ "orthogonal" => Ok(MapOrientation::Orthogonal),
+ "isometric" => Ok(MapOrientation::Isometric),
+ "staggered" => Ok(MapOrientation::Staggered),
+ "hexagonal" => Ok(MapOrientation::Hexagonal),
+ _ => Err(anyhow!("Unknown MapOrientation: {}", string)),
+ }
+ }
+
+ pub fn to_string(self) -> String {
+ match self {
+ MapOrientation::Orthogonal => "orthogonal".to_owned(),
+ MapOrientation::Isometric => "isometric".to_owned(),
+ MapOrientation::Staggered => "staggered".to_owned(),
+ MapOrientation::Hexagonal => "hexagonal".to_owned(),
+ }
+ }
+}
+
+/// The order in which tiles on tile layers are rendered.
+/// In all cases, the map is drawn row-by-row. (only supported for orthogonal maps at the moment)
+pub enum MapRenderOrder {
+ /// RightDown - The default
+ RightDown,
+ RightUp,
+ LeftDown,
+ LeftUp,
+}
+
+impl Default for MapRenderOrder {
+ fn default() -> Self {
+ MapRenderOrder::RightDown
+ }
+}
+
+impl MapRenderOrder {
+ pub fn from_string(string: &str) -> anyhow::Result<MapRenderOrder> {
+ match string {
+ "right-down" => Ok(MapRenderOrder::RightDown),
+ "right-up" => Ok(MapRenderOrder::RightUp),
+ "left-down" => Ok(MapRenderOrder::LeftDown),
+ "left-up" => Ok(MapRenderOrder::LeftUp),
+ _ => Err(anyhow!("Unknown MapRenderOrder: {}", string)),
+ }
+ }
+
+ pub fn to_string(self) -> String {
+ match self {
+ MapRenderOrder::RightDown => "right-down".to_owned(),
+ MapRenderOrder::RightUp => "right-up".to_owned(),
+ MapRenderOrder::LeftDown => "left-down".to_owned(),
+ MapRenderOrder::LeftUp => "left-up".to_owned(),
+ }
+ }
+}
+
+/// For staggered and hexagonal maps, determines which axis (“x” or “y”) is staggered. (since 0.11)
+pub enum StaggerAxis {
+ X,
+ Y,
+}
+
+impl StaggerAxis {
+ pub fn from_string(string: &str) -> anyhow::Result<StaggerAxis> {
+ match string {
+ "x" => Ok(StaggerAxis::X),
+ "y" => Ok(StaggerAxis::Y),
+ _ => Err(anyhow!("invalid StaggerAxis: {}", string)),
+ }
+ }
+
+ pub fn to_string(self) -> String {
+ match self {
+ StaggerAxis::X => "x".to_owned(),
+ StaggerAxis::Y => "y".to_owned(),
+ }
+ }
+}
+
+/// For staggered and hexagonal maps, determines whether the “even” or “odd” indexes along the staggered axis are shifted. (since 0.11)
+pub enum StaggerIndex {
+ Even,
+ Odd,
+}
+
+impl StaggerIndex {
+ pub fn from_string(string: &str) -> anyhow::Result<StaggerIndex> {
+ match string {
+ "even" => Ok(StaggerIndex::Even),
+ "odd" => Ok(StaggerIndex::Odd),
+ _ => Err(anyhow!("invalid StaggerIndex: {}", string)),
+ }
+ }
+
+ pub fn to_string(self) -> String {
+ match self {
+ StaggerIndex::Even => "even".to_owned(),
+ StaggerIndex::Odd => "odd".to_owned(),
+ }
+ }
+}
+
+pub struct Map {
+ /// The TMX format version. Was “1.0” so far, and will be incremented to match minor Tiled releases.
+ pub version: String,
+
+ /// The Tiled version used to save the file (since Tiled 1.0.1). May be a date (for snapshot builds). (optional)
+ pub tiledversion: Option<String>,
+
+ /// Map orientation. Tiled supports “orthogonal”, “isometric”, “staggered” and “hexagonal” (since 0.11).
+ pub orientation: MapOrientation,
+
+ /// The order in which tiles on tile layers are rendered.
+ pub renderorder: MapRenderOrder,
+
+ /// The compression level to use for tile layer data (defaults to -1, which means to use the algorithm default).
+ pub compressionlevel: Option<isize>, // TODO seems optional, please validate
+
+ // The map width in tiles.
+ pub width: usize,
+ /// The map height in tiles.
+ pub height: usize,
+
+ /// The width of a tile.
+ pub tilewidth: usize,
+ /// The height of a tile.
+ pub tileheight: usize,
+ /// Only for hexagonal maps. Determines the width or height (depending on the staggered axis) of the tile’s edge, in pixels.
+ pub hexsidelength: Option<usize>,
+
+ /// For staggered and hexagonal maps, determines which axis (“x” or “y”) is staggered. (since 0.11)
+ pub staggeraxis: Option<StaggerAxis>,
+ /// For staggered and hexagonal maps, determines whether the “even” or “odd” indexes along the staggered axis are shifted. (since 0.11)
+ pub staggerindex: Option<StaggerIndex>,
+
+ /// The background color of the map. (optional, may include alpha value since 0.15 in the form #AARRGGBB. Defaults to fully transparent.)
+ pub backgroundcolor: Option<RGBA<u8>>,
+
+ /// Stores the next available ID for new layers. This number is stored to prevent reuse of the same ID after layers have been removed. (since 1.2) (defaults to the highest layer id in the file + 1)
+ pub nextlayerid: usize, // TODO set default in funtions
+ /// Stores the next available ID for new objects. This number is stored to prevent reuse of the same ID after objects have been removed. (since 0.11) (defaults to the highest object id in the file + 1)
+ pub nextobjectid: usize,
+
+ /// Whether this map is infinite. An infinite map has no fixed size and can grow in all directions. Its layer data is stored in chunks. (0 for false, 1 for true, defaults to 0)
+ pub infinite: bool,
+
+ // xml child elements
+ pub properties: Option<super::property::Properties>,
+ // TODO Can contain any number: <tileset>, <layer>, <objectgroup>, <imagelayer>, <group> (since 1.0), <editorsettings> (since 1.3)
+}
+
+impl Map {
+ pub fn from_xml(doc: roxmltree::Document) -> anyhow::Result<Map> {
+ doc.root_element();
+
+ assert!(doc.root_element().has_tag_name("map"));
+
+ Err(anyhow!("not implemented"))
+ }
+}
diff --git a/src/lowlevel/mod.rs b/src/lowlevel/mod.rs
new file mode 100644
index 0000000..1a10f8d
--- /dev/null
+++ b/src/lowlevel/mod.rs
@@ -0,0 +1,3 @@
+pub mod map;
+
+pub mod property;
diff --git a/src/lowlevel/property.rs b/src/lowlevel/property.rs
new file mode 100644
index 0000000..26dcedd
--- /dev/null
+++ b/src/lowlevel/property.rs
@@ -0,0 +1,201 @@
+use anyhow::anyhow;
+use rgb::RGBA8;
+
+// https://doc.mapeditor.org/en/stable/reference/tmx-map-format/#property
+
+// name: The name of the property.
+// type: The type of the property. Can be string (default), int, float, bool, color, file or object (since 0.16, with color and file added in 0.17, and object added in 1.4).
+// value: The value of the property. (default string is “”, default number is 0, default boolean is “false”, default color is #00000000, default file is “.” (the current file’s parent directory))
+
+#[derive(Debug, PartialEq)]
+pub enum Property {
+ String { name: String, value: String },
+ Int { name: String, value: isize },
+ Float { name: String, value: f64 },
+ Bool { name: String, value: bool },
+ Color { name: String, value: RGBA8 },
+ File { name: String, value: String },
+ Object { name: String, value: usize },
+}
+
+impl Property {
+ pub fn from_xml(node: roxmltree::Node) -> anyhow::Result<Property> {
+ if node.node_type() != roxmltree::NodeType::Element {
+ return Err(anyhow!("xml -> node is not an element"));
+ }
+
+ let name = node
+ .attribute("name")
+ .ok_or(anyhow!("property name missing"))?
+ .to_owned();
+ let property_type = node
+ .attribute("type")
+ .ok_or(anyhow!("property type missing"))?;
+
+ // handle the case that 'string' value is stored in element content instead of value atribute
+ if property_type == "string" {
+ if let Some(child) = node.first_child() {
+ if let Some(text) = child.text() {
+ return Ok(Property::String {
+ name,
+ value: text.to_owned(),
+ });
+ } else {
+ return Err(anyhow!("property element content is not of NodeType::Text"));
+ }
+ }
+ }
+
+ let raw_value = node
+ .attribute("value")
+ .ok_or(anyhow!("property value missing"))?;
+
+ match property_type {
+ "string" => Ok(Property::String {
+ name,
+ value: raw_value.to_owned(),
+ }),
+ "int" => Ok(Property::Int {
+ name,
+ value: raw_value.parse()?,
+ }),
+ "float" => Ok(Property::Float {
+ name,
+ value: raw_value.parse()?,
+ }),
+ "bool" => {
+ let value = match raw_value {
+ "true" => Ok(true),
+ "false" => Ok(false),
+ _ => Err(anyhow!(
+ "boolean property has unexpected value: {}",
+ raw_value
+ )),
+ };
+ Ok(Property::Bool {
+ name,
+ value: value?,
+ })
+ }
+ "color" => {
+ let mut chars = raw_value.chars();
+ chars.next(); // remove the `#`
+ if let Some(color) = read_color::rgba(&mut chars) {
+ Ok(Property::Color {
+ name,
+ value: RGBA8 {
+ r: color[0],
+ g: color[1],
+ b: color[2],
+ a: color[3],
+ },
+ })
+ } else {
+ Err(anyhow!("could not parse color"))
+ }
+ }
+ "file" => Ok(Property::File {
+ name,
+ value: raw_value.to_owned(),
+ }),
+ "object" => Ok(Property::Object {
+ name,
+ value: raw_value.parse()?,
+ }),
+ _ => Err(anyhow!("unknown type {}", property_type)),
+ }
+ }
+
+ pub fn value_to_string(self) -> String {
+ match self {
+ Property::String { value, .. } => value,
+ Property::Int { value, .. } => format!("{}", value),
+ Property::Float { value, .. } => format!("{}", value),
+ Property::Bool { value, .. } => match value {
+ true => "true",
+ false => "false",
+ }
+ .to_owned(),
+ Property::Color { value, .. } => {
+ format!("#{:x}{:x}{:x}{:x}", value.r, value.g, value.b, value.a)
+ }
+ Property::File { value, .. } => value,
+ Property::Object { value, .. } => format!("{}", value),
+ }
+ }
+}
+
+// Wraps any number of custom properties
+#[derive(Debug)]
+pub struct Properties {
+ pub properties: Vec<Property>,
+}
+
+impl Properties {
+ fn from_xml(node: roxmltree::Node) -> anyhow::Result<Properties> {
+ Err(anyhow!("not implemented"))
+ }
+}
+
+#[cfg(test)]
+mod tests {
+ use crate::lowlevel::property::Property;
+ use rgb::RGBA8;
+
+ #[test]
+ fn parse_color_property() {
+ // Find element by id
+ let doc = roxmltree::Document::parse(
+ r##"<property name="enemyTint" type="color" value="#ffa33636"/>"##,
+ )
+ .unwrap();
+ let elem = doc.root_element();
+ assert_eq!(
+ Property::from_xml(elem).unwrap(),
+ Property::Color {
+ name: "enemyTint".to_owned(),
+ value: RGBA8 {
+ r: 255,
+ g: 163,
+ b: 54,
+ a: 54
+ }
+ }
+ );
+ }
+
+ #[test]
+ fn parse_string_property_inside_attribute() {
+ // Find element by id
+ let doc = roxmltree::Document::parse(
+ r##"<property name="enemyText" type="string" value="hello world"/>"##,
+ )
+ .unwrap();
+ let elem = doc.root_element();
+ assert_eq!(
+ Property::from_xml(elem).unwrap(),
+ Property::String {
+ name: "enemyText".to_owned(),
+ value: "hello world".to_owned()
+ }
+ );
+ }
+
+ #[test]
+ fn parse_string_property_inside_element() {
+ // Find element by id
+ let doc = roxmltree::Document::parse(
+ r##"<property name="enemyText" type="string">hello world</property>"##,
+ )
+ .unwrap();
+ let elem = doc.root_element();
+ println!("{:?}", elem.first_child());
+ assert_eq!(
+ Property::from_xml(elem).unwrap(),
+ Property::String {
+ name: "enemyText".to_owned(),
+ value: "hello world".to_owned()
+ }
+ );
+ }
+}
diff --git a/testing_data/tiled_examples/AUTHORS b/testing_data/tiled_examples/AUTHORS
new file mode 100644
index 0000000..37c09e9
--- /dev/null
+++ b/testing_data/tiled_examples/AUTHORS
@@ -0,0 +1,11 @@
+Tilesets:
+
+perspective_walls.png - (C) Clint Bellanger, released as Public Domain
+isometric_grass_and_water.png - (C) Clint Bellanger, released as GPL2, GPL3, CC-BY-SA3
+tmw_desert_spacing.png - (C) The Mana World Development Team, GPL
+sewer_tileset.png - (C) Blues Brothers RPG developers, GPL
+Replica Island - (C) Chris Pruett and Genki Mine, Apache (except hotspots.png)
+hexmini.png - Public Domain, http://opengameart.org/content/pixel-hex-tilesets-enhanced
+buch-outdoor.png - (C) Michele "Buch" Bucelli, CC-BY 3.0, http://opengameart.org/users/buch
+examples/sticker-knight - (C) Ponywolf, CC0, http://opengameart.org/content/sticker-knight-platformer
+wangblob.png, CC0, https://opengameart.org/content/seamless-tileset-template-ii \ No newline at end of file
diff --git a/testing_data/tiled_examples/buch-outdoor.png b/testing_data/tiled_examples/buch-outdoor.png
new file mode 100644
index 0000000..94a387c
--- /dev/null
+++ b/testing_data/tiled_examples/buch-outdoor.png
Binary files differ
diff --git a/testing_data/tiled_examples/desert.tmx b/testing_data/tiled_examples/desert.tmx
new file mode 100644
index 0000000..cc5e308
--- /dev/null
+++ b/testing_data/tiled_examples/desert.tmx
@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.0" tiledversion="1.1.5" orientation="orthogonal" renderorder="right-down" width="40" height="40" tilewidth="32" tileheight="32" infinite="0" nextlayerid="2" nextobjectid="1">
+ <tileset firstgid="1" source="desert.tsx"/>
+ <layer id="1" name="Ground" width="40" height="40">
+ <data encoding="base64" compression="zlib">
+ eJztmNkKwjAQRaN9cAPrAq5Yq3Xf6v9/nSM2VIbQJjEZR+nDwQZScrwztoORECLySBcIgZ7nc2y4KfyWDLx+Jb9nViNgDEwY+KioAXUgQN4+zpoCMwPmQAtoAx2CLFbA2oDEo9+hwG8DnIDtF/2K8ks086Tw2zH0uyMv7HcRr/6/EvvhnsPrsrxwX7rwU/0ODig/eV3mh3N1ld8eraWPaX6+64s9McesfrqcHfg1MpoifxcVEWjukyw+9AtFPl/I71pER3Of6j4bv7HI54s+MChhqLlPdZ/P3qMmFuo5h5NnTOhjM5tReN2yT51n5/v7J3F0vi46fk+ne7aX0i9l6If7mpufTX3f5wsqv9TAD2fJLT9VrTn7UeZnM5tR+v0LMQOHXwFnxe2/warGFRWf8QDjOLfP
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/desert.tsx b/testing_data/tiled_examples/desert.tsx
new file mode 100644
index 0000000..c2a2cfc
--- /dev/null
+++ b/testing_data/tiled_examples/desert.tsx
@@ -0,0 +1,68 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<tileset version="1.4" tiledversion="1.4.3" name="Desert" tilewidth="32" tileheight="32" spacing="1" margin="1" tilecount="48" columns="8">
+ <image source="tmw_desert_spacing.png" width="265" height="199"/>
+ <tile id="30" probability="0.01"/>
+ <tile id="31" probability="0.01"/>
+ <tile id="37" probability="0.01"/>
+ <tile id="38" probability="0.01"/>
+ <tile id="39" probability="0.01"/>
+ <tile id="45" probability="0"/>
+ <tile id="46" probability="0.01"/>
+ <tile id="47" probability="0.01"/>
+ <wangsets>
+ <wangset name="Desert" type="corner" tile="5">
+ <wangcolor name="Desert" color="#ff0000" tile="29" probability="1"/>
+ <wangcolor name="Brick" color="#00ff00" tile="9" probability="1"/>
+ <wangcolor name="Cobblestone" color="#0000ff" tile="33" probability="1"/>
+ <wangcolor name="Dirt" color="#ff7700" tile="14" probability="1"/>
+ <wangtile tileid="0" wangid="0,1,0,2,0,1,0,1"/>
+ <wangtile tileid="1" wangid="0,1,0,2,0,2,0,1"/>
+ <wangtile tileid="2" wangid="0,1,0,1,0,2,0,1"/>
+ <wangtile tileid="3" wangid="0,4,0,1,0,4,0,4"/>
+ <wangtile tileid="4" wangid="0,4,0,4,0,1,0,4"/>
+ <wangtile tileid="5" wangid="0,1,0,4,0,1,0,1"/>
+ <wangtile tileid="6" wangid="0,1,0,4,0,4,0,1"/>
+ <wangtile tileid="7" wangid="0,1,0,1,0,4,0,1"/>
+ <wangtile tileid="8" wangid="0,2,0,2,0,1,0,1"/>
+ <wangtile tileid="9" wangid="0,2,0,2,0,2,0,2"/>
+ <wangtile tileid="10" wangid="0,1,0,1,0,2,0,2"/>
+ <wangtile tileid="11" wangid="0,1,0,4,0,4,0,4"/>
+ <wangtile tileid="12" wangid="0,4,0,4,0,4,0,1"/>
+ <wangtile tileid="13" wangid="0,4,0,4,0,1,0,1"/>
+ <wangtile tileid="14" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="15" wangid="0,1,0,1,0,4,0,4"/>
+ <wangtile tileid="16" wangid="0,2,0,1,0,1,0,1"/>
+ <wangtile tileid="17" wangid="0,2,0,1,0,1,0,2"/>
+ <wangtile tileid="18" wangid="0,1,0,1,0,1,0,2"/>
+ <wangtile tileid="19" wangid="0,2,0,1,0,2,0,2"/>
+ <wangtile tileid="20" wangid="0,2,0,2,0,1,0,2"/>
+ <wangtile tileid="21" wangid="0,4,0,1,0,1,0,1"/>
+ <wangtile tileid="22" wangid="0,4,0,1,0,1,0,4"/>
+ <wangtile tileid="23" wangid="0,1,0,1,0,1,0,4"/>
+ <wangtile tileid="24" wangid="0,1,0,3,0,1,0,1"/>
+ <wangtile tileid="25" wangid="0,1,0,3,0,3,0,1"/>
+ <wangtile tileid="26" wangid="0,1,0,1,0,3,0,1"/>
+ <wangtile tileid="27" wangid="0,1,0,2,0,2,0,2"/>
+ <wangtile tileid="28" wangid="0,2,0,2,0,2,0,1"/>
+ <wangtile tileid="29" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="30" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="31" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="32" wangid="0,3,0,3,0,1,0,1"/>
+ <wangtile tileid="33" wangid="0,3,0,3,0,3,0,3"/>
+ <wangtile tileid="34" wangid="0,1,0,1,0,3,0,3"/>
+ <wangtile tileid="35" wangid="0,3,0,1,0,3,0,3"/>
+ <wangtile tileid="36" wangid="0,3,0,3,0,1,0,3"/>
+ <wangtile tileid="37" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="38" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="39" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="40" wangid="0,3,0,1,0,1,0,1"/>
+ <wangtile tileid="41" wangid="0,3,0,1,0,1,0,3"/>
+ <wangtile tileid="42" wangid="0,1,0,1,0,1,0,3"/>
+ <wangtile tileid="43" wangid="0,1,0,3,0,3,0,3"/>
+ <wangtile tileid="44" wangid="0,3,0,3,0,3,0,1"/>
+ <wangtile tileid="45" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="46" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="47" wangid="0,1,0,1,0,1,0,1"/>
+ </wangset>
+ </wangsets>
+</tileset>
diff --git a/testing_data/tiled_examples/hexagonal-mini.tmx b/testing_data/tiled_examples/hexagonal-mini.tmx
new file mode 100644
index 0000000..388fd5b
--- /dev/null
+++ b/testing_data/tiled_examples/hexagonal-mini.tmx
@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.0" orientation="hexagonal" renderorder="right-down" width="20" height="20" tilewidth="14" tileheight="12" hexsidelength="6" staggeraxis="y" staggerindex="odd" nextobjectid="2">
+ <tileset firstgid="1" name="hex mini" tilewidth="18" tileheight="18">
+ <tileoffset x="0" y="1"/>
+ <image source="hexmini.png" width="106" height="72"/>
+ </tileset>
+ <layer name="Ground" width="20" height="20">
+ <data encoding="base64" compression="zlib">
+ eJyl1FEKhDAMBNBSt6jVaL3/Za2QwDAkVdiPQda2zyTonimlU1N6Ws+lkZ6l56AUXcPY2qlniv5uL5Z5BdyDvFXXMoX3Rp44axl6nqFejj3LLK6xgmf3Zg06Qs+O+qiaDOZOVgXPs7jfCme8Hkce1+fNlGdlM3myDTzc580fz1htW2Baj15/R/J72wLvcVZN5HnzGnmVPJ5hNH+0dt33j4ex91TARUs+WjNZz/fewKvJfy+/1naR+dX7OfdEnUYefyOeZZ7Vht/b5HjefxJbO1iTE7YWuEpg5hfPzi8D782x3Mg7DV4=
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/hexmini.png b/testing_data/tiled_examples/hexmini.png
new file mode 100644
index 0000000..12d17bf
--- /dev/null
+++ b/testing_data/tiled_examples/hexmini.png
Binary files differ
diff --git a/testing_data/tiled_examples/isometric_grass_and_water.png b/testing_data/tiled_examples/isometric_grass_and_water.png
new file mode 100644
index 0000000..b342a0c
--- /dev/null
+++ b/testing_data/tiled_examples/isometric_grass_and_water.png
Binary files differ
diff --git a/testing_data/tiled_examples/isometric_grass_and_water.tmx b/testing_data/tiled_examples/isometric_grass_and_water.tmx
new file mode 100644
index 0000000..1ddc0ed
--- /dev/null
+++ b/testing_data/tiled_examples/isometric_grass_and_water.tmx
@@ -0,0 +1,43 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.4" tiledversion="1.4.3" orientation="isometric" renderorder="right-down" width="25" height="25" tilewidth="64" tileheight="32" infinite="0" nextlayerid="2" nextobjectid="1">
+ <tileset firstgid="1" name="isometric_grass_and_water" tilewidth="64" tileheight="64" tilecount="24" columns="4">
+ <tileoffset x="0" y="16"/>
+ <grid orientation="isometric" width="64" height="32"/>
+ <image source="isometric_grass_and_water.png" width="256" height="384"/>
+ <wangsets>
+ <wangset name="Grass and Water" type="corner" tile="15">
+ <wangcolor name="Grass" color="#8ab022" tile="0" probability="1"/>
+ <wangcolor name="Water" color="#378dc2" tile="23" probability="1"/>
+ <wangtile tileid="0" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="1" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="2" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="3" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="4" wangid="0,1,0,2,0,1,0,1"/>
+ <wangtile tileid="5" wangid="0,1,0,1,0,2,0,1"/>
+ <wangtile tileid="6" wangid="0,1,0,1,0,1,0,2"/>
+ <wangtile tileid="7" wangid="0,2,0,1,0,1,0,1"/>
+ <wangtile tileid="8" wangid="0,2,0,2,0,2,0,1"/>
+ <wangtile tileid="9" wangid="0,1,0,2,0,2,0,2"/>
+ <wangtile tileid="10" wangid="0,2,0,1,0,2,0,2"/>
+ <wangtile tileid="11" wangid="0,2,0,2,0,1,0,2"/>
+ <wangtile tileid="12" wangid="0,1,0,2,0,2,0,1"/>
+ <wangtile tileid="13" wangid="0,1,0,1,0,2,0,2"/>
+ <wangtile tileid="14" wangid="0,2,0,1,0,1,0,2"/>
+ <wangtile tileid="15" wangid="0,2,0,2,0,1,0,1"/>
+ <wangtile tileid="16" wangid="0,1,0,2,0,2,0,1"/>
+ <wangtile tileid="17" wangid="0,1,0,1,0,2,0,2"/>
+ <wangtile tileid="18" wangid="0,2,0,1,0,1,0,2"/>
+ <wangtile tileid="19" wangid="0,2,0,2,0,1,0,1"/>
+ <wangtile tileid="20" wangid="0,2,0,1,0,2,0,1"/>
+ <wangtile tileid="21" wangid="0,1,0,2,0,1,0,2"/>
+ <wangtile tileid="22" wangid="0,2,0,2,0,2,0,2"/>
+ <wangtile tileid="23" wangid="0,2,0,2,0,2,0,2"/>
+ </wangset>
+ </wangsets>
+ </tileset>
+ <layer id="1" name="Tile Layer 1" width="25" height="25">
+ <data encoding="base64" compression="zlib">
+ eJx1lttywjAMROVgyqVtAoFC/v9L68xoh5PFPGhIYktrrVYyS0QszZ7Nvpvd0n7y24L1Q7MhrTSreN/le821HZ7lv9qYa6sdE0cYs/kX7PXYwtfaevYp7WDrd+SnHByjYr/npP1zZ4/elcuM71rjeckdc5KNHX75fMwc9s2uzb6AsYstJzwrv5/Tz89SLIZy8v203llV8xl7yMU+462/v81OqA114/UhrzUxRqwprnh6ZGzp2PNQfPqRu/X9hnMV8F/xLg1L42erDf2oaa2RI2qPtbgbhmw2H69nMUxx/gVccXdC3AW/o/HV60vW59Lhu8arDxmfGIPFUV1qbLVQEIs4PlOeHQxqVjmzr5mLYsmf+5Qj5yM1r3Ne4p1D5VcMh3qWZibLx2fYkBhPYOv81I9wbrGd45zFU7zrndpwDjkHXXfej9zHc3EG+D3AWcCZMJif7hTnVxr6i9edtoBDz8N7kxqbY6sN9gJnsnqIOqCme7Un76579sIV8dccHvHqZefH76BP9wjzkVapM2rL+5/8cR6QS9eh8p2AT12y5oO9+7yh5hzLZypnHX29/pzB9PE7bOg8Mza5KvGu4R7mp/89zqvr7x+TnxEn
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/isometric_staggered_grass_and_water.tmx b/testing_data/tiled_examples/isometric_staggered_grass_and_water.tmx
new file mode 100644
index 0000000..bb86c9f
--- /dev/null
+++ b/testing_data/tiled_examples/isometric_staggered_grass_and_water.tmx
@@ -0,0 +1,66 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.4" tiledversion="1.4.3" orientation="staggered" renderorder="right-down" width="25" height="50" tilewidth="64" tileheight="32" infinite="1" staggeraxis="y" staggerindex="odd" nextlayerid="2" nextobjectid="1">
+ <tileset firstgid="1" name="isometric_grass_and_water" tilewidth="64" tileheight="64" tilecount="24" columns="4">
+ <tileoffset x="0" y="16"/>
+ <grid orientation="isometric" width="64" height="32"/>
+ <image source="isometric_grass_and_water.png" width="256" height="384"/>
+ <wangsets>
+ <wangset name="Terrains" type="corner" tile="15">
+ <wangcolor name="Grass" color="#8ae234" tile="0" probability="1"/>
+ <wangcolor name="Water" color="#729fcf" tile="22" probability="1"/>
+ <wangtile tileid="0" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="1" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="2" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="3" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="4" wangid="0,1,0,2,0,1,0,1"/>
+ <wangtile tileid="5" wangid="0,1,0,1,0,2,0,1"/>
+ <wangtile tileid="6" wangid="0,1,0,1,0,1,0,2"/>
+ <wangtile tileid="7" wangid="0,2,0,1,0,1,0,1"/>
+ <wangtile tileid="8" wangid="0,2,0,2,0,2,0,1"/>
+ <wangtile tileid="9" wangid="0,1,0,2,0,2,0,2"/>
+ <wangtile tileid="10" wangid="0,2,0,1,0,2,0,2"/>
+ <wangtile tileid="11" wangid="0,2,0,2,0,1,0,2"/>
+ <wangtile tileid="12" wangid="0,1,0,2,0,2,0,1"/>
+ <wangtile tileid="13" wangid="0,1,0,1,0,2,0,2"/>
+ <wangtile tileid="14" wangid="0,2,0,1,0,1,0,2"/>
+ <wangtile tileid="15" wangid="0,2,0,2,0,1,0,1"/>
+ <wangtile tileid="16" wangid="0,1,0,2,0,2,0,1"/>
+ <wangtile tileid="17" wangid="0,1,0,1,0,2,0,2"/>
+ <wangtile tileid="18" wangid="0,2,0,1,0,1,0,2"/>
+ <wangtile tileid="19" wangid="0,2,0,2,0,1,0,1"/>
+ <wangtile tileid="20" wangid="0,2,0,1,0,2,0,1"/>
+ <wangtile tileid="21" wangid="0,1,0,2,0,1,0,2"/>
+ <wangtile tileid="22" wangid="0,2,0,2,0,2,0,2"/>
+ <wangtile tileid="23" wangid="0,2,0,2,0,2,0,2"/>
+ </wangset>
+ </wangsets>
+ </tileset>
+ <layer id="1" name="Tile Layer 1" width="25" height="50">
+ <data encoding="base64" compression="zlib">
+ <chunk x="0" y="0" width="16" height="16">
+ eJxdk9sSgyAQQ7FSsVovtY76/19amEnGUx4yCrtks1m4QghXxpkxZnyFt/YuxFPGQ2gyImIFc0Yr9OLw+U35jeL+lpqLkMBbYjt0JdTl+Q351ua1NZScJ9CCY676qf971S7fl9CBY9Ca59intSzywfWcb2+aSnsrrZ2+E3qJ4Dan9fqMtR/QPVR5u2ad4If7jVh7jqe4I/ygbvdl/Zzjpfqek/1gr5P4m/Dv0RruOzZVnrr2ihod9ovOMdx3+RPuO7Cg7x055nAPKdzv4VTf1sF7wjfDOVkD31KnfftMDs7UsaRZjYK9pM/m8EzreZS9QzUm9fwDPTIJFw==
+ </chunk>
+ <chunk x="16" y="0" width="16" height="16">
+ eJyVUu0KwjAMvGbVjU3F/XLv/6Q2kNCbShMDBytrch+pAJCGqaEaCp31e1S/+oqd/d+oKt2VDy2S4Od7FWctjqifPbiOrH7mYR2CHP8FPTP2zV5GtVuvzrnie5cS9B82Y2mYSYcj0v8yXt77P/lr/0p3J/OS9a/67+iZPU2P7y/iv5GHYv0r8vtn/ZrhRrP8LUX8B3qGM/oeMvtT/gfOeblvfwujegOrqALV
+ </chunk>
+ <chunk x="0" y="16" width="16" height="16">
+ eJydUtkKwzAMy+FerOtGU0j//0tngwJamga2B5HEtuQrwTkXFF4hgIdtUIy4l/dbsShOnJ44keKe8G+wH8QzZCAQN1JsRtwO/aPiPnAXaHDds+KlSIoJ70y8Hf6Tai4aQjZP+onqmRCzUu0lN/chpJPALfYZb+bxHMV970Mob4mfKEer5kD63GOs4r277rGlx71Guv+DOvcviDcaQ3X2IO5av+3E/q39tbHD452wz3a80F5bPfP8WjNYO/w6Z823+rfODIR8BR8vlwUi
+ </chunk>
+ <chunk x="16" y="16" width="16" height="16">
+ eJydUlsOwzAIg66vPdS11aTl/icdaLbCF8mGZJFIMTaQIiI3w2C4AH4ecfacxd0wgzMZFDwNNbNw7QXvX6jFGiNqZDHj7W7YwInetcHf8HY1nFL7n0IfWSiwBL/exyF989Pgd8DdvRSps8gi7oz5Kd+59viPs6K+58cf+uxlhT5n09In4t579cnjzjzzL/To0zN5R/DPnlr6/H9v8Om9h0995xfUuP7gn/+NXM+n1Lm0+B9/vgOT
+ </chunk>
+ <chunk x="0" y="32" width="16" height="16">
+ eJy9k1EPgjAMhDsVQUFFXLL9/1/qFrt4XFrliYcvwLrj2ksaRCQAvT5j4Ua1Y6ErzIWLEgxqPRWedB5Vk7WeHH3UWqYeZtJmxztD/Uz/bOfZ8R/gXuVKMzGsf4FH0v4Hx9vqvzLBvZbBJOvZPT17Jc3c8vbyf9B9zhyx9C2D0ejlX//YwwJzjw4HR99DFnf9tvD8cZZF36vXST57gDvxS7/FY286+e7xGy8BCeE=
+ </chunk>
+ <chunk x="16" y="32" width="16" height="16">
+ eJydkosKgzAMRaNO3Xzt4UD//0u9xVwMZbTpCgdRcm5CzSwid7CDUZ8DuIFKSZ0ZrGABE9hABxqnv2lGb+YYCv231k/mvS7wd52Z/TkTZ0gdzhvq1iivtH+ofUaZHv9jZqXv7R9qF60L/7zWDH7L+axr5Lrz3rgenx4z7O61Gb+KsO5Xzvsp8S3ch3997mPqtMov/+Xo/5BzV+MMurn+B0mZBM8=
+ </chunk>
+ <chunk x="0" y="48" width="16" height="16">
+ eJxjZGBgYCQRiwAxJxSTqpcDiCWQ8CgYBaNg4AAADXoAkA==
+ </chunk>
+ <chunk x="16" y="48" width="16" height="16">
+ eJwTZ2BgEAdiTiDmBWJGKBYAYgmoHD4AUwPCbFC9HGjio2AUjILBCQBLaAEh
+ </chunk>
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/orthogonal-outside.tmx b/testing_data/tiled_examples/orthogonal-outside.tmx
new file mode 100644
index 0000000..5b2eeef
--- /dev/null
+++ b/testing_data/tiled_examples/orthogonal-outside.tmx
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.4" tiledversion="1.4.3" orientation="orthogonal" renderorder="right-down" width="45" height="31" tilewidth="16" tileheight="16" infinite="0" nextlayerid="4" nextobjectid="37">
+ <properties>
+ <property name="enemyTint" type="color" value="#ffa33636"/>
+ </properties>
+ <tileset firstgid="1" name="outdoor" tilewidth="16" tileheight="16" tilecount="288" columns="24">
+ <image source="buch-outdoor.png" width="384" height="192"/>
+ <tile id="6" probability="0.1"/>
+ <tile id="27" probability="0.05"/>
+ <tile id="28" probability="0.05"/>
+ <tile id="30" probability="0.1"/>
+ <tile id="51" probability="0.05"/>
+ <tile id="52" probability="0.05"/>
+ <tile id="54" probability="0.1"/>
+ <tile id="75" probability="0.05"/>
+ <tile id="76" probability="0.05"/>
+ <tile id="78" probability="0.1"/>
+ <tile id="82" probability="0.1"/>
+ <tile id="83" probability="0.1"/>
+ <tile id="99" probability="0.05"/>
+ <tile id="102" probability="0.1"/>
+ <tile id="106" probability="0.1"/>
+ <tile id="107" probability="0.1"/>
+ <tile id="126" probability="0.1"/>
+ <wangsets>
+ <wangset name="Terrains" type="corner" tile="25">
+ <wangcolor name="Grass" color="#fce94f" tile="150" probability="1"/>
+ <wangcolor name="Dirt" color="#ef2929" tile="100" probability="1"/>
+ <wangcolor name="Dark Dirt" color="#f57900" tile="34" probability="1"/>
+ <wangcolor name="Water" color="#729fcf" tile="171" probability="1"/>
+ <wangtile tileid="0" wangid="0,1,0,2,0,1,0,1"/>
+ <wangtile tileid="1" wangid="0,1,0,2,0,2,0,1"/>
+ <wangtile tileid="2" wangid="0,1,0,2,0,2,0,1"/>
+ <wangtile tileid="3" wangid="0,1,0,2,0,2,0,1"/>
+ <wangtile tileid="4" wangid="0,1,0,2,0,2,0,1"/>
+ <wangtile tileid="5" wangid="0,1,0,1,0,2,0,1"/>
+ <wangtile tileid="6" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="7" wangid="0,2,0,3,0,2,0,2"/>
+ <wangtile tileid="8" wangid="0,2,0,3,0,3,0,2"/>
+ <wangtile tileid="9" wangid="0,2,0,3,0,3,0,2"/>
+ <wangtile tileid="10" wangid="0,2,0,3,0,3,0,2"/>
+ <wangtile tileid="11" wangid="0,2,0,3,0,3,0,2"/>
+ <wangtile tileid="12" wangid="0,2,0,2,0,3,0,2"/>
+ <wangtile tileid="13" wangid="0,1,0,3,0,1,0,1"/>
+ <wangtile tileid="14" wangid="0,1,0,3,0,3,0,1"/>
+ <wangtile tileid="15" wangid="0,1,0,3,0,3,0,1"/>
+ <wangtile tileid="16" wangid="0,1,0,3,0,3,0,1"/>
+ <wangtile tileid="17" wangid="0,1,0,3,0,3,0,1"/>
+ <wangtile tileid="18" wangid="0,1,0,1,0,3,0,1"/>
+ <wangtile tileid="24" wangid="0,2,0,2,0,1,0,1"/>
+ <wangtile tileid="25" wangid="0,2,0,1,0,2,0,2"/>
+ <wangtile tileid="26" wangid="0,2,0,2,0,1,0,2"/>
+ <wangtile tileid="27" wangid="0,2,0,2,0,2,0,2"/>
+ <wangtile tileid="28" wangid="0,2,0,2,0,2,0,2"/>
+ <wangtile tileid="29" wangid="0,1,0,1,0,2,0,2"/>
+ <wangtile tileid="30" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="31" wangid="0,3,0,3,0,2,0,2"/>
+ <wangtile tileid="32" wangid="0,3,0,2,0,3,0,3"/>
+ <wangtile tileid="33" wangid="0,3,0,3,0,2,0,3"/>
+ <wangtile tileid="34" wangid="0,3,0,3,0,3,0,3"/>
+ <wangtile tileid="35" wangid="0,3,0,3,0,3,0,3"/>
+ <wangtile tileid="36" wangid="0,2,0,2,0,3,0,3"/>
+ <wangtile tileid="37" wangid="0,3,0,3,0,1,0,1"/>
+ <wangtile tileid="38" wangid="0,3,0,1,0,3,0,3"/>
+ <wangtile tileid="39" wangid="0,3,0,3,0,1,0,3"/>
+ <wangtile tileid="40" wangid="0,3,0,3,0,3,0,3"/>
+ <wangtile tileid="42" wangid="0,1,0,1,0,3,0,3"/>
+ <wangtile tileid="48" wangid="0,2,0,2,0,1,0,1"/>
+ <wangtile tileid="49" wangid="0,1,0,2,0,2,0,2"/>
+ <wangtile tileid="50" wangid="0,2,0,2,0,2,0,1"/>
+ <wangtile tileid="51" wangid="0,2,0,2,0,2,0,2"/>
+ <wangtile tileid="52" wangid="0,2,0,2,0,2,0,2"/>
+ <wangtile tileid="53" wangid="0,1,0,1,0,2,0,2"/>
+ <wangtile tileid="54" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="55" wangid="0,3,0,3,0,2,0,2"/>
+ <wangtile tileid="56" wangid="0,2,0,3,0,3,0,3"/>
+ <wangtile tileid="57" wangid="0,3,0,3,0,3,0,2"/>
+ <wangtile tileid="58" wangid="0,3,0,3,0,3,0,3"/>
+ <wangtile tileid="59" wangid="0,3,0,3,0,3,0,3"/>
+ <wangtile tileid="60" wangid="0,2,0,2,0,3,0,3"/>
+ <wangtile tileid="61" wangid="0,3,0,3,0,1,0,1"/>
+ <wangtile tileid="62" wangid="0,1,0,3,0,3,0,3"/>
+ <wangtile tileid="63" wangid="0,3,0,3,0,3,0,1"/>
+ <wangtile tileid="66" wangid="0,1,0,1,0,3,0,3"/>
+ <wangtile tileid="72" wangid="0,2,0,2,0,1,0,1"/>
+ <wangtile tileid="73" wangid="0,2,0,1,0,2,0,1"/>
+ <wangtile tileid="74" wangid="0,1,0,2,0,1,0,2"/>
+ <wangtile tileid="75" wangid="0,2,0,2,0,2,0,2"/>
+ <wangtile tileid="76" wangid="0,2,0,2,0,2,0,2"/>
+ <wangtile tileid="77" wangid="0,1,0,1,0,2,0,2"/>
+ <wangtile tileid="78" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="79" wangid="0,3,0,3,0,2,0,2"/>
+ <wangtile tileid="80" wangid="0,3,0,2,0,3,0,2"/>
+ <wangtile tileid="81" wangid="0,2,0,3,0,2,0,3"/>
+ <wangtile tileid="82" wangid="0,3,0,3,0,3,0,3"/>
+ <wangtile tileid="83" wangid="0,3,0,3,0,3,0,3"/>
+ <wangtile tileid="84" wangid="0,2,0,2,0,3,0,3"/>
+ <wangtile tileid="85" wangid="0,3,0,3,0,1,0,1"/>
+ <wangtile tileid="86" wangid="0,3,0,1,0,3,0,1"/>
+ <wangtile tileid="87" wangid="0,1,0,3,0,1,0,3"/>
+ <wangtile tileid="90" wangid="0,1,0,1,0,3,0,3"/>
+ <wangtile tileid="96" wangid="0,2,0,2,0,1,0,1"/>
+ <wangtile tileid="97" wangid="0,1,0,2,0,1,0,2"/>
+ <wangtile tileid="98" wangid="0,2,0,1,0,2,0,1"/>
+ <wangtile tileid="99" wangid="0,2,0,2,0,2,0,2"/>
+ <wangtile tileid="100" wangid="0,2,0,2,0,2,0,2"/>
+ <wangtile tileid="101" wangid="0,1,0,1,0,2,0,2"/>
+ <wangtile tileid="102" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="103" wangid="0,3,0,3,0,2,0,2"/>
+ <wangtile tileid="104" wangid="0,2,0,3,0,2,0,3"/>
+ <wangtile tileid="105" wangid="0,3,0,2,0,3,0,2"/>
+ <wangtile tileid="106" wangid="0,3,0,3,0,3,0,3"/>
+ <wangtile tileid="107" wangid="0,3,0,3,0,3,0,3"/>
+ <wangtile tileid="108" wangid="0,2,0,2,0,3,0,3"/>
+ <wangtile tileid="109" wangid="0,3,0,3,0,1,0,1"/>
+ <wangtile tileid="110" wangid="0,1,0,3,0,1,0,3"/>
+ <wangtile tileid="111" wangid="0,3,0,1,0,3,0,1"/>
+ <wangtile tileid="114" wangid="0,1,0,1,0,3,0,3"/>
+ <wangtile tileid="120" wangid="0,2,0,1,0,1,0,1"/>
+ <wangtile tileid="121" wangid="0,2,0,1,0,1,0,2"/>
+ <wangtile tileid="122" wangid="0,2,0,1,0,1,0,2"/>
+ <wangtile tileid="123" wangid="0,2,0,1,0,1,0,2"/>
+ <wangtile tileid="124" wangid="0,2,0,1,0,1,0,2"/>
+ <wangtile tileid="125" wangid="0,1,0,1,0,1,0,2"/>
+ <wangtile tileid="126" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="127" wangid="0,3,0,2,0,2,0,2"/>
+ <wangtile tileid="128" wangid="0,3,0,2,0,2,0,3"/>
+ <wangtile tileid="129" wangid="0,3,0,2,0,2,0,3"/>
+ <wangtile tileid="130" wangid="0,3,0,2,0,2,0,3"/>
+ <wangtile tileid="131" wangid="0,3,0,2,0,2,0,3"/>
+ <wangtile tileid="132" wangid="0,2,0,2,0,2,0,3"/>
+ <wangtile tileid="133" wangid="0,3,0,1,0,1,0,1"/>
+ <wangtile tileid="134" wangid="0,3,0,1,0,1,0,3"/>
+ <wangtile tileid="135" wangid="0,3,0,1,0,1,0,3"/>
+ <wangtile tileid="136" wangid="0,3,0,1,0,1,0,3"/>
+ <wangtile tileid="137" wangid="0,3,0,1,0,1,0,3"/>
+ <wangtile tileid="138" wangid="0,1,0,1,0,1,0,3"/>
+ <wangtile tileid="144" wangid="0,1,0,4,0,1,0,1"/>
+ <wangtile tileid="145" wangid="0,1,0,4,0,4,0,1"/>
+ <wangtile tileid="146" wangid="0,1,0,4,0,4,0,1"/>
+ <wangtile tileid="147" wangid="0,1,0,4,0,4,0,1"/>
+ <wangtile tileid="148" wangid="0,1,0,4,0,4,0,1"/>
+ <wangtile tileid="149" wangid="0,1,0,1,0,4,0,1"/>
+ <wangtile tileid="150" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="151" wangid="0,2,0,4,0,2,0,2"/>
+ <wangtile tileid="152" wangid="0,2,0,4,0,4,0,2"/>
+ <wangtile tileid="153" wangid="0,2,0,4,0,4,0,2"/>
+ <wangtile tileid="154" wangid="0,2,0,4,0,4,0,2"/>
+ <wangtile tileid="155" wangid="0,2,0,4,0,4,0,2"/>
+ <wangtile tileid="156" wangid="0,2,0,2,0,4,0,2"/>
+ <wangtile tileid="168" wangid="0,4,0,4,0,1,0,1"/>
+ <wangtile tileid="169" wangid="0,4,0,1,0,4,0,4"/>
+ <wangtile tileid="170" wangid="0,4,0,4,0,1,0,4"/>
+ <wangtile tileid="171" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="172" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="173" wangid="0,1,0,1,0,4,0,4"/>
+ <wangtile tileid="174" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="175" wangid="0,4,0,4,0,2,0,2"/>
+ <wangtile tileid="176" wangid="0,4,0,2,0,4,0,4"/>
+ <wangtile tileid="177" wangid="0,4,0,4,0,2,0,4"/>
+ <wangtile tileid="178" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="179" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="180" wangid="0,2,0,2,0,4,0,4"/>
+ <wangtile tileid="192" wangid="0,4,0,4,0,1,0,1"/>
+ <wangtile tileid="193" wangid="0,1,0,4,0,4,0,4"/>
+ <wangtile tileid="194" wangid="0,4,0,4,0,4,0,1"/>
+ <wangtile tileid="195" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="196" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="197" wangid="0,1,0,1,0,4,0,4"/>
+ <wangtile tileid="198" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="199" wangid="0,4,0,4,0,2,0,2"/>
+ <wangtile tileid="200" wangid="0,2,0,4,0,4,0,4"/>
+ <wangtile tileid="201" wangid="0,4,0,4,0,4,0,2"/>
+ <wangtile tileid="202" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="203" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="204" wangid="0,2,0,2,0,4,0,4"/>
+ <wangtile tileid="216" wangid="0,4,0,4,0,1,0,1"/>
+ <wangtile tileid="217" wangid="0,4,0,1,0,4,0,1"/>
+ <wangtile tileid="218" wangid="0,1,0,4,0,1,0,4"/>
+ <wangtile tileid="219" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="220" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="221" wangid="0,1,0,1,0,4,0,4"/>
+ <wangtile tileid="222" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="223" wangid="0,4,0,4,0,2,0,2"/>
+ <wangtile tileid="224" wangid="0,4,0,2,0,4,0,2"/>
+ <wangtile tileid="225" wangid="0,2,0,4,0,2,0,4"/>
+ <wangtile tileid="226" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="227" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="228" wangid="0,2,0,2,0,4,0,4"/>
+ <wangtile tileid="240" wangid="0,4,0,4,0,1,0,1"/>
+ <wangtile tileid="241" wangid="0,1,0,4,0,1,0,4"/>
+ <wangtile tileid="242" wangid="0,4,0,1,0,4,0,1"/>
+ <wangtile tileid="243" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="244" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="245" wangid="0,1,0,1,0,4,0,4"/>
+ <wangtile tileid="246" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="247" wangid="0,4,0,4,0,2,0,2"/>
+ <wangtile tileid="248" wangid="0,2,0,4,0,2,0,4"/>
+ <wangtile tileid="249" wangid="0,4,0,2,0,4,0,2"/>
+ <wangtile tileid="250" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="251" wangid="0,4,0,4,0,4,0,4"/>
+ <wangtile tileid="252" wangid="0,2,0,2,0,4,0,4"/>
+ <wangtile tileid="264" wangid="0,4,0,1,0,1,0,1"/>
+ <wangtile tileid="265" wangid="0,4,0,1,0,1,0,4"/>
+ <wangtile tileid="266" wangid="0,4,0,1,0,1,0,4"/>
+ <wangtile tileid="267" wangid="0,4,0,1,0,1,0,4"/>
+ <wangtile tileid="268" wangid="0,4,0,1,0,1,0,4"/>
+ <wangtile tileid="269" wangid="0,1,0,1,0,1,0,4"/>
+ <wangtile tileid="270" wangid="0,1,0,1,0,1,0,1"/>
+ <wangtile tileid="271" wangid="0,4,0,2,0,2,0,2"/>
+ <wangtile tileid="272" wangid="0,4,0,2,0,2,0,4"/>
+ <wangtile tileid="273" wangid="0,4,0,2,0,2,0,4"/>
+ <wangtile tileid="274" wangid="0,4,0,2,0,2,0,4"/>
+ <wangtile tileid="275" wangid="0,4,0,2,0,2,0,4"/>
+ <wangtile tileid="276" wangid="0,2,0,2,0,2,0,4"/>
+ </wangset>
+ </wangsets>
+ </tileset>
+ <layer id="1" name="Ground" width="45" height="31">
+ <data encoding="base64" compression="zlib">
+ eJyNWE1vVVUU3Y0KQeXL4kBL7QAiEkcopQOIkjgysXagYeLIpE0HGucEtY5U6giw1Bj8AdiWxhZ+ANLS4nv+AJKW1+TVH9DklWfSR+LeeWt51j3eWxmsnPvuPR9rr7P3Pvu8hpkd7DFb8dYb24Pf89bFtOOio8/xquNreZ/jdccxx0nH53j+SN7F81nHOfz+BGs1vP0C706i/1kZ+6asMWRdrvMY+4q3bzmedTwj/FfAO/i2HVcc10s4f+t4QzidcEw6vnd8lz0HfrAu3wOO8xj3seO44AT6cY0GONPWTx1jjp8cvzjO4Fsbfan/luP3XXgrJ+4XtWnjeQX9VzBmErgsdud8lXdwCb94G5w3HE+g+R5ZcwDPDx114U3dY569wkW5UZ8J8I6+AfalPbT7MvhS03nMMV3CNzT+A5zHMt70obvezjrWwfue47HwynUhH3JivwG01E1Be0cs8eW3mOd9x2lwXHVsOx7AP8bgI/PCZ5+PmwHvHceSaK76UZO2cGyg1X2mT/eKrtOwUX2Le/RcicbB4zfHyz6239sPs3VijtB6E33XRPPr0CbXmpwaAvrEPPyBvsDvOn4IbQ+4jkHnDaxfE52POl6zFIe0n1oH12Vw37Hq2HzH8W5o6DgE9FrRn+l7uk8rVvSZi6LvDdF4GaBPU2edS32kDjub1vWrMt6Mq8gJkc/OwQbypq9T54jrKcfVkrl+Fq5ctwn9/hTOZefIgPC+7VhEW9tFb+bwyL2Rw3le5DHGeVuY6xrma0DPJtpYL+Ip/JT+TM7uT9/k649jji3MEWMO+5gF2Py4hLOel8y/A1bMKdRbeW8K99BkzlIOmMVe37GuL2u+y/PYCNbbAkfGwCo0vyX9cq0nwbcsXnP/e97xAjADzutoQ6def3+kJ2lMnCmZL/wl/C7y87bsTXDuOB5Bt//jpbgiflBlQwe6am4bE40Dw6J1PscW9inmiJhlvvzVcaAn7fnT8JyC/ZG77u/SX3Nx8CPnQNRxl6xY05XZPYN5HoBv+F+VL49kccF9on9GG757q2J84KXMD0bBrw/+EHt7yro5umqOh7IW1330FHtNvkvQdg72co8GKtajnn2ib+QJ1p7T2XMgzlDPI//mv+C8Db5NWVO/MeangB/Bt4Y9CnuXs7FVIEfWofy9d5cxPF8mRKtNaDQLvxiy5O/xvgMteQ5si7Y1PLdkf8owjvW+hIan7L85gnXJRLd/wQ+ZD+jPjOU1K9ao1JLfeWatgfdtvGcNsBtnzjcu+/+VdWMubNA6i3lNx9MWahl7qvUHa1RqS79pWjord9C/hedFjLsKaByQ72KJLax1437GmqZX+OV2Mz+FP9y0dI52wKuFd3y/CH3Zh1qz1f7x7n62X/USHm3ggqU7pdYyeZ57EedTxI3W1XXw25T1a+DFs4vn/Bz4d7BHm5bOOe4XvzdLeBBRO0YdwzszeYevjFvymYg1xiv1qFvKtx1o17QUi1EXMHYOgfsR8G9Z8hXWiZyrjvFVnFl/kfOxjDdrmeAZeeuapTOce8x6gHquAVEv6jnL51VozH6shdbAn3VnrBvxdtCS7/LdeUv/NUQNxntlG7ypK/dxHWuw/tbzlTVIrMlaKu4Zeu4egm30I+a/WbTL+KaaHoeWh8GX+sZ/I1HnDlixFr9nqY5dtFQztjK+vMurbsH7hqU7J/X+GxyXMGcNWJI9oy9csOJ/PKEr/0cJe96Dvjdl/3g/2ZZ1uH9/Wbe2GnR8AC7Rb8dSPOV2jaIfc7ae6ew7akX/nQRP+kC8j/OO98vgvA95Yj/q2v2SK7Sm5fx5rC2gT/R/YsXacRT7EeMXLMVdcNa4rYrByMd6B676j44+3QFn1U7jTLkzz6nGw/I93m9Yyot5HcdzhPkrELkrYjD8mnGZc2a9pnUO+Q5mPEO/fivG21Grtktty+8eqjM58b873tk+s25c6t0+cNdS/cAYv1Oxfhn6pR20oh+dzvoOZ/b+A6OnAUo=
+ </data>
+ </layer>
+ <layer id="2" name="Fringe" width="45" height="31">
+ <data encoding="base64" compression="zlib">
+ eJzVl9lNw0AURZ8ltgr4YquAjliaYPl8DdAChCVABRB2KkBhpwK2sKQC4FgiShQ8tseMx/aVjmRLY+fO3JnnFxGRGZiVamkBFos2EaOBQGQw6N6PFmcltcbwOx50vU+neKYztsb1OmzAZq4uo9XxbjO2wfUBHMJRjt5c6RyacAlXcF2oGzu9wCu0YCohpwcPftJqFdZ+r9uGMf1nvWjtwX7P/UiEN5vzUiZRW5Qao9QarUHRftKI2qLUGKXWaCOjZ9/zprYoNUapNdrM+Hsu5m0jaotSY5Rao62M73Ax70d4gme4yOgjSb01tH/eu/947xd8izvfS7Ds6F2+VZP8e5oVx+8rY0/D90dN385QPnuapN7DZnxvT1O2HiCNqtYD2GaXt3aot9tQh62K9CJn+DyFEziuiOd7fN7BLdyUxDN5C7kL+Yf74I8+8fkB7/AGQ+zdYU/7t21YI/IWchfyD/dBoibwO1nwmSNvIXch/3AfxCopE18ibyF3If9wH8TKNhOfMq2nTSZ5yXSeTOvZn0nU83Mw78Bb1P/tUKbzlHY9k87jD20Li3Y=
+ </data>
+ </layer>
+ <objectgroup id="3" name="Objects">
+ <object id="1" name="maggots" type="location" x="435" y="74" width="155" height="99">
+ <properties>
+ <property name="spawncount" type="int" value="5"/>
+ <property name="spawntype" value="maggot"/>
+ </properties>
+ </object>
+ <object id="2" name="discover chest" type="trigger" x="201" y="200" width="127" height="127">
+ <properties>
+ <property name="script" value="chest-discovered.lua"/>
+ </properties>
+ <ellipse/>
+ </object>
+ <object id="3" name="unreachable" type="Fixture" x="2" y="158">
+ <properties>
+ <property name="friction" type="float" value="1"/>
+ <property name="static" type="bool" value="true"/>
+ </properties>
+ <polygon points="0,0 55,-23 96,-117 110,-61 104,-42 119,-33 116,6 104,9 100,36 60,43 53,58 43,58 34,74 21,69 18,90 0,89"/>
+ </object>
+ <object id="5" name="guard" type="NPC" x="22" y="361">
+ <polyline points="-3,120 87,91 154,96 181,16 273,-1"/>
+ </object>
+ <object id="6" name="guard" type="NPC" x="277" y="18">
+ <polyline points="0,0 75,78 133,82 176,179 274,183"/>
+ </object>
+ <object id="10" gid="282" x="413.333" y="225.333" width="16" height="16"/>
+ <object id="11" gid="282" x="421.667" y="218" width="16" height="16"/>
+ <object id="12" gid="2147483930" x="423" y="235.333" width="16" height="16"/>
+ <object id="13" gid="282" x="5" y="70" width="16" height="16"/>
+ <object id="14" gid="282" x="-3.66667" y="80.3333" width="16" height="16"/>
+ <object id="16" gid="283" x="538" y="418.333" width="16" height="16"/>
+ <object id="17" gid="283" x="407.667" y="462" width="16" height="16"/>
+ <object id="18" gid="283" x="417" y="473.667" width="16" height="16"/>
+ <object id="19" gid="283" x="402.667" y="469" width="16" height="16"/>
+ <object id="21" gid="2147483930" x="683.333" y="260.5" width="16" height="16"/>
+ <object id="22" gid="282" x="692.167" y="269.167" width="16" height="16"/>
+ <object id="23" gid="282" x="701.667" y="247.833" width="16" height="16"/>
+ <object id="24" gid="282" x="688.5" y="242" width="16" height="16"/>
+ <object id="25" gid="282" x="670.5" y="263.5" width="16" height="16"/>
+ <object id="26" gid="282" x="680" y="284" width="16" height="16"/>
+ <object id="27" gid="282" x="643.833" y="283.667" width="16" height="16"/>
+ <object id="28" gid="282" x="63.4165" y="386" width="16" height="16"/>
+ <object id="29" gid="282" x="9.0835" y="356.167" width="16" height="16"/>
+ <object id="30" gid="282" x="11.9165" y="385" width="16" height="16"/>
+ <object id="31" gid="282" x="54.2495" y="378.5" width="16" height="16"/>
+ <object id="32" gid="2147483930" x="2.4165" y="364.5" width="16" height="16"/>
+ <object id="33" gid="2147483930" x="41.5835" y="382.833" width="16" height="16"/>
+ <object id="34" type="Sign" gid="257" x="670.667" y="87" width="16" height="16">
+ <properties>
+ <property name="text" value="East West"/>
+ </properties>
+ </object>
+ <object id="36" name="player-start" type="Location" x="192" y="160" width="16" height="16"/>
+ </objectgroup>
+</map>
diff --git a/testing_data/tiled_examples/perspective_walls.png b/testing_data/tiled_examples/perspective_walls.png
new file mode 100644
index 0000000..8b70713
--- /dev/null
+++ b/testing_data/tiled_examples/perspective_walls.png
Binary files differ
diff --git a/testing_data/tiled_examples/perspective_walls.tmx b/testing_data/tiled_examples/perspective_walls.tmx
new file mode 100644
index 0000000..858eea8
--- /dev/null
+++ b/testing_data/tiled_examples/perspective_walls.tmx
@@ -0,0 +1,19 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.0" orientation="orthogonal" width="32" height="32" tilewidth="31" tileheight="31">
+ <tileset firstgid="1" source="perspective_walls.tsx"/>
+ <layer name="Walls" width="32" height="32">
+ <data encoding="base64" compression="zlib">
+ eJztlOkKgCAQhLfb7vd/24SUBqMMNevHfDB4LczusihCCCHkTzRay4XaDP7rxf1882ZpzBqTp/Wo4c7ulRy96LUKRx3EFYF5+GpESpA9V845pT/Oxijn+luIw36k8vf1Rpk1xPepx9vczV+O3GL6n4JJ9vkSOf8/Qwb/r+vHP8ZVzFwTQshf2AA5owLB
+ </data>
+ </layer>
+ <layer name="Walls level 2" width="32" height="32">
+ <data encoding="base64" compression="zlib">
+ eJztzgEJAAAIA7CD/Tsb4yJbgiUA8MO0AwAAhy0rhAAE
+ </data>
+ </layer>
+ <layer name="Walls level 3" width="32" height="32">
+ <data encoding="base64" compression="zlib">
+ eJztzjENAAAIA7Al+PeMgz0cPK2CJgBwN98BAACqBS0QAAQ=
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/perspective_walls.tsx b/testing_data/tiled_examples/perspective_walls.tsx
new file mode 100644
index 0000000..98cdbec
--- /dev/null
+++ b/testing_data/tiled_examples/perspective_walls.tsx
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<tileset name="perspective_walls" tilewidth="64" tileheight="64">
+ <tileoffset x="-32" y="0"/>
+ <image source="perspective_walls.png"/>
+ <tile id="13">
+ <properties>
+ <property name="door" value="true"/>
+ </properties>
+ </tile>
+ <tile id="14">
+ <properties>
+ <property name="door" value="true"/>
+ </properties>
+ </tile>
+ <tile id="15">
+ <properties>
+ <property name="pickup" value="true"/>
+ </properties>
+ </tile>
+</tileset>
diff --git a/testing_data/tiled_examples/rpg/beach_tileset.png b/testing_data/tiled_examples/rpg/beach_tileset.png
new file mode 100644
index 0000000..c9f6d52
--- /dev/null
+++ b/testing_data/tiled_examples/rpg/beach_tileset.png
Binary files differ
diff --git a/testing_data/tiled_examples/rpg/beach_tileset.tsx b/testing_data/tiled_examples/rpg/beach_tileset.tsx
new file mode 100644
index 0000000..c280249
--- /dev/null
+++ b/testing_data/tiled_examples/rpg/beach_tileset.tsx
@@ -0,0 +1,20 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<tileset name="beach_tileset" tilewidth="16" tileheight="16" tilecount="936" columns="36">
+ <image source="beach_tileset.png" width="576" height="416"/>
+ <tile id="37">
+ <animation>
+ <frame tileid="37" duration="1000"/>
+ <frame tileid="46" duration="1000"/>
+ <frame tileid="55" duration="1000"/>
+ <frame tileid="64" duration="1000"/>
+ </animation>
+ </tile>
+ <tile id="148">
+ <animation>
+ <frame tileid="148" duration="1000"/>
+ <frame tileid="157" duration="1000"/>
+ <frame tileid="166" duration="1000"/>
+ <frame tileid="175" duration="1000"/>
+ </animation>
+ </tile>
+</tileset>
diff --git a/testing_data/tiled_examples/rpg/island.tmx b/testing_data/tiled_examples/rpg/island.tmx
new file mode 100644
index 0000000..2b0a012
--- /dev/null
+++ b/testing_data/tiled_examples/rpg/island.tmx
@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.0" tiledversion="1.0.3" orientation="orthogonal" renderorder="right-down" width="58" height="47" tilewidth="16" tileheight="16" infinite="0" nextobjectid="8">
+ <tileset firstgid="1" source="beach_tileset.tsx"/>
+ <layer name="Ground" width="58" height="47">
+ <data encoding="base64" compression="zlib">
+ eJztmH1u00AQxb3h+ySFcgtASJVqx7EvwAVKgfQclYA6cBc4R8g/fPYizKj75JfJrt1SpzHV/vHkxlsn+8vMvJlNk2VZk5SUlJSUlJR9N9r1frbBdyJybl2v5d7xCPY3hMD3XtSIaq+F6IOsfRzBHodgVL4p8THrbeD8JPosOqP41Ua3gVP1WPREtCK2peibu7j3v3HG/PNQlBOval/01N/bH8HeL6N5tu6jMf8Ebz6CPf8LY+Zan5mOOA9t3+7r4bzOXlqIKtGzSZZN3LhmgFDfjvVwm5/ObfYL6NSvg3eXMxBioft6IDEo5Tp32Su9QpyD6BGIna7npuczc0m8u5iB5oaR9/VOOGviRA7qc19EX0UH8nrm1/n53N+r/PrMfx9Y1+/g/AZrmOOiceQZ5a3nrIkjFNPKrxV0rYip8NyNYdbrSzd8LwnVA+KCPs3598ZwxnKX41TT83mgXiuvc2IsBuRjz0Dusfayiz698nubUSyaHs5QznLMeG3m339oRj4bYK+nEdaGWK2v9HHi/5GzBb3mmiy3xGj9pTasNpcPDetlOLEOvsJt5jLX7lC+E/PQWF8LebuyHhjWyj+j//tQro9c+xklcVjG0Ofqe/y4Jid/zxyL0GfG5jN9jyPzLPeX56IXk/Ze2fM5tkbBep2+CQ9d+RpR4ezDvsqslhP5ENo3c+eu9dATt9lL4UOVa733t+jPgPlrzz572bqvosfZHhbyl74YdQmMyOd7kgf3J8Nxdp19UH8hX+DZwTJy/+9bK308kVPSj3X20DlLZ8obm4OO3OaME6pv9sszYsJcGxL/RmBrBz36puc99RV4qPXRUF1af7NMS9fWSex3A7zeJiPnLjwJHso+GspH1NmUGC0TzwBcO/bekCxd5zyeCaZufR7P6e/CxAx1Z+eGZgv771PoHByaf2xcESuuSxszrrld/y7C9bdwm+fc0PwDVo3rT9GviF/YmtsVo4rPweyTi8jemVVz8o7U6N1JuO+M7bc6ywp1nW1tXi47/ndMQv7CV7DvrjPRmPLyKrrqvseWl0lJSUlJSdvQXyaqnVE=
+ </data>
+ </layer>
+ <layer name="Fringe" width="58" height="47">
+ <data encoding="base64" compression="zlib">
+ eJztmEtSwkAURUPYiA4sSh0o7sJCdCD+F4ETlY+fdajgdx2CshZ1HZ4UZKQpSk26qx/3VJ1JBvS7eV39OkSREEIIIYQImaXYdwVu2TCat0Ku25LfGhqsv4O7Bdcx9Jyzxfpt7Hiuo2h65OvjnfGcr+R7w5HxnO/k+8BP4zlTFnM465sBzIvtST+tz/JN8m0Zz5jHnrXOesY7snq3mytH0TweO8xXM/ouU+qx3/Ny2cHayewqcp0zfnsFV7GKaxlrhTSXFsq+K3DLCb05jce9bP2jT3vcQfbxAA/xyOMdM5kPWWdlm+cd7P4xa5dc53iBl3gV+F36mvpvfshwz7MHfMQnfPaYM2sW/Wa/vlD/IIBepd8b9YDOTPGdad+NLua/EAmVGdhrIfxPI4QQQoh8+QKR0iKM
+ </data>
+ </layer>
+ <layer name="Over" width="58" height="47">
+ <data encoding="base64" compression="zlib">
+ eJzt1bcNwlAURuFnU5KWAPYhzwGMQlqE3JJWINktaQVAHInGIDdIIOvB/0mnsEVxr56NjRERERERERERERvsHGM88p2oJ/ky1xiHXOpRnwZu1EN9XoadspSjFa1pY9GeNWatU+ONmS/89ko3C/ZsMmOL2tSh7svMU97DGc1pQUtL38she41oTJOQc9mz14GOdKKzpXtu2W1HHvkvexa5jlOCkpSitAXPaNDT9yHGf2gs6om+JPB9CMpzXXAfZ1my7OzCBL8PYcrcr1D1B3b9d7/wvIqIiIiIiIiEuQPCYiRe
+ </data>
+ </layer>
+ <objectgroup name="Objects">
+ <object id="1" name="Starting Point" type="start" x="794.667" y="471.667">
+ <point/>
+ </object>
+ <object id="5" name="Exit" type="exit" x="336" y="208" width="48" height="48"/>
+ <object id="7" name="Resting Spot" type="rest" x="528" y="416" width="48" height="16"/>
+ </objectgroup>
+</map>
diff --git a/testing_data/tiled_examples/rpg/readme.txt b/testing_data/tiled_examples/rpg/readme.txt
new file mode 100644
index 0000000..5ef42a7
--- /dev/null
+++ b/testing_data/tiled_examples/rpg/readme.txt
@@ -0,0 +1,28 @@
+-=-=-=- -==-=- -==-=- -==-=- -==-=-
+ TIME FANTASY - BEACH TILESET
+-==-=- -==-=- -==-=- -==-=- -==-=-
+
+Thank you for downloading this tileset!
+
+This tileset is a FREE release for anybody to download. I created this set as a reward for reaching a goal
+on my Patreon page. Thanks to my wonderful patrons for making this free release possible! patreon.com/finalbossblues
+
+This tileset is a mini-expansion for the Time Fantasy RPG assets. It's compatible with all other graphics that I release
+in my Time Fantasy style. Can also be used as a standalone tileset.
+
+This set includes versions formatted for use in RPGMaker VX/Ace and RPGMaker MV,
+as well as a regular tile-sheet based on a 16x16 grid.
+
+-------------------------
+Time Fantasy Website
+ timefantasy.net
+-------------------------
+Artist's Website
+ finalbossblues.com
+Twitter
+ @finalbossblues
+Facebook
+ finalbossblues
+Patreon
+ patreon.com/finalbossblues
+-------------------------
diff --git a/testing_data/tiled_examples/sewer_automap/rule_001.tmx b/testing_data/tiled_examples/sewer_automap/rule_001.tmx
new file mode 100644
index 0000000..e05c002
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_automap/rule_001.tmx
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd">
+<map version="1.0" orientation="orthogonal" width="7" height="3" tilewidth="24" tileheight="24">
+ <properties>
+ <property name="AutomappingRadius" value="3"/>
+ <property name="DeleteTiles" value="yes"/>
+ </properties>
+ <tileset firstgid="1" name="sewer_tileset" tilewidth="24" tileheight="24">
+ <image source="../sewer_tileset.png" trans="ff00ff" width="192" height="217"/>
+ </tileset>
+ <tileset firstgid="73" name="rules_sewers" tilewidth="24" tileheight="24">
+ <image source="rules_sewers.png" width="72" height="48"/>
+ </tileset>
+ <layer name="Regions" width="7" height="3">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAPPHHQ+AAAJfgA3A==
+ </data>
+ </layer>
+ <layer name="Input_set" width="7" height="3">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAPPKG0F5T2JqAeBAAmbADf
+ </data>
+ </layer>
+ <layer name="Output_Ground" width="7" height="3">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAPeKG0DJRWIqAeBAAMkABM
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/sewer_automap/rule_002.tmx b/testing_data/tiled_examples/sewer_automap/rule_002.tmx
new file mode 100644
index 0000000..82203c5
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_automap/rule_002.tmx
@@ -0,0 +1,24 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.0" orientation="orthogonal" width="8" height="5" tilewidth="24" tileheight="24">
+ <tileset firstgid="1" name="sewer_tileset" tilewidth="24" tileheight="24">
+ <image source="../sewer_tileset.png" trans="ff00ff" width="192" height="217"/>
+ </tileset>
+ <tileset firstgid="73" name="rules_sewers" tilewidth="24" tileheight="24">
+ <image source="rules_sewers.png" width="72" height="48"/>
+ </tileset>
+ <layer name="Regions" width="8" height="5">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAMfLDQPnjkiTGPWLUA1AACYQ==
+ </data>
+ </layer>
+ <layer name="Input_set" width="8" height="5">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAMvKG0FxLfC0neC00dIeBFgloAz9QCVQ==
+ </data>
+ </layer>
+ <layer name="Output_Ground" width="8" height="5" visible="0">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAMtND4yjjUSRFhFgwoEqkOADFsAIk=
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/sewer_automap/rule_003.tmx b/testing_data/tiled_examples/sewer_automap/rule_003.tmx
new file mode 100644
index 0000000..a8edb5d
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_automap/rule_003.tmx
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd">
+<map version="1.0" orientation="orthogonal" width="8" height="6" tilewidth="24" tileheight="24">
+ <tileset firstgid="1" name="sewer_tileset" tilewidth="24" tileheight="24">
+ <image source="../sewer_tileset.png" trans="ff00ff" width="192" height="217"/>
+ </tileset>
+ <tileset firstgid="73" name="rules_sewers" tilewidth="24" tileheight="24">
+ <image source="rules_sewers.png" width="72" height="48"/>
+ </tileset>
+ <layer name="Regions" width="8" height="6">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAMfLDQPnjkydVPDgAAZj8DRQ==
+ </data>
+ </layer>
+ <layer name="Input_set" width="8" height="6">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAMPAmIYZPHphadpgYAAL88Abc=
+ </data>
+ </layer>
+ <layer name="Output_Ground" width="8" height="6">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAMmLCI8SCxuQjoF0Lj8xFhJ7EAABfQADk=
+ </data>
+ </layer>
+ <layer name="Output_Over" width="8" height="6">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAesBKQ5yXBLGoBAAmIABM=
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/sewer_automap/rule_004.tmx b/testing_data/tiled_examples/sewer_automap/rule_004.tmx
new file mode 100644
index 0000000..09c97a7
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_automap/rule_004.tmx
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.0" orientation="orthogonal" width="7" height="6" tilewidth="24" tileheight="24">
+ <tileset firstgid="1" name="sewer_tileset" tilewidth="24" tileheight="24">
+ <image source="../sewer_tileset.png" trans="ff00ff" width="192" height="217"/>
+ </tileset>
+ <tileset firstgid="73" name="rules_sewers" tilewidth="24" tileheight="24">
+ <image source="rules_sewers.png" width="72" height="48"/>
+ </tileset>
+ <layer name="Regions" width="7" height="6">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAPfKAYnU0rOVwAAJk3BME=
+ </data>
+ </layer>
+ <layer name="Input_set" width="7" height="6">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAPPKEYnU2pHLodhAAAb/8D/w==
+ </data>
+ </layer>
+ <layer name="Output_Ground" width="7" height="6">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAPePHI8aHxeYiUIwcAABkoAEI=
+ </data>
+ </layer>
+ <layer name="Output_Over" width="7" height="6">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAPOND47ATU0woAAAgwABA=
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/sewer_automap/rule_005.tmx b/testing_data/tiled_examples/sewer_automap/rule_005.tmx
new file mode 100644
index 0000000..57a49d0
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_automap/rule_005.tmx
@@ -0,0 +1,29 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.0" orientation="orthogonal" width="13" height="6" tilewidth="24" tileheight="24">
+ <tileset firstgid="1" name="sewer_tileset" tilewidth="24" tileheight="24">
+ <image source="../sewer_tileset.png" trans="ff00ff" width="192" height="217"/>
+ </tileset>
+ <tileset firstgid="73" name="rules_sewers" tilewidth="24" tileheight="24">
+ <image source="rules_sewers.png" width="72" height="48"/>
+ </tileset>
+ <layer name="Regions" width="13" height="6">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAP+BDgk6LHBwcbnxy19ZAKAMzFByE=
+ </data>
+ </layer>
+ <layer name="Input_set" width="13" height="6">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAPeBLgD6QeYsyj1BwAd2cCSQ==
+ </data>
+ </layer>
+ <layer name="Output_Ground" width="13" height="6" visible="0">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAPiKHxRYjQw43G5yRCjzAaX5AIPfQAAE2oAGM=
+ </data>
+ </layer>
+ <layer name="Output_Over" width="13" height="6" visible="0">
+ <data encoding="base64" compression="zlib">
+ eJxjYBgcgAVKs5GghwdK81HZLcQAABQQACU=
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/sewer_automap/rule_006.tmx b/testing_data/tiled_examples/sewer_automap/rule_006.tmx
new file mode 100644
index 0000000..9a155d0
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_automap/rule_006.tmx
@@ -0,0 +1,39 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.0" orientation="orthogonal" width="7" height="5" tilewidth="24" tileheight="24">
+ <tileset firstgid="1" name="sewer_tileset" tilewidth="24" tileheight="24">
+ <image source="../sewer_tileset.png" trans="ff00ff" width="192" height="217"/>
+ </tileset>
+ <tileset firstgid="73" name="rules_sewers" tilewidth="24" tileheight="24">
+ <image source="rules_sewers.png" width="72" height="48"/>
+ </tileset>
+ <layer name="Regions" width="7" height="5">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAPfKAYnU2JHC4AAAEbA5E=
+ </data>
+ </layer>
+ <layer name="Input_set" width="7" height="5">
+ <data encoding="base64" compression="zlib">
+ eJxjYKAMeKLRyOKeWNj4AABbzAG3
+ </data>
+ </layer>
+ <layer name="InputNot_set" width="7" height="5" opacity="0.44">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAfeBLgkwoAKZwAkw==
+ </data>
+ </layer>
+ <layer name="Output_Ground" width="7" height="5" visible="0">
+ <data encoding="base64" compression="zlib">
+ eJxjYKAM8KLRlAAAB9wAGw==
+ </data>
+ </layer>
+ <layer name="Output_Over" width="7" height="5" visible="0">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAMeNFoWgEACrQAGw==
+ </data>
+ </layer>
+ <layer name="Output_Over2" width="7" height="5" visible="0">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAM5KG0AhFqKQEAGSQAQA==
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/sewer_automap/rule_007.tmx b/testing_data/tiled_examples/sewer_automap/rule_007.tmx
new file mode 100644
index 0000000..757e7c1
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_automap/rule_007.tmx
@@ -0,0 +1,34 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.0" orientation="orthogonal" width="7" height="7" tilewidth="24" tileheight="24">
+ <tileset firstgid="1" name="sewer_tileset" tilewidth="24" tileheight="24">
+ <image source="../sewer_tileset.png" trans="ff00ff" width="192" height="217"/>
+ </tileset>
+ <tileset firstgid="73" name="rules_sewers" tilewidth="24" tileheight="24">
+ <image source="rules_sewers.png" width="72" height="48"/>
+ </tileset>
+ <layer name="Regions" width="7" height="7">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAPfKAYnU1Ijp5mAgDb0wTB
+ </data>
+ </layer>
+ <layer name="Input_set" width="7" height="7">
+ <data encoding="base64" compression="zlib">
+ eJxjYKAMeKPRtNaHDQAAdfQBLQ==
+ </data>
+ </layer>
+ <layer name="InputNot_set" width="7" height="7">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAPvKEYnc2AxsbGx2cmLj4++3ABAGBjA4U=
+ </data>
+ </layer>
+ <layer name="InputNot_set" width="7" height="7" visible="0">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAMPNFodHFcfELmEeITax4A5OQCSQ==
+ </data>
+ </layer>
+ <layer name="Output_Ground" width="7" height="7" visible="0">
+ <data encoding="base64" compression="zlib">
+ eJxjYKAMSEJpaRL1aUJpbQrtBwEAMlQAiQ==
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/sewer_automap/rule_008.tmx b/testing_data/tiled_examples/sewer_automap/rule_008.tmx
new file mode 100644
index 0000000..7166d83
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_automap/rule_008.tmx
@@ -0,0 +1,35 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd">
+<map version="1.0" orientation="orthogonal" width="4" height="4" tilewidth="24" tileheight="24">
+ <properties>
+ <property name="NoOverlappingRules" value="1"/>
+ </properties>
+ <tileset firstgid="1" name="sewer_tileset" tilewidth="24" tileheight="24">
+ <image source="../sewer_tileset.png" trans="ff00ff" width="192" height="217"/>
+ </tileset>
+ <tileset firstgid="73" name="rules_sewers" tilewidth="24" tileheight="24">
+ <image source="rules_sewers.png" width="72" height="48"/>
+ </tileset>
+ <layer name="regions_input" width="4" height="4">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAMfKAYGwAAD7AAmQ==
+ </data>
+ </layer>
+ <layer name="regions_output" width="4" height="4">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAEPljEcAEADVAATQ==
+ </data>
+ </layer>
+ <layer name="input_Over" width="4" height="4">
+ <data encoding="base64" compression="zlib">
+ eJxjYCAMWICYF4ccAAHoABI=
+ </data>
+ </layer>
+ <objectgroup name="output_GroundEffects" width="4" height="4">
+ <object name="1" type="Effect" x="24" y="24" width="24" height="24">
+ <properties>
+ <property name="predefined Value" value=""/>
+ </properties>
+ </object>
+ </objectgroup>
+</map>
diff --git a/testing_data/tiled_examples/sewer_automap/rule_009.tmx b/testing_data/tiled_examples/sewer_automap/rule_009.tmx
new file mode 100644
index 0000000..ae8c0ab
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_automap/rule_009.tmx
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd">
+<map version="1.0" orientation="orthogonal" width="4" height="3" tilewidth="24" tileheight="24">
+ <properties>
+ <property name="NoOverlappingRules" value="1"/>
+ </properties>
+ <tileset firstgid="1" name="sewer_tileset" tilewidth="24" tileheight="24">
+ <image source="../sewer_tileset.png" trans="ff00ff" width="192" height="217"/>
+ </tileset>
+ <tileset firstgid="73" name="rules_sewers" tilewidth="24" tileheight="24">
+ <image source="rules_sewers.png" width="72" height="48"/>
+ </tileset>
+ <layer name="regions" width="4" height="3">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAEPlCMDQAAD6AAmQ==
+ </data>
+ </layer>
+ <layer name="input_Ground" width="4" height="3">
+ <data encoding="base64" compression="zlib">
+ eJxjYMAESkCshUUcBAAH2ABN
+ </data>
+ </layer>
+ <objectgroup name="output_GroundEffects" width="4" height="3">
+ <object name="2" type="Trigger" x="48" y="24" width="24" height="24">
+ <properties>
+ <property name="triggering" value="trigger42"/>
+ </properties>
+ </object>
+ </objectgroup>
+</map>
diff --git a/testing_data/tiled_examples/sewer_automap/rules.txt b/testing_data/tiled_examples/sewer_automap/rules.txt
new file mode 100644
index 0000000..8d93775
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_automap/rules.txt
@@ -0,0 +1,142 @@
+# rules.txt
+# Copyright 2011, Stefan Beller <stefanbeller@googlemail.com>
+#
+# This file is part of the sewers example for automapping for Tiled.
+#
+# This program is free software; you can redistribute it and/or modify it
+# under the terms of the GNU General Public License as published by the Free
+# Software Foundation; either version 2 of the License, or (at your option)
+# any later version.
+#
+# This program is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# this program. If not, see <http://www.gnu.org/licenses/>.
+
+
+# lines starting with # or // are comments
+# all other lines will be parsed and treated as filenames.
+
+# Feel free to comment out certain rules, to see if and how they are working.
+# So have fun experimenting with this bunch of rules :)
+
+# First apply only one tile rules to fill the regions
+#
+# We mark the place, where rules are defined, with the RuleRegion layer.
+# So whereever there are tiles at the ruleRegion layer, it will be used as a rule.
+# In the RuleSet layer we can define, which combination of tiles must occur
+# to trigger the specific rule.
+# The layers Rule_Ground, Rule_Over and Rule_Over2 define the output of the rules.
+#
+# Which tiles should I use in the regions layer?
+# Actually there can be any tiles, but it should be the same tiles for one rule.
+# So use whatever you want, maybe a colorful tile so you can see easily that these
+# tiles are used for defining the rule region.
+#
+# In the very first rulefile used for Automapping it might be useful to define
+# some map properties:
+# "DeleteTiles" = "true", "false" - This property determines if all tiles in the
+# whole region where Automapping takes place
+# are deleted.
+# That is useful, when not all layers are covered
+# at all places. (Check the Over and Over2 layer!)
+# "AutoMappingRadius" = 0,1,2... - This property determines which regions are
+# automatically remapped at live Automapping.
+# When you draw directly into the map,
+# not the whole map is remapped, but only a little
+# place around. Here you can specify how many
+# tiles at least should be remapped.
+
+./rule_001.tmx
+
+
+
+
+# Setup the right transition tiles at the border of light blue stone tiles
+#
+# Basically it is the same as the first rule, we are just using bigger rules.
+# Whenever there is a light blue tile beside a grey tile, one of these rules
+# will apply.
+
+./rule_002.tmx
+
+
+
+
+# Now put straight walls
+#
+# Note: Compare the regions and the set layer!
+# Not at all places where a rule is defined, there is a tile in the input_set layer.
+# This means that there can be any tiles except those used by the rule.
+# So there are no black tiles allowed, when there are no tiles in the input_set
+# layer.
+
+./rule_003.tmx
+
+
+
+
+# Now we add inner corners for walls
+#
+# (No new features introduced)
+
+./rule_004.tmx
+
+
+
+
+# Now we add the corners for walls
+#
+# (No new features introduced)
+
+./rule_005.tmx
+
+
+
+
+# Correct the error we got in the two previous rulefiles (overwrite it once more)
+#
+# Here we can see the use of input_set and input_NotSet
+# With the input_NotSet we can define which tiles must not be used at certain places
+# Important sideeffect: the empty regions in ruleSet can be anything now, including
+# black tiles as used here!
+#
+# So when you use both input_Set and input_NotSet, you need to specify exactly what
+# is allowed at which places.
+
+./rule_006.tmx
+
+
+
+
+# Setup the corner stones for light blue stone tiles
+#
+# Hey, there are multiple layers called input_NotSet!
+# Yes, when you need to specify multiple allowed or disallowed tiles per
+# position, you can use multiple layers of input_Set and input_NotSet
+
+./rule_007.tmx
+
+
+
+
+
+# Setup objects now
+# The objects '1' will be placed. They will be placed based on the
+# Over layer, which was created by previous rules.
+# The placement of objects is done in south-east corners.
+
+./rule_008.tmx
+
+
+
+
+# Setup another object.
+# This object is based on input from the Ground layer.
+# It will put objects to borderstones which are near an end of that borderline.
+#
+
+./rule_009.tmx
diff --git a/testing_data/tiled_examples/sewer_automap/rules_sewers.png b/testing_data/tiled_examples/sewer_automap/rules_sewers.png
new file mode 100644
index 0000000..7214e28
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_automap/rules_sewers.png
Binary files differ
diff --git a/testing_data/tiled_examples/sewer_automap/sewers.tmx b/testing_data/tiled_examples/sewer_automap/sewers.tmx
new file mode 100644
index 0000000..4af5a15
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_automap/sewers.tmx
@@ -0,0 +1,15 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!DOCTYPE map SYSTEM "http://mapeditor.org/dtd/1.0/map.dtd">
+<map version="1.0" orientation="orthogonal" width="31" height="31" tilewidth="24" tileheight="24">
+ <tileset firstgid="1" name="rules_sewers" tilewidth="24" tileheight="24">
+ <image source="rules_sewers.png" width="72" height="48"/>
+ </tileset>
+ <tileset firstgid="7" name="sewer_tileset" tilewidth="24" tileheight="24">
+ <image source="../sewer_tileset.png" trans="ff00ff" width="192" height="217"/>
+ </tileset>
+ <layer name="set" width="31" height="31">
+ <data encoding="base64" compression="zlib">
+ eJztlUEOwCAIBLH+/8/eDSBQ1jTNHuZiDKOGxSEigxDyCWYRtPsx6HBH74hyn2r9zT2T7uj+jPemW+sfrRai16K1ut1ebtEZ8+aFdxaU27qj5a7O1FOfRd1v86XlZc+T9RZVt3aG6FrX/0UIIVkWa5oFDA==
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/sewer_tileset.png b/testing_data/tiled_examples/sewer_tileset.png
new file mode 100644
index 0000000..9455c8e
--- /dev/null
+++ b/testing_data/tiled_examples/sewer_tileset.png
Binary files differ
diff --git a/testing_data/tiled_examples/sewers.tmx b/testing_data/tiled_examples/sewers.tmx
new file mode 100644
index 0000000..320d65d
--- /dev/null
+++ b/testing_data/tiled_examples/sewers.tmx
@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.0" orientation="orthogonal" width="50" height="50" tilewidth="24" tileheight="24">
+ <tileset firstgid="1" name="sewer_tileset" tilewidth="24" tileheight="24">
+ <image source="sewer_tileset.png" trans="ff00ff" width="192" height="217"/>
+ </tileset>
+ <layer name="Bottom" width="50" height="50">
+ <data encoding="base64" compression="zlib">
+ eJzt19kKwjAQBdDim0sFqwguL3Vf/sP//ySnkIFhSGrSdEnxPhyQxqJ32kySPMuyJTkZC5KLa2dyNEo1Lsds3wkl/4f+7V/0/f+Y40Je5GpUn2+J5NiQCdmO/HlMyYzMI3JwLUJx7drIsSIFWUfk4FrY3GvGuHb8vr4jcmhNcnAtpIflmmar3VA5nqaWMUKeQ1d9dyht59iRPTmMPEdpua8Put/Frh88P5q84zFkv/NZP2TOlOaH7Hc+64fMmdL8cPVbV9+tcn5MzpTmR0gv12uDbQ4MNT8AIA73Uq3v3hqLe2ldTx4D21k1tf2ubw59Vk1tX+KbQ59VXfuSlMn9SJHV70tS5jqrYu8BAAAAAAAAAABd+wIHfQq1
+ </data>
+ </layer>
+ <layer name="Top" width="50" height="50" opacity="0.49">
+ <data encoding="base64" compression="zlib">
+ eJzt1jsKgDAQQEELtVKvYuGvEDvvfya3MBeQQAzMwCPdsum2af5lL71AJv7xL7X+Y46WtzXayq7z2RGd0f2+V6a5bdRFfaZ5pQzRGE2lFwEAoArpDk7Veg+nOzjlHgYAAAAAIIcHvboDlQ==
+ </data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/sticker-knight/README.md b/testing_data/tiled_examples/sticker-knight/README.md
new file mode 100644
index 0000000..053bed6
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/README.md
@@ -0,0 +1,8 @@
+Sticker Knight platformer example
+---------------------------------
+
+This example is by @ponywolf and released to the public domain. You can
+find it at http://opengameart.org/content/sticker-knight-platformer.
+
+It's a great example of using the flexible image collection tilesets with
+tiles on object layers, for both the map and the UI.
diff --git a/testing_data/tiled_examples/sticker-knight/map/alter.png b/testing_data/tiled_examples/sticker-knight/map/alter.png
new file mode 100644
index 0000000..1571c54
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/alter.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/backgroundArch.png b/testing_data/tiled_examples/sticker-knight/map/backgroundArch.png
new file mode 100644
index 0000000..84ba79d
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/backgroundArch.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/backgroundMountain.png b/testing_data/tiled_examples/sticker-knight/map/backgroundMountain.png
new file mode 100644
index 0000000..3596080
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/backgroundMountain.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/backgroundTower.png b/testing_data/tiled_examples/sticker-knight/map/backgroundTower.png
new file mode 100644
index 0000000..d602bb2
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/backgroundTower.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/backgroundTree.png b/testing_data/tiled_examples/sticker-knight/map/backgroundTree.png
new file mode 100644
index 0000000..ccee0f4
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/backgroundTree.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/blobBlue.png b/testing_data/tiled_examples/sticker-knight/map/blobBlue.png
new file mode 100644
index 0000000..6ed4873
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/blobBlue.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/blobGreen.png b/testing_data/tiled_examples/sticker-knight/map/blobGreen.png
new file mode 100644
index 0000000..465c93f
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/blobGreen.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/blue.png b/testing_data/tiled_examples/sticker-knight/map/blue.png
new file mode 100644
index 0000000..3f8a906
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/blue.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/bombStroked.png b/testing_data/tiled_examples/sticker-knight/map/bombStroked.png
new file mode 100644
index 0000000..2db2a2a
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/bombStroked.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/castleWall.png b/testing_data/tiled_examples/sticker-knight/map/castleWall.png
new file mode 100644
index 0000000..b270467
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/castleWall.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/cloud.png b/testing_data/tiled_examples/sticker-knight/map/cloud.png
new file mode 100644
index 0000000..f51cdce
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/cloud.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/column1.png b/testing_data/tiled_examples/sticker-knight/map/column1.png
new file mode 100644
index 0000000..292d20d
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/column1.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/column2.png b/testing_data/tiled_examples/sticker-knight/map/column2.png
new file mode 100644
index 0000000..0169d95
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/column2.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/doorBlueStroked.png b/testing_data/tiled_examples/sticker-knight/map/doorBlueStroked.png
new file mode 100644
index 0000000..b205260
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/doorBlueStroked.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/doorGreenStroke.png b/testing_data/tiled_examples/sticker-knight/map/doorGreenStroke.png
new file mode 100644
index 0000000..3d565db
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/doorGreenStroke.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/doorRedStroked.png b/testing_data/tiled_examples/sticker-knight/map/doorRedStroked.png
new file mode 100644
index 0000000..dfeb1b7
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/doorRedStroked.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/doorStroked.png b/testing_data/tiled_examples/sticker-knight/map/doorStroked.png
new file mode 100644
index 0000000..4891c39
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/doorStroked.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/earthWall.png b/testing_data/tiled_examples/sticker-knight/map/earthWall.png
new file mode 100644
index 0000000..1729a1b
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/earthWall.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/earthWall2.png b/testing_data/tiled_examples/sticker-knight/map/earthWall2.png
new file mode 100644
index 0000000..ed08586
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/earthWall2.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/exit.png b/testing_data/tiled_examples/sticker-knight/map/exit.png
new file mode 100644
index 0000000..4a3a5b7
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/exit.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/flare.png b/testing_data/tiled_examples/sticker-knight/map/flare.png
new file mode 100644
index 0000000..52f29e1
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/flare.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/gemBlueStroked.png b/testing_data/tiled_examples/sticker-knight/map/gemBlueStroked.png
new file mode 100644
index 0000000..ba99cef
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/gemBlueStroked.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/gemRedStroked.png b/testing_data/tiled_examples/sticker-knight/map/gemRedStroked.png
new file mode 100644
index 0000000..e223514
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/gemRedStroked.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/grassLarge.png b/testing_data/tiled_examples/sticker-knight/map/grassLarge.png
new file mode 100644
index 0000000..93dfcd3
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/grassLarge.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/grassSmall.png b/testing_data/tiled_examples/sticker-knight/map/grassSmall.png
new file mode 100644
index 0000000..0fe8a00
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/grassSmall.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/grey.png b/testing_data/tiled_examples/sticker-knight/map/grey.png
new file mode 100644
index 0000000..5a948f1
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/grey.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/hero.png b/testing_data/tiled_examples/sticker-knight/map/hero.png
new file mode 100644
index 0000000..1957fb8
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/hero.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/keyGreenStroked.png b/testing_data/tiled_examples/sticker-knight/map/keyGreenStroked.png
new file mode 100644
index 0000000..7ed454b
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/keyGreenStroked.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/keyRedStroked.png b/testing_data/tiled_examples/sticker-knight/map/keyRedStroked.png
new file mode 100644
index 0000000..1407a37
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/keyRedStroked.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/keyYellowStroked.png b/testing_data/tiled_examples/sticker-knight/map/keyYellowStroked.png
new file mode 100644
index 0000000..78aeeed
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/keyYellowStroked.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/objs.tsx b/testing_data/tiled_examples/sticker-knight/map/objs.tsx
new file mode 100644
index 0000000..7dfc66c
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/objs.tsx
@@ -0,0 +1,189 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<tileset version="1.4" tiledversion="1.4.1" name="objs" tilewidth="384" tileheight="332" tilecount="62" columns="0">
+ <tile id="0">
+ <image width="160" height="192" source="alter.png"/>
+ </tile>
+ <tile id="1">
+ <image width="96" height="64" source="blobBlue.png"/>
+ </tile>
+ <tile id="2">
+ <image width="96" height="64" source="blobGreen.png"/>
+ </tile>
+ <tile id="3">
+ <image width="64" height="64" source="blue.png"/>
+ </tile>
+ <tile id="4">
+ <image width="96" height="128" source="bombStroked.png"/>
+ </tile>
+ <tile id="5">
+ <image width="64" height="64" source="castleWall.png"/>
+ </tile>
+ <tile id="6">
+ <image width="384" height="128" source="cloud.png"/>
+ </tile>
+ <tile id="7">
+ <image width="128" height="192" source="column1.png"/>
+ </tile>
+ <tile id="8">
+ <image width="128" height="192" source="column2.png"/>
+ </tile>
+ <tile id="9">
+ <image width="160" height="192" source="doorBlueStroked.png"/>
+ </tile>
+ <tile id="10">
+ <image width="160" height="192" source="doorGreenStroke.png"/>
+ </tile>
+ <tile id="11">
+ <image width="160" height="192" source="doorRedStroked.png"/>
+ </tile>
+ <tile id="12">
+ <image width="160" height="192" source="doorStroked.png"/>
+ </tile>
+ <tile id="13">
+ <image width="64" height="64" source="earthWall.png"/>
+ </tile>
+ <tile id="14">
+ <image width="160" height="192" source="exit.png"/>
+ </tile>
+ <tile id="15">
+ <image width="192" height="192" source="flare.png"/>
+ </tile>
+ <tile id="16">
+ <image width="64" height="64" source="gemBlueStroked.png"/>
+ </tile>
+ <tile id="17">
+ <image width="64" height="64" source="gemRedStroked.png"/>
+ </tile>
+ <tile id="18">
+ <image width="224" height="32" source="grassLarge.png"/>
+ </tile>
+ <tile id="19">
+ <image width="160" height="32" source="grassSmall.png"/>
+ </tile>
+ <tile id="20">
+ <image width="64" height="64" source="grey.png"/>
+ </tile>
+ <tile id="21">
+ <image width="128" height="160" source="hero.png"/>
+ </tile>
+ <tile id="22">
+ <image width="96" height="64" source="keyGreenStroked.png"/>
+ </tile>
+ <tile id="23">
+ <image width="96" height="64" source="keyRedStroked.png"/>
+ </tile>
+ <tile id="24">
+ <image width="96" height="64" source="keyYellowStroked.png"/>
+ </tile>
+ <tile id="25">
+ <image width="192" height="64" source="platform1.png"/>
+ </tile>
+ <tile id="26">
+ <image width="192" height="64" source="platform2.png"/>
+ </tile>
+ <tile id="27">
+ <image width="192" height="64" source="platform3.png"/>
+ </tile>
+ <tile id="28">
+ <image width="192" height="64" source="platform4.png"/>
+ </tile>
+ <tile id="29">
+ <image width="256" height="96" source="platformBase1.png"/>
+ </tile>
+ <tile id="30">
+ <image width="256" height="96" source="platformBase2.png"/>
+ </tile>
+ <tile id="31">
+ <image width="256" height="96" source="platformBase3.png"/>
+ </tile>
+ <tile id="32">
+ <image width="256" height="96" source="platformBase4.png"/>
+ </tile>
+ <tile id="33">
+ <image width="128" height="96" source="platformBlock1.png"/>
+ </tile>
+ <tile id="34">
+ <image width="128" height="96" source="platformBlock2.png"/>
+ </tile>
+ <tile id="35">
+ <image width="128" height="96" source="platformBlock3.png"/>
+ </tile>
+ <tile id="36">
+ <image width="128" height="96" source="platformBlock4.png"/>
+ </tile>
+ <tile id="37">
+ <image width="96" height="64" source="platformConnector1.png"/>
+ </tile>
+ <tile id="38">
+ <image width="96" height="64" source="platformConnector2.png"/>
+ </tile>
+ <tile id="39">
+ <image width="96" height="64" source="platformConnector3.png"/>
+ </tile>
+ <tile id="40">
+ <image width="96" height="64" source="platformConnector4.png"/>
+ </tile>
+ <tile id="41">
+ <image width="96" height="96" source="pushBlock1.png"/>
+ </tile>
+ <tile id="42">
+ <image width="96" height="96" source="pushBlock2.png"/>
+ </tile>
+ <tile id="43">
+ <image width="96" height="96" source="pushBlock3.png"/>
+ </tile>
+ <tile id="44">
+ <image width="64" height="64" source="shadow.png"/>
+ </tile>
+ <tile id="45">
+ <image width="93" height="93" source="shieldStroked.png"/>
+ </tile>
+ <tile id="46">
+ <image width="160" height="128" source="sign.png"/>
+ </tile>
+ <tile id="48">
+ <image width="192" height="96" source="swordStroked.png"/>
+ </tile>
+ <tile id="49">
+ <image width="96" height="96" source="torch.png"/>
+ </tile>
+ <tile id="50">
+ <image width="128" height="32" source="trap.png"/>
+ </tile>
+ <tile id="51">
+ <image width="128" height="96" source="wallDecor1.png"/>
+ </tile>
+ <tile id="52">
+ <image width="128" height="96" source="wallDecor2.png"/>
+ </tile>
+ <tile id="53">
+ <image width="160" height="128" source="wallDecor3.png"/>
+ </tile>
+ <tile id="54">
+ <image width="65" height="64" source="window1.png"/>
+ </tile>
+ <tile id="55">
+ <image width="64" height="64" source="window2.png"/>
+ </tile>
+ <tile id="56">
+ <image width="56" height="59" source="window3.png"/>
+ </tile>
+ <tile id="57">
+ <image width="135" height="115" source="backgroundArch.png"/>
+ </tile>
+ <tile id="58">
+ <image width="380" height="140" source="backgroundMountain.png"/>
+ </tile>
+ <tile id="59">
+ <image width="129" height="332" source="backgroundTower.png"/>
+ </tile>
+ <tile id="60">
+ <image width="109" height="177" source="backgroundTree.png"/>
+ </tile>
+ <tile id="61">
+ <image width="64" height="64" source="earthWall2.png"/>
+ </tile>
+ <tile id="62">
+ <image width="133" height="160" source="skeleton.png"/>
+ </tile>
+</tileset>
diff --git a/testing_data/tiled_examples/sticker-knight/map/platform1.png b/testing_data/tiled_examples/sticker-knight/map/platform1.png
new file mode 100644
index 0000000..e634bed
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platform1.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platform2.png b/testing_data/tiled_examples/sticker-knight/map/platform2.png
new file mode 100644
index 0000000..3bfa441
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platform2.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platform3.png b/testing_data/tiled_examples/sticker-knight/map/platform3.png
new file mode 100644
index 0000000..d2938f9
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platform3.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platform4.png b/testing_data/tiled_examples/sticker-knight/map/platform4.png
new file mode 100644
index 0000000..39c53fd
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platform4.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platformBase1.png b/testing_data/tiled_examples/sticker-knight/map/platformBase1.png
new file mode 100644
index 0000000..7a08f94
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platformBase1.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platformBase2.png b/testing_data/tiled_examples/sticker-knight/map/platformBase2.png
new file mode 100644
index 0000000..074bbe5
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platformBase2.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platformBase3.png b/testing_data/tiled_examples/sticker-knight/map/platformBase3.png
new file mode 100644
index 0000000..1edfff9
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platformBase3.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platformBase4.png b/testing_data/tiled_examples/sticker-knight/map/platformBase4.png
new file mode 100644
index 0000000..e142526
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platformBase4.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platformBlock1.png b/testing_data/tiled_examples/sticker-knight/map/platformBlock1.png
new file mode 100644
index 0000000..c2ab0ee
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platformBlock1.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platformBlock2.png b/testing_data/tiled_examples/sticker-knight/map/platformBlock2.png
new file mode 100644
index 0000000..39d6493
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platformBlock2.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platformBlock3.png b/testing_data/tiled_examples/sticker-knight/map/platformBlock3.png
new file mode 100644
index 0000000..12337a8
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platformBlock3.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platformBlock4.png b/testing_data/tiled_examples/sticker-knight/map/platformBlock4.png
new file mode 100644
index 0000000..5ce2c18
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platformBlock4.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platformConnector1.png b/testing_data/tiled_examples/sticker-knight/map/platformConnector1.png
new file mode 100644
index 0000000..5b03569
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platformConnector1.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platformConnector2.png b/testing_data/tiled_examples/sticker-knight/map/platformConnector2.png
new file mode 100644
index 0000000..5671b0e
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platformConnector2.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platformConnector3.png b/testing_data/tiled_examples/sticker-knight/map/platformConnector3.png
new file mode 100644
index 0000000..095f014
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platformConnector3.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/platformConnector4.png b/testing_data/tiled_examples/sticker-knight/map/platformConnector4.png
new file mode 100644
index 0000000..b859ee4
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/platformConnector4.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/pushBlock1.png b/testing_data/tiled_examples/sticker-knight/map/pushBlock1.png
new file mode 100644
index 0000000..9b7156e
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/pushBlock1.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/pushBlock2.png b/testing_data/tiled_examples/sticker-knight/map/pushBlock2.png
new file mode 100644
index 0000000..c3977cb
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/pushBlock2.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/pushBlock3.png b/testing_data/tiled_examples/sticker-knight/map/pushBlock3.png
new file mode 100644
index 0000000..28778dd
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/pushBlock3.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/sandbox.tmx b/testing_data/tiled_examples/sticker-knight/map/sandbox.tmx
new file mode 100644
index 0000000..3c4ff00
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/sandbox.tmx
@@ -0,0 +1,234 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.4" tiledversion="1.4.1" orientation="orthogonal" renderorder="right-down" width="79" height="45" tilewidth="32" tileheight="32" infinite="0" backgroundcolor="#27b99a" nextlayerid="10" nextobjectid="203">
+ <tileset firstgid="1" source="objs.tsx"/>
+ <objectgroup id="1" name="parallax">
+ <object id="95" gid="7" x="-16.2424" y="452.394" width="384" height="128"/>
+ <object id="90" gid="16" x="146.97" y="693.727" width="192" height="192"/>
+ <object id="91" gid="2147483655" x="373.939" y="627.121" width="384" height="128"/>
+ <object id="93" gid="2147483655" x="2105.85" y="510.818" width="384" height="128"/>
+ <object id="92" gid="7" x="1453.52" y="651.909" width="384" height="128"/>
+ <object id="94" gid="7" x="946.606" y="420.455" width="384" height="128"/>
+ <object id="105" gid="59" x="66.6667" y="1079" width="837.333" height="320"/>
+ <object id="106" gid="59" x="592" y="1055" width="920" height="448"/>
+ <object id="107" gid="59" x="1173.54" y="1179.49" width="920" height="352" rotation="-10.4469"/>
+ <object id="108" gid="59" x="1824.67" y="1141" width="656.364" height="448"/>
+ <object id="109" gid="60" x="2145.33" y="817" width="129" height="332"/>
+ <object id="110" gid="60" x="1771.52" y="976.697" width="129" height="332"/>
+ <object id="113" gid="60" x="847.515" y="823.788" width="129" height="332"/>
+ </objectgroup>
+ <objectgroup id="2" name="background">
+ <object id="1" gid="14" x="0" y="1440" width="2528" height="385"/>
+ <object id="79" gid="14" x="448" y="1087" width="512" height="320"/>
+ <object id="169" gid="62" x="1216" y="991" width="256" height="160"/>
+ <object id="172" gid="62" x="992" y="1023" width="256" height="160"/>
+ <object id="177" gid="62" x="512" y="735" width="256" height="160"/>
+ </objectgroup>
+ <objectgroup id="3" name="ground">
+ <object id="2" gid="31" x="0" y="1087" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="3" gid="31" x="256" y="1087" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="4" gid="30" x="1216" y="895" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" type="bool" value="true"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="5" gid="31" x="512" y="1087" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="7" gid="31" x="768" y="1087" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="9" gid="31" x="992" y="1087" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="11" gid="31" x="1248" y="1087" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="12" gid="52" x="84" y="1199" width="128" height="96"/>
+ <object id="13" gid="52" x="652" y="1319" width="128" height="96"/>
+ <object id="14" gid="52" x="972" y="1203" width="128" height="96"/>
+ <object id="15" gid="52" x="1420" y="1319" width="128" height="96"/>
+ <object id="16" gid="52" x="1748" y="1183" width="128" height="96"/>
+ <object id="17" gid="52" x="1964.24" y="1354.15" width="128" height="96"/>
+ <object id="18" gid="53" x="272" y="1295" width="128" height="96"/>
+ <object id="19" gid="53" x="576" y="1191" width="128" height="96"/>
+ <object id="20" gid="53" x="1048" y="1323" width="128" height="96"/>
+ <object id="21" gid="53" x="1288" y="1211" width="128" height="96"/>
+ <object id="22" gid="53" x="1720" y="1339" width="128" height="96"/>
+ <object id="23" gid="53" x="2008" y="1203" width="128" height="96"/>
+ <object id="24" gid="53" x="2287.76" y="1198.03" width="128" height="96"/>
+ <object id="84" gid="53" x="514.545" y="907.545" width="128" height="96"/>
+ <object id="86" gid="52" x="658.667" y="963.606" width="128" height="96"/>
+ <object id="87" gid="31" x="448" y="831" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" type="bool" value="true"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="121" gid="53" x="2190.79" y="1361.67" width="128" height="96"/>
+ <object id="162" gid="53" x="786.545" y="919.545" width="128" height="96"/>
+ <object id="163" gid="31" x="704" y="831" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" type="bool" value="true"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="164" gid="31" x="1760" y="1087" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="166" gid="31" x="2016" y="1087" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="175" gid="30" x="992" y="959" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" type="bool" value="true"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="176" gid="30" x="1472" y="1023" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" type="bool" value="true"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="180" gid="30" x="512" y="671" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" type="bool" value="true"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="183" gid="31" x="1504" y="1087" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="184" gid="31" x="2272" y="1087" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" type="float" value="1"/>
+ </properties>
+ </object>
+ <object id="187" gid="52" x="1280" y="991" width="128" height="96"/>
+ <object id="188" gid="52" x="544" y="735" width="128" height="96"/>
+ </objectgroup>
+ <objectgroup id="4" name="castle">
+ <object id="25" gid="33" x="1952" y="1023" width="256" height="96"/>
+ <object id="26" gid="33" x="1952" y="959" width="256" height="96"/>
+ <object id="27" gid="33" x="1952" y="895" width="256" height="96"/>
+ <object id="28" gid="33" x="1952" y="831" width="256" height="96"/>
+ <object id="29" gid="33" x="1952" y="639" width="256" height="96"/>
+ <object id="30" gid="33" x="1952" y="767" width="256" height="96"/>
+ <object id="31" gid="33" x="1952" y="703" width="256" height="96"/>
+ <object id="33" gid="33" x="1952" y="575" width="256" height="96"/>
+ <object id="34" gid="33" x="1888" y="511" width="256" height="96"/>
+ <object id="133" gid="2147483681" x="1984" y="575" width="256" height="96"/>
+ <object id="134" gid="2147483681" x="1984" y="703" width="256" height="96"/>
+ <object id="135" gid="2147483681" x="1984" y="1023" width="256" height="96"/>
+ <object id="136" gid="2147483681" x="1984" y="639" width="256" height="96"/>
+ <object id="137" gid="2147483681" x="1984" y="895" width="256" height="96"/>
+ <object id="138" gid="2147483681" x="2048" y="511" width="256" height="96"/>
+ <object id="139" gid="2147483681" x="1984" y="831" width="256" height="96"/>
+ <object id="140" gid="2147483681" x="1984" y="767" width="256" height="96"/>
+ <object id="141" gid="2147483681" x="1984" y="959" width="256" height="96"/>
+ <object id="146" gid="2147483681" x="2048" y="447" width="256" height="96"/>
+ <object id="147" gid="33" x="1888" y="447" width="256" height="96"/>
+ <object id="150" gid="2147483681" x="2048" y="383" width="256" height="96"/>
+ <object id="151" gid="33" x="1888" y="383" width="256" height="96"/>
+ <object id="153" gid="29" x="2176" y="223" width="192" height="64" rotation="90"/>
+ <object id="154" gid="29" x="2240" y="223" width="192" height="64" rotation="-270"/>
+ <object id="155" gid="29" x="2048" y="223" width="192" height="64" rotation="90"/>
+ <object id="156" gid="29" x="2112" y="223" width="192" height="64" rotation="-270"/>
+ <object id="157" gid="29" x="1920" y="223" width="192" height="64" rotation="90"/>
+ <object id="158" gid="29" x="1984" y="223" width="192" height="64" rotation="-270"/>
+ <object id="159" gid="29" x="1952" y="415" width="192" height="64" rotation="-90"/>
+ </objectgroup>
+ <objectgroup id="5" name="castledeco">
+ <object id="54" gid="55" x="2063" y="698" width="65" height="64"/>
+ <object id="55" gid="55" x="2063" y="557" width="65" height="64"/>
+ <object id="57" type="exit" gid="13" x="2016" y="991" width="160" height="192">
+ <properties>
+ <property name="map" value="scene/game/map/sandbox2.json"/>
+ </properties>
+ </object>
+ </objectgroup>
+ <objectgroup id="6" name="shading" opacity="0.36">
+ <object id="78" gid="45" x="1952" y="991" width="32" height="512"/>
+ <object id="80" gid="45" x="448" y="991" width="32" height="256"/>
+ <object id="89" gid="45" x="928" y="991" width="32" height="256"/>
+ <object id="112" gid="45" x="2208" y="991" width="32" height="512"/>
+ <object id="142" gid="45" x="1888" y="479" width="32" height="64"/>
+ <object id="143" gid="45" x="2272" y="479" width="32" height="64"/>
+ <object id="144" gid="45" x="1984" y="490" width="254" height="11"/>
+ <object id="145" gid="45" x="2272" y="415" width="32" height="64"/>
+ <object id="148" gid="45" x="1888" y="415" width="32" height="188"/>
+ <object id="149" gid="45" x="2272" y="351" width="32" height="128"/>
+ <object id="152" gid="45" x="1888" y="351" width="32" height="64"/>
+ <object id="171" gid="45" x="1440" y="991" width="32" height="192"/>
+ <object id="178" gid="45" x="512" y="735" width="32" height="160"/>
+ <object id="179" gid="45" x="736" y="735" width="32" height="160"/>
+ <object id="181" gid="45" x="992" y="991" width="32" height="128"/>
+ <object id="198" gid="45" x="2496" y="1440" width="32" height="448"/>
+ <object id="199" gid="45" x="0" y="1440" width="32" height="448"/>
+ </objectgroup>
+ <objectgroup id="7" name="game">
+ <object id="58" template="templates/hero.tx" x="45" y="979.5"/>
+ <object id="111" template="templates/block.tx" x="594" y="571"/>
+ <object id="182" template="templates/block.tx" x="1344" y="799"/>
+ <object id="190" template="templates/diamond.tx" x="238" y="947.5"/>
+ <object id="191" template="templates/diamond.tx" x="352" y="860.5"/>
+ <object id="192" template="templates/diamond.tx" x="481" y="950.5"/>
+ <object id="200" template="templates/diamond.tx" x="1583.45" y="829.318"/>
+ <object id="201" template="templates/diamond.tx" x="1826.45" y="832.318"/>
+ <object id="202" template="templates/diamond.tx" x="1697.45" y="742.318"/>
+ </objectgroup>
+ <objectgroup id="8" name="above">
+ <object id="118" gid="19" x="481" y="997" width="224" height="32"/>
+ </objectgroup>
+ <objectgroup id="9" name="bounds" visible="0">
+ <object id="197" x="2496" y="0" width="32" height="992">
+ <properties>
+ <property name="bodyType" value="static"/>
+ </properties>
+ </object>
+ <object id="195" x="0" y="0" width="32" height="992">
+ <properties>
+ <property name="bodyType" value="static"/>
+ </properties>
+ </object>
+ </objectgroup>
+</map>
diff --git a/testing_data/tiled_examples/sticker-knight/map/sandbox2.tmx b/testing_data/tiled_examples/sticker-knight/map/sandbox2.tmx
new file mode 100644
index 0000000..61bb0f6
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/sandbox2.tmx
@@ -0,0 +1,301 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.4" tiledversion="1.4.3" orientation="orthogonal" renderorder="right-down" width="80" height="31" tilewidth="32" tileheight="32" infinite="0" backgroundcolor="#35495e" nextlayerid="9" nextobjectid="387">
+ <tileset firstgid="1" source="objs.tsx"/>
+ <objectgroup id="1" name="background">
+ <object id="193" gid="6" x="0" y="1184" width="1280" height="416"/>
+ <object id="284" gid="15" x="192" y="450" width="160" height="192"/>
+ <object id="287" gid="54" x="704" y="448" width="160" height="128"/>
+ <object id="288" gid="54" x="72" y="160" width="160" height="128"/>
+ <object id="291" gid="54" x="488" y="664" width="160" height="128"/>
+ <object id="292" gid="54" x="1296" y="216" width="160" height="128"/>
+ <object id="293" gid="54" x="1608" y="488" width="160" height="128"/>
+ <object id="294" gid="54" x="1856" y="648" width="160" height="128"/>
+ <object id="295" gid="54" x="2280" y="288" width="160" height="128"/>
+ <object id="296" gid="50" x="96" y="352" width="96" height="96"/>
+ <object id="297" gid="50" x="384" y="352" width="96" height="96"/>
+ <object id="298" gid="50" x="912" y="608" width="96" height="96"/>
+ <object id="299" gid="50" x="1888" y="288" width="96" height="96"/>
+ <object id="300" gid="50" x="2272" y="288" width="96" height="96"/>
+ <object id="301" gid="50" x="1296" y="328" width="96" height="96"/>
+ <object id="341" gid="6" x="2560" y="-288" width="1472" height="392" rotation="-270"/>
+ <object id="342" gid="6" x="-352" y="-288" width="1472" height="352" rotation="-270"/>
+ <object id="353" gid="6" x="0" y="-56" width="2568" height="232"/>
+ <object id="361" gid="54" x="1296" y="216" width="160" height="128"/>
+ <object id="373" gid="6" x="1792" y="1184" width="800" height="352"/>
+ <object id="374" gid="6" x="1152" y="1184" width="800" height="160"/>
+ </objectgroup>
+ <objectgroup id="2" name="ground">
+ <object id="196" gid="28" x="2120" y="416" width="192" height="64">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="true"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="197" gid="29" x="1928" y="416" width="192" height="64">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="true"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="232" gid="28" x="1088" y="608" width="192" height="64">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="true"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="233" gid="29" x="1472" y="480" width="192" height="64">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="true"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="237" type="coin" gid="18" x="2096" y="608" width="64" height="64"/>
+ <object id="238" type="coin" gid="18" x="1152" y="480" width="64" height="64"/>
+ <object id="258" gid="33" x="0" y="864" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="259" gid="33" x="512" y="864" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="260" gid="32" x="256" y="864" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="261" gid="32" x="768" y="864" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="262" gid="33" x="1024" y="864" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="263" gid="33" x="1280" y="1088" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="264" gid="32" x="1536" y="1088" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="265" gid="33" x="1792" y="864" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="266" gid="33" x="2304" y="864" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="267" gid="32" x="2048" y="864" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="276" type="exit" gid="10" x="2056" y="352" width="160" height="192">
+ <properties>
+ <property name="map" value="scene/game/map/sandbox3.json"/>
+ </properties>
+ </object>
+ <object id="277" gid="37" x="352" y="768" width="128" height="96"/>
+ <object id="278" gid="8" x="116" y="672" width="128" height="192"/>
+ <object id="279" gid="9" x="363" y="672" width="128" height="192"/>
+ <object id="280" gid="36" x="104" y="768" width="128" height="96"/>
+ <object id="281" gid="28" x="216" y="512" width="192" height="64">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="true"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="282" gid="29" x="24" y="512" width="192" height="64">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="true"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="283" gid="29" x="408" y="512" width="192" height="64">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="true"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="286" gid="8" x="1112" y="768" width="128" height="192"/>
+ <object id="343" gid="33" x="1792" y="32" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value=""/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="344" gid="33" x="2304" y="32" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="false"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="345" gid="33" x="0" y="32" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="false"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="346" gid="32" x="256" y="32" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="false"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="347" gid="33" x="1280" y="32" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="false"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="348" gid="33" x="512" y="32" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="false"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="349" gid="33" x="1024" y="32" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="false"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="350" gid="32" x="1536" y="32" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="false"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="351" gid="32" x="2048" y="32" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="false"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="352" gid="33" x="768" y="32" width="256" height="96">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="false"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="270" gid="36" x="1920" y="768" width="128" height="96"/>
+ <object id="273" gid="9" x="2179" y="672" width="128" height="192"/>
+ <object id="272" gid="8" x="1932" y="672" width="128" height="192"/>
+ <object id="275" gid="37" x="1920" y="480" width="128" height="96"/>
+ <object id="274" gid="36" x="2168" y="480" width="128" height="96"/>
+ <object id="271" gid="37" x="2168" y="768" width="128" height="96"/>
+ <object id="383" gid="29" x="1472" y="704" width="192" height="64">
+ <properties>
+ <property name="bodyType" value="static"/>
+ <property name="floating" value="true"/>
+ <property name="friction" value="1.00"/>
+ </properties>
+ </object>
+ <object id="384" type="coin" gid="18" x="1536" y="320" width="64" height="64"/>
+ </objectgroup>
+ <objectgroup id="3" name="castledeco">
+ <object id="220" gid="37" x="184" y="1016" width="128" height="96"/>
+ <object id="221" gid="36" x="1832" y="1024" width="128" height="96"/>
+ <object id="227" gid="55" x="1184" y="968" width="65" height="64"/>
+ <object id="228" gid="55" x="512" y="960" width="65" height="64"/>
+ <object id="229" gid="55" x="2304" y="952" width="65" height="64"/>
+ <object id="268" gid="36" x="832" y="1048" width="128" height="96"/>
+ <object id="364" gid="54" x="-200" y="216" width="160" height="128"/>
+ <object id="359" gid="54" x="-120" y="1072" width="160" height="128"/>
+ <object id="360" gid="54" x="2584" y="56" width="160" height="128"/>
+ <object id="366" gid="54" x="2512" y="1112" width="160" height="128"/>
+ <object id="367" gid="56" x="928" y="328" width="64" height="64"/>
+ <object id="368" gid="56" x="1128" y="160" width="64" height="64"/>
+ <object id="369" gid="56" x="2392" y="464" width="64" height="64"/>
+ <object id="370" gid="56" x="272" y="624" width="64" height="64"/>
+ </objectgroup>
+ <objectgroup id="4" name="shading" opacity="0.16">
+ <object id="112" gid="45" x="2496" y="1184" width="456" height="1472"/>
+ <object id="334" gid="45" x="-384" y="1184" width="448" height="1472"/>
+ </objectgroup>
+ <objectgroup id="5" name="light" opacity="0.5">
+ <object id="335" gid="16" x="2224" y="280" width="192" height="192"/>
+ <object id="336" gid="16" x="1840" y="280" width="192" height="192"/>
+ <object id="337" gid="16" x="1248" y="320" width="192" height="192"/>
+ <object id="338" gid="16" x="336" y="336" width="192" height="192"/>
+ <object id="339" gid="16" x="48" y="336" width="192" height="192"/>
+ <object id="340" gid="16" x="864" y="600" width="192" height="192"/>
+ </objectgroup>
+ <objectgroup id="6" name="game">
+ <object id="58" template="templates/hero.tx" x="288" y="448"/>
+ <object id="111" template="templates/block.tx" x="2245" y="340"/>
+ <object id="161" name="hey" type="blob" gid="3" x="464" y="768" width="96" height="64"/>
+ <object id="160" type="blob" gid="2" x="846" y="756" width="96" height="64"/>
+ <object id="189" type="enemy" gid="2147483711" x="2412" y="754" width="133" height="160"/>
+ <object id="190" type="coin" gid="17" x="96" y="736" width="64" height="64"/>
+ <object id="192" type="coin" gid="17" x="96" y="416" width="64" height="64"/>
+ <object id="231" template="templates/block.tx" x="488" y="448"/>
+ <object id="285" type="coin" gid="17" x="1536" y="576" width="64" height="64"/>
+ </objectgroup>
+ <objectgroup id="7" name="above">
+ <object id="379" type="spikes" gid="51" x="1280" y="995" width="128" height="32"/>
+ <object id="380" type="spikes" gid="51" x="1408" y="995" width="128" height="32"/>
+ <object id="381" type="spikes" gid="51" x="1536" y="995" width="128" height="32"/>
+ <object id="382" type="spikes" gid="51" x="1664" y="995" width="128" height="32"/>
+ </objectgroup>
+ <objectgroup id="8" name="bounds" visible="0">
+ <object id="375" x="-32" y="-64" width="32" height="896">
+ <properties>
+ <property name="bodyType" value="static"/>
+ </properties>
+ </object>
+ <object id="376" x="2560" y="-64" width="32" height="896">
+ <properties>
+ <property name="bodyType" value="static"/>
+ </properties>
+ </object>
+ <object id="377" x="1792" y="768" width="32" height="288">
+ <properties>
+ <property name="bodyType" value="static"/>
+ </properties>
+ </object>
+ <object id="378" x="1248" y="762.5" width="32" height="293.5">
+ <properties>
+ <property name="bodyType" value="static"/>
+ </properties>
+ </object>
+ </objectgroup>
+</map>
diff --git a/testing_data/tiled_examples/sticker-knight/map/shadow.png b/testing_data/tiled_examples/sticker-knight/map/shadow.png
new file mode 100644
index 0000000..c43af09
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/shadow.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/shieldStroked.png b/testing_data/tiled_examples/sticker-knight/map/shieldStroked.png
new file mode 100644
index 0000000..976f171
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/shieldStroked.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/sign.png b/testing_data/tiled_examples/sticker-knight/map/sign.png
new file mode 100644
index 0000000..47ec0ac
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/sign.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/skeleton.png b/testing_data/tiled_examples/sticker-knight/map/skeleton.png
new file mode 100644
index 0000000..84040a1
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/skeleton.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/swordStroked.png b/testing_data/tiled_examples/sticker-knight/map/swordStroked.png
new file mode 100644
index 0000000..a3b6874
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/swordStroked.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/templates/block.tx b/testing_data/tiled_examples/sticker-knight/map/templates/block.tx
new file mode 100644
index 0000000..3bb9a81
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/templates/block.tx
@@ -0,0 +1,11 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template>
+ <tileset firstgid="1" source="../objs.tsx"/>
+ <object name="block" gid="44" width="96" height="96">
+ <properties>
+ <property name="bodyType" value="dynamic"/>
+ <property name="density" type="float" value="2"/>
+ <property name="friction" type="float" value="0.45"/>
+ </properties>
+ </object>
+</template>
diff --git a/testing_data/tiled_examples/sticker-knight/map/templates/diamond.tx b/testing_data/tiled_examples/sticker-knight/map/templates/diamond.tx
new file mode 100644
index 0000000..01b0dd1
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/templates/diamond.tx
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template>
+ <tileset firstgid="1" source="../objs.tsx"/>
+ <object type="coin" gid="17" width="64" height="64"/>
+</template>
diff --git a/testing_data/tiled_examples/sticker-knight/map/templates/hero.tx b/testing_data/tiled_examples/sticker-knight/map/templates/hero.tx
new file mode 100644
index 0000000..793b2f5
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/templates/hero.tx
@@ -0,0 +1,5 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<template>
+ <tileset firstgid="1" source="../objs.tsx"/>
+ <object name="hero" type="hero" gid="22" width="128" height="160"/>
+</template>
diff --git a/testing_data/tiled_examples/sticker-knight/map/torch.png b/testing_data/tiled_examples/sticker-knight/map/torch.png
new file mode 100644
index 0000000..75ca437
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/torch.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/trap.png b/testing_data/tiled_examples/sticker-knight/map/trap.png
new file mode 100644
index 0000000..7b07731
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/trap.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/wallDecor1.png b/testing_data/tiled_examples/sticker-knight/map/wallDecor1.png
new file mode 100644
index 0000000..9fadac3
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/wallDecor1.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/wallDecor2.png b/testing_data/tiled_examples/sticker-knight/map/wallDecor2.png
new file mode 100644
index 0000000..e33ad11
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/wallDecor2.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/wallDecor3.png b/testing_data/tiled_examples/sticker-knight/map/wallDecor3.png
new file mode 100644
index 0000000..3053883
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/wallDecor3.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/window1.png b/testing_data/tiled_examples/sticker-knight/map/window1.png
new file mode 100644
index 0000000..255b571
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/window1.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/window2.png b/testing_data/tiled_examples/sticker-knight/map/window2.png
new file mode 100644
index 0000000..3a4143b
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/window2.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/map/window3.png b/testing_data/tiled_examples/sticker-knight/map/window3.png
new file mode 100644
index 0000000..6039873
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/map/window3.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/preview.png b/testing_data/tiled_examples/sticker-knight/preview.png
new file mode 100644
index 0000000..8268433
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/preview.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/sprites.png b/testing_data/tiled_examples/sticker-knight/sprites.png
new file mode 100644
index 0000000..b00c781
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/sprites.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/ui/backgroundSet.png b/testing_data/tiled_examples/sticker-knight/ui/backgroundSet.png
new file mode 100644
index 0000000..1be6bb1
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/ui/backgroundSet.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/ui/block.png b/testing_data/tiled_examples/sticker-knight/ui/block.png
new file mode 100644
index 0000000..382c3d8
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/ui/block.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/ui/buttonHelp.png b/testing_data/tiled_examples/sticker-knight/ui/buttonHelp.png
new file mode 100644
index 0000000..920a380
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/ui/buttonHelp.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/ui/buttonStart.png b/testing_data/tiled_examples/sticker-knight/ui/buttonStart.png
new file mode 100644
index 0000000..415dd54
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/ui/buttonStart.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/ui/cloud.png b/testing_data/tiled_examples/sticker-knight/ui/cloud.png
new file mode 100644
index 0000000..f51cdce
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/ui/cloud.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/ui/gem.png b/testing_data/tiled_examples/sticker-knight/ui/gem.png
new file mode 100644
index 0000000..1e95975
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/ui/gem.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/ui/heart.png b/testing_data/tiled_examples/sticker-knight/ui/heart.png
new file mode 100644
index 0000000..d471b59
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/ui/heart.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/ui/helpBackground.png b/testing_data/tiled_examples/sticker-knight/ui/helpBackground.png
new file mode 100644
index 0000000..ad20725
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/ui/helpBackground.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/ui/shield.png b/testing_data/tiled_examples/sticker-knight/ui/shield.png
new file mode 100644
index 0000000..1474ad0
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/ui/shield.png
Binary files differ
diff --git a/testing_data/tiled_examples/sticker-knight/ui/title.json b/testing_data/tiled_examples/sticker-knight/ui/title.json
new file mode 100644
index 0000000..95b7beb
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/ui/title.json
@@ -0,0 +1,281 @@
+{ "backgroundcolor":"#3b97d3",
+ "height":26,
+ "layers":[
+ {
+ "draworder":"topdown",
+ "height":26,
+ "name":"background",
+ "objects":[
+ {
+ "gid":7,
+ "height":262.666666666667,
+ "id":11,
+ "name":"",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":1736,
+ "x":-256,
+ "y":920.666666666667
+ },
+ {
+ "gid":6,
+ "height":832,
+ "id":34,
+ "name":"",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":1216,
+ "x":122,
+ "y":810
+ }],
+ "opacity":1,
+ "type":"objectgroup",
+ "visible":true,
+ "width":38,
+ "x":0,
+ "y":0
+ },
+ {
+ "draworder":"topdown",
+ "height":26,
+ "name":"clouds",
+ "objects":[
+ {
+ "gid":8,
+ "height":61.3333333333333,
+ "id":14,
+ "name":"",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":184,
+ "x":640,
+ "y":320
+ },
+ {
+ "gid":8,
+ "height":61.3333333333333,
+ "id":17,
+ "name":"",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":184,
+ "x":336,
+ "y":144
+ },
+ {
+ "gid":8,
+ "height":61.3333333333333,
+ "id":21,
+ "name":"",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":192,
+ "x":1024,
+ "y":145
+ },
+ {
+ "gid":2147483656,
+ "height":61.3333333333333,
+ "id":23,
+ "name":"",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":184,
+ "x":44,
+ "y":136
+ },
+ {
+ "gid":6,
+ "height":600,
+ "id":8,
+ "name":"",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":954,
+ "x":-226,
+ "y":768
+ },
+ {
+ "gid":2147483654,
+ "height":546,
+ "id":35,
+ "name":"",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":826,
+ "x":710,
+ "y":782
+ },
+ {
+ "gid":2147483656,
+ "height":103.333333333333,
+ "id":36,
+ "name":"",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":284,
+ "x":926,
+ "y":307
+ },
+ {
+ "gid":8,
+ "height":103.333333333333,
+ "id":37,
+ "name":"",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":284,
+ "x":124,
+ "y":353
+ }],
+ "opacity":0.490000009536743,
+ "type":"objectgroup",
+ "visible":true,
+ "width":38,
+ "x":0,
+ "y":0
+ },
+ {
+ "draworder":"topdown",
+ "height":38,
+ "name":"title",
+ "objects":[
+ {
+ "gid":4,
+ "height":386,
+ "id":1,
+ "name":"logo",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":736,
+ "x":256,
+ "y":480
+ }],
+ "opacity":1,
+ "type":"objectgroup",
+ "visible":true,
+ "width":25,
+ "x":0,
+ "y":0
+ },
+ {
+ "draworder":"topdown",
+ "height":26,
+ "name":"help",
+ "objects":[
+ {
+ "gid":3,
+ "height":715.669407858419,
+ "id":26,
+ "name":"",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":745.251573276788,
+ "x":237.507948400548,
+ "y":739.425850721188
+ }],
+ "opacity":1,
+ "type":"objectgroup",
+ "visible":false,
+ "width":38,
+ "x":0,
+ "y":0
+ },
+ {
+ "draworder":"topdown",
+ "height":38,
+ "name":"buttons",
+ "objects":[
+ {
+ "gid":2,
+ "height":85.3333333333333,
+ "id":2,
+ "name":"start",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":256,
+ "x":485,
+ "y":655.333333333333
+ },
+ {
+ "gid":1,
+ "height":64,
+ "id":3,
+ "name":"help",
+ "rotation":0,
+ "type":"",
+ "visible":true,
+ "width":192,
+ "x":515.599635905335,
+ "y":761.206553703963
+ }],
+ "opacity":1,
+ "type":"objectgroup",
+ "visible":true,
+ "width":26,
+ "x":0,
+ "y":0
+ }],
+ "nextobjectid":38,
+ "orientation":"orthogonal",
+ "renderorder":"right-down",
+ "tileheight":32,
+ "tilesets":[
+ {
+ "columns":0,
+ "firstgid":1,
+ "margin":0,
+ "name":"ui",
+ "spacing":0,
+ "tilecount":7,
+ "tileheight":832,
+ "tiles":
+ {
+ "0":
+ {
+ "image":"buttonHelp.png"
+ },
+ "1":
+ {
+ "image":"buttonStart.png"
+ },
+ "2":
+ {
+ "image":"helpBackground.png"
+ },
+ "3":
+ {
+ "image":"title.png"
+ },
+ "5":
+ {
+ "image":"backgroundSet.png"
+ },
+ "6":
+ {
+ "image":"block.png"
+ },
+ "7":
+ {
+ "image":"cloud.png"
+ }
+ },
+ "tilewidth":1232
+ }],
+ "tilewidth":32,
+ "version":1,
+ "width":38
+} \ No newline at end of file
diff --git a/testing_data/tiled_examples/sticker-knight/ui/title.png b/testing_data/tiled_examples/sticker-knight/ui/title.png
new file mode 100644
index 0000000..8a6f161
--- /dev/null
+++ b/testing_data/tiled_examples/sticker-knight/ui/title.png
Binary files differ
diff --git a/testing_data/tiled_examples/test_hexagonal_tile_60x60x30.png b/testing_data/tiled_examples/test_hexagonal_tile_60x60x30.png
new file mode 100644
index 0000000..ce112fb
--- /dev/null
+++ b/testing_data/tiled_examples/test_hexagonal_tile_60x60x30.png
Binary files differ
diff --git a/testing_data/tiled_examples/test_hexagonal_tile_60x60x30.tmx b/testing_data/tiled_examples/test_hexagonal_tile_60x60x30.tmx
new file mode 100644
index 0000000..bbf214f
--- /dev/null
+++ b/testing_data/tiled_examples/test_hexagonal_tile_60x60x30.tmx
@@ -0,0 +1,30 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<map version="1.0" orientation="hexagonal" renderorder="right-down" width="20" height="20" tilewidth="60" tileheight="60" hexsidelength="30" staggeraxis="x" staggerindex="odd" nextobjectid="1">
+ <tileset firstgid="1" name="test_hexagonal_tile_60x60x30" tilewidth="60" tileheight="60" tilecount="1" columns="1">
+ <image source="test_hexagonal_tile_60x60x30.png" width="60" height="60"/>
+ </tileset>
+ <layer name="Tile Layer 1" width="20" height="20">
+ <data encoding="csv">
+1,536870913,268435457,3221225473,3758096385,3489660929,1,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+2147483649,2684354561,2415919105,1073741825,1610612737,1342177281,2147483649,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
+0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
+</data>
+ </layer>
+</map>
diff --git a/testing_data/tiled_examples/tmw_desert_spacing.png b/testing_data/tiled_examples/tmw_desert_spacing.png
new file mode 100644
index 0000000..4e9995c
--- /dev/null
+++ b/testing_data/tiled_examples/tmw_desert_spacing.png
Binary files differ