A library for parsing Tiled maps.
0
fork

Configure Feed

Select the types of activity you want to include in your feed.

Add support for Maps

+1255 -17
+1 -1
README.md
··· 42 42 43 43 ## Usage 44 44 45 - ### Maps (TODO) 45 + ### Maps 46 46 47 47 ```zig 48 48 const map = try tmz.Map.initFromFile(allocator, "map.tmj");
+35 -15
src/layer.zig
··· 26 26 }; 27 27 if (json_layer.objects) |json_objects| { 28 28 for (json_objects) |json_object| { 29 - // var object = json_object; 30 - // if (json_object.type) |object_type| object.type = try allocator.dupe(u8, object_type); 31 29 const object = try Object.fromJson(allocator, json_object); 32 30 try object_group.objects.append(allocator, object); 33 31 } ··· 43 41 self.objects.deinit(allocator); 44 42 } 45 43 46 - pub fn findByClass(self: ObjectGroup, class: []const u8) ?Object { 44 + pub fn getByClass(self: ObjectGroup, class: []const u8) ?Object { 47 45 for (self.objects.items) |object| { 48 46 if (object.class) |object_class| { 49 47 if (std.mem.eql(u8, object_class, class)) { 50 48 return object; 51 49 } 50 + } 51 + } 52 + return null; 53 + } 54 + 55 + pub fn get(self: ObjectGroup, name: []const u8) ?Object { 56 + for (self.objects.items) |object| { 57 + if (std.mem.eql(u8, object.name, name)) { 58 + return object; 52 59 } 53 60 } 54 61 return null; ··· 243 250 var chunk = try jsonParser(@This(), allocator, source, options); 244 251 245 252 if (source.object.get("data")) |data| { 246 - switch (data) { 247 - .array => { 248 - chunk.data = .{ .csv = try std.json.parseFromValueLeaky([]const u32, allocator, data, options) }; 249 - }, 250 - .string => { 251 - chunk.data = .{ .base64 = try std.json.parseFromValueLeaky([]const u8, allocator, data, options) }; 252 - }, 253 - else => return error.UnexpectedToken, 253 + if (data == .array) { 254 + chunk.data = .{ .csv = try std.json.parseFromValueLeaky([]const u32, allocator, data, options) }; 255 + } 256 + if (data == .string) { 257 + chunk.data = .{ .base64 = try std.json.parseFromValueLeaky([]const u8, allocator, data, options) }; 254 258 } 255 259 } 256 260 return chunk; ··· 426 430 427 431 return decompressed; 428 432 }, 429 - .none => unreachable, 433 + .none => return allocator.dupe(u8, compressed) catch @panic("OOM"), 430 434 }; 431 435 } 432 436 ··· 439 443 defer parsed_layer.deinit(); 440 444 const managed_layer = try std.json.parseFromValue(Layer.JsonLayer, allocator, parsed_layer.value, .{ .ignore_unknown_fields = true }); 441 445 defer managed_layer.deinit(); 442 - const layer = managed_layer.value; 446 + const json_layer = managed_layer.value; 443 447 444 - const properties = layer.properties.?; 448 + const properties = json_layer.properties.?; 445 449 var iterator = properties.iterator(); 446 450 while (iterator.next()) |entry| { 447 451 try std.testing.expectEqualStrings("custom", entry.value_ptr.name); 448 452 } 449 453 450 - try expectEqual(Layer.JsonLayer.DrawOrder.topdown, layer.draw_order); 454 + try expectEqual(Layer.JsonLayer.DrawOrder.topdown, json_layer.draw_order); 455 + 456 + var layer = try Layer.fromJson(allocator, json_layer); 457 + defer layer.deinit(allocator); 458 + 459 + const object_group = layer.content.object_group; 460 + 461 + try expectEqual(5, object_group.objects.items.len); 462 + { 463 + const object = object_group.getByClass("hello").?; 464 + try expectEqual(1, object.id); 465 + } 466 + 467 + { 468 + const object = object_group.get("polygon").?; 469 + try expectEqual(8, object.id); 470 + } 451 471 } 452 472 453 473 const Property = @import("property.zig").Property;
+300
src/map.zig
··· 1 + pub const Map = struct { 2 + background_color: ?tmz.Color = null, 3 + height: u32, 4 + width: u32, 5 + tile_width: u32, 6 + tile_height: u32, 7 + infinite: bool, 8 + orientation: Orientation, 9 + 10 + layers: std.ArrayListUnmanaged(Layer), 11 + tilesets: std.ArrayListUnmanaged(Tileset), 12 + 13 + class: ?[]const u8, 14 + 15 + pub const Orientation = enum { orthogonal, isometric, staggered, hexagonal }; 16 + 17 + pub fn initFromFile(allocator: Allocator, path: []const u8) anyerror!Map { 18 + const file = try std.fs.cwd().openFile(path, .{}); 19 + defer file.close(); 20 + 21 + const json = try file.reader().readAllAlloc(allocator, std.math.maxInt(u32)); 22 + defer allocator.free(json); 23 + 24 + return try initFromSlice(allocator, json); 25 + } 26 + 27 + pub fn initFromSlice(allocator: Allocator, json: []const u8) !Map { 28 + const parsed_value = try std.json.parseFromSlice(std.json.Value, allocator, json, .{ .ignore_unknown_fields = true }); 29 + defer parsed_value.deinit(); 30 + 31 + const map = try std.json.parseFromValue(JsonMap, allocator, parsed_value.value, .{ .ignore_unknown_fields = true }); 32 + defer map.deinit(); 33 + 34 + return try init(allocator, map); 35 + } 36 + 37 + pub fn init(allocator: std.mem.Allocator, parsed_map: std.json.Parsed(JsonMap)) !Map { 38 + const json_map = parsed_map.value; 39 + 40 + var map: Map = .{ 41 + .background_color = json_map.backgroundcolor, 42 + .height = json_map.height, 43 + .width = json_map.width, 44 + .tile_width = json_map.tilewidth, 45 + .tile_height = json_map.tileheight, 46 + .infinite = json_map.infinite, 47 + .orientation = json_map.orientation, 48 + .tilesets = .empty, 49 + .layers = .empty, 50 + 51 + .class = if (json_map.class) |class| try allocator.dupe(u8, class) else null, 52 + }; 53 + 54 + if (json_map.tilesets) |json_tilesets| { 55 + for (json_tilesets) |json_tileset| { 56 + const tileset = try Tileset.fromJson(allocator, json_tileset); 57 + try map.tilesets.append(allocator, tileset); 58 + } 59 + } 60 + 61 + if (json_map.layers) |json_layers| { 62 + for (json_layers) |json_layer| { 63 + const layer = try Layer.fromJson(allocator, json_layer); 64 + try map.layers.append(allocator, layer); 65 + } 66 + } 67 + 68 + return map; 69 + } 70 + 71 + pub fn deinit(self: *Map, allocator: std.mem.Allocator) void { 72 + if (self.class) |class| allocator.free(class); 73 + 74 + for (self.tilesets.items) |*tileset| { 75 + tileset.deinit(allocator); 76 + } 77 + self.tilesets.deinit(allocator); 78 + 79 + for (self.layers.items) |*layer| { 80 + layer.deinit(allocator); 81 + } 82 + self.layers.deinit(allocator); 83 + } 84 + 85 + pub fn getTile(self: Map, gid: u32) ?Tile { 86 + if (gid == 0) return null; 87 + 88 + const tileset_len = self.tilesets.items.len; 89 + var i = tileset_len - 1; 90 + while (i >= 0) : (i -= 1) { 91 + const tileset = self.tilesets.items[i]; 92 + if (tileset.first_gid <= gid) { 93 + return tileset.tiles.get(gid - tileset.first_gid); 94 + } 95 + } 96 + return null; 97 + } 98 + 99 + /// Finds first object 100 + pub fn getObjectByClass(self: Map, class: []const u8) ?tmz.Object { 101 + for (self.layers.items) |layer| { 102 + if (layer.content == .object_group) { 103 + if (layer.content.object_group.getByClass(class)) |object| { 104 + return object; 105 + } 106 + } 107 + } 108 + return null; 109 + } 110 + 111 + /// Finds first object by name 112 + pub fn getObject(self: Map, name: []const u8) ?tmz.Object { 113 + for (self.layers.items) |layer| { 114 + if (layer.content == .object_group) { 115 + if (layer.content.object_group.get(name)) |object| { 116 + return object; 117 + } 118 + } 119 + } 120 + return null; 121 + } 122 + 123 + pub fn pixelWidth(self: Map) u32 { 124 + return self.width * self.tile_width; 125 + } 126 + 127 + pub fn pixelHeight(self: Map) u32 { 128 + return self.height * self.tile_height; 129 + } 130 + 131 + /// https://doc.mapeditor.org/en/stable/reference/json-map-format/#map 132 + const JsonMap = struct { 133 + /// Hex-formatted color (#RRGGBB or #AARRGGBB) 134 + backgroundcolor: ?tmz.Color = null, 135 + class: ?[]const u8 = null, 136 + /// The compression level to use for tile layer data (defaults to -1, which means to use the algorithm default) 137 + // TODO: actually support this? 138 + compression_level: i32 = -1, 139 + /// Number of tile rows 140 + height: u32, 141 + /// Length of the side of a hex tile in pixels (hexagonal maps only) 142 + hex_side_length: ?u32 = null, 143 + infinite: bool, 144 + layers: ?[]Layer.JsonLayer = null, 145 + /// Auto-increments for each layer 146 + nextlayerid: u32, 147 + /// Auto-increments for each placed object 148 + // next_object_id: u32, 149 + orientation: Orientation, 150 + parallax_origin_x: ?f32 = 0, 151 + parallax_origin_y: ?f32 = 0, 152 + properties: ?[]Property = null, 153 + /// currently only supported for orthogonal maps 154 + renderorder: ?RenderOrder = null, 155 + /// staggered / hexagonal maps only 156 + staggeraxis: ?StaggerAxis = null, 157 + /// staggered / hexagonal maps only 158 + staggerindex: ?StaggerIndex = null, 159 + tiledversion: []const u8, 160 + /// Map grid height 161 + tileheight: u32, 162 + tilesets: ?[]Tileset.JsonTileset = null, 163 + /// Map grid width 164 + tilewidth: u32, 165 + version: []const u8, 166 + /// Number of tile columns 167 + width: u32, 168 + 169 + pub const RenderOrder = enum { @"right-down", @"right-up", @"left-down", @"left-up" }; 170 + pub const StaggerAxis = enum { x, y }; 171 + pub const StaggerIndex = enum { odd, even }; 172 + }; 173 + }; 174 + 175 + test "initFromFile" { 176 + const allocator = std.testing.allocator; 177 + const test_maps = [_][]const u8{ 178 + "src/test/map.tmj", 179 + "src/test/map-base64-none.tmj", 180 + "src/test/map-base64-gzip.tmj", 181 + "src/test/map-base64-zlib.tmj", 182 + "src/test/map-base64-zstd.tmj", 183 + }; 184 + 185 + for (test_maps) |test_map| { 186 + var map = try Map.initFromFile(allocator, test_map); 187 + defer map.deinit(allocator); 188 + 189 + try testMap(map); 190 + } 191 + } 192 + 193 + test "initFromSlice" { 194 + const test_map = @embedFile("test/map.tmj"); 195 + 196 + const allocator = std.testing.allocator; 197 + 198 + var map = try Map.initFromSlice(allocator, test_map); 199 + defer map.deinit(allocator); 200 + 201 + try testMap(map); 202 + } 203 + 204 + test "infinite map with base64 chunks" { 205 + const test_map = @embedFile("test/map-infinite-base64-zstd.tmj"); 206 + 207 + const allocator = std.testing.allocator; 208 + 209 + var map = try Map.initFromSlice(allocator, test_map); 210 + defer map.deinit(allocator); 211 + 212 + try expectEqual(true, map.infinite); 213 + } 214 + 215 + test "infinite map with csv chunks" { 216 + const test_map = @embedFile("test/map-infinite-csv.tmj"); 217 + 218 + const allocator = std.testing.allocator; 219 + 220 + var map = try Map.initFromSlice(allocator, test_map); 221 + defer map.deinit(allocator); 222 + 223 + try expectEqual(true, map.infinite); 224 + 225 + try expectEqual(3, map.layers.items.len); 226 + 227 + // const chunk_layer = map.layers.items[0].tile_layer; 228 + // try expectEqual(4, chunk_layer.chunks.?.len); 229 + 230 + // const chunk = chunk_layer.chunks.?[0]; 231 + // try expectEqual(256, chunk.data.csv.len); 232 + // try expectEqual(16, chunk.data.csv[0]); 233 + } 234 + 235 + fn testMap(map: Map) !void { 236 + try expectEqualStrings("bar", map.class.?); 237 + try expectEqual(30, map.height); 238 + try expectEqual(30, map.width); 239 + try expectEqual(false, map.infinite); 240 + try expectEqual(.orthogonal, map.orientation); 241 + try expectEqual(32, map.tile_width); 242 + try expectEqual(32, map.tile_height); 243 + try expectEqual(2, map.tilesets.items.len); 244 + 245 + const tileset = map.tilesets.items[0]; 246 + try expectEqual(1, tileset.first_gid); 247 + try expectEqualStrings("tilemap.png", tileset.image.?); 248 + 249 + const layer = map.layers.items[0]; 250 + try expectEqual(17, layer.content.tile_layer.data.items[0]); 251 + 252 + const bad_tile = map.getTile(0); 253 + try expectEqual(null, bad_tile); 254 + 255 + const foo = map.getTile(2).?; 256 + try expectEqual(1, foo.id); 257 + try expectEqual(17, foo.x); 258 + try expectEqual(0, foo.y); 259 + 260 + const tile = map.getTile(17).?; 261 + try expectEqual(16, tile.id); 262 + try expectEqual(272, tile.x); 263 + try expectEqual(0, tile.y); 264 + try expectEqual(16, tile.width); 265 + try expectEqual(16, tile.height); 266 + 267 + try expectEqual(tileset.first_gid, tile.tileset.first_gid); 268 + 269 + try expectEqual(960, map.pixelWidth()); 270 + try expectEqual(960, map.pixelHeight()); 271 + } 272 + 273 + test "findObjectByClass" { 274 + const allocator = std.testing.allocator; 275 + const test_map = @embedFile("test/map.tmj"); 276 + 277 + var map = try Map.initFromSlice(allocator, test_map); 278 + defer map.deinit(allocator); 279 + 280 + const object = map.getObjectByClass("hello_world").?; 281 + try expectEqualStrings("hello", object.name); 282 + try expectEqual(70.0, object.x); 283 + try expectEqual(44.0, object.y); 284 + 285 + try expectEqual(null, map.getObjectByClass("non_existent")); 286 + } 287 + 288 + const tmz = @import("tmz.zig"); 289 + const Tileset = tmz.Tileset; 290 + const Tile = tmz.Tile; 291 + const Property = tmz.Property; 292 + const Layer = tmz.Layer; 293 + 294 + const std = @import("std"); 295 + const Allocator = std.mem.Allocator; 296 + const ParseOptions = std.json.ParseOptions; 297 + const Value = std.json.Value; 298 + const expectEqualDeep = std.testing.expectEqualDeep; 299 + const expectEqual = std.testing.expectEqual; 300 + const expectEqualStrings = std.testing.expectEqualStrings;
+88
src/test/map-base64-gzip.tmj
··· 1 + { "class":"bar", 2 + "compressionlevel":-1, 3 + "height":30, 4 + "infinite":false, 5 + "layers":[ 6 + { 7 + "class":"bar", 8 + "compression":"gzip", 9 + "data":"H4sIAAAAAAAAA+3BMQEAAAjAoAXwsX9ZgwhsNQEAAPDNAfYOCYIQDgAA", 10 + "encoding":"base64", 11 + "height":30, 12 + "id":1, 13 + "name":"Tile Layer 1", 14 + "opacity":1, 15 + "type":"tilelayer", 16 + "visible":true, 17 + "width":30, 18 + "x":0, 19 + "y":0 20 + }, 21 + { 22 + "draworder":"topdown", 23 + "id":2, 24 + "name":"Object Layer 1", 25 + "objects":[ 26 + { 27 + "height":19, 28 + "id":1, 29 + "name":"", 30 + "rotation":0, 31 + "text": 32 + { 33 + "text":"Hello World", 34 + "wrap":true 35 + }, 36 + "type":"", 37 + "visible":true, 38 + "width":91.4375, 39 + "x":70, 40 + "y":44.6353383458647 41 + }, 42 + { 43 + "height":84.2105263157895, 44 + "id":2, 45 + "name":"", 46 + "rotation":0, 47 + "type":"", 48 + "visible":true, 49 + "width":100.250626566416, 50 + "x":214.53634085213, 51 + "y":172.431077694236 52 + }], 53 + "opacity":1, 54 + "type":"objectgroup", 55 + "visible":true, 56 + "x":0, 57 + "y":0 58 + }, 59 + { 60 + "id":3, 61 + "image":"", 62 + "name":"Image Layer 1", 63 + "opacity":1, 64 + "type":"imagelayer", 65 + "visible":true, 66 + "x":0, 67 + "y":0 68 + }], 69 + "nextlayerid":4, 70 + "nextobjectid":3, 71 + "orientation":"orthogonal", 72 + "renderorder":"right-down", 73 + "tiledversion":"1.11.2", 74 + "tileheight":32, 75 + "tilesets":[ 76 + { 77 + "firstgid":1, 78 + "source":"src\/test\/source_tileset.tsj" 79 + }, 80 + { 81 + "firstgid":1037, 82 + "source":"src\/test\/images_tileset.tsj" 83 + }], 84 + "tilewidth":32, 85 + "type":"map", 86 + "version":"1.10", 87 + "width":30 88 + }
+88
src/test/map-base64-none.tmj
··· 1 + { "class":"bar", 2 + "compressionlevel":-1, 3 + "height":30, 4 + "infinite":false, 5 + "layers":[ 6 + { 7 + "class":"bar", 8 + "compression":"", 9 + "data":"EQAAAAwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 10 + "encoding":"base64", 11 + "height":30, 12 + "id":1, 13 + "name":"Tile Layer 1", 14 + "opacity":1, 15 + "type":"tilelayer", 16 + "visible":true, 17 + "width":30, 18 + "x":0, 19 + "y":0 20 + }, 21 + { 22 + "draworder":"topdown", 23 + "id":2, 24 + "name":"Object Layer 1", 25 + "objects":[ 26 + { 27 + "height":19, 28 + "id":1, 29 + "name":"", 30 + "rotation":0, 31 + "text": 32 + { 33 + "text":"Hello World", 34 + "wrap":true 35 + }, 36 + "type":"", 37 + "visible":true, 38 + "width":91.4375, 39 + "x":70, 40 + "y":44.6353383458647 41 + }, 42 + { 43 + "height":84.2105263157895, 44 + "id":2, 45 + "name":"", 46 + "rotation":0, 47 + "type":"", 48 + "visible":true, 49 + "width":100.250626566416, 50 + "x":214.53634085213, 51 + "y":172.431077694236 52 + }], 53 + "opacity":1, 54 + "type":"objectgroup", 55 + "visible":true, 56 + "x":0, 57 + "y":0 58 + }, 59 + { 60 + "id":3, 61 + "image":"", 62 + "name":"Image Layer 1", 63 + "opacity":1, 64 + "type":"imagelayer", 65 + "visible":true, 66 + "x":0, 67 + "y":0 68 + }], 69 + "nextlayerid":4, 70 + "nextobjectid":3, 71 + "orientation":"orthogonal", 72 + "renderorder":"right-down", 73 + "tiledversion":"1.11.2", 74 + "tileheight":32, 75 + "tilesets":[ 76 + { 77 + "firstgid":1, 78 + "source":"src\/test\/source_tileset.tsj" 79 + }, 80 + { 81 + "firstgid":1037, 82 + "source":"src\/test\/images_tileset.tsj" 83 + }], 84 + "tilewidth":32, 85 + "type":"map", 86 + "version":"1.10", 87 + "width":30 88 + }
+88
src/test/map-base64-zlib.tmj
··· 1 + { "class":"bar", 2 + "compressionlevel":-1, 3 + "height":30, 4 + "infinite":false, 5 + "layers":[ 6 + { 7 + "class":"bar", 8 + "compression":"zlib", 9 + "data":"eJztwTEBAAAIwKAF8LF\/WYMIbDUBAADwzQGlvwAe", 10 + "encoding":"base64", 11 + "height":30, 12 + "id":1, 13 + "name":"Tile Layer 1", 14 + "opacity":1, 15 + "type":"tilelayer", 16 + "visible":true, 17 + "width":30, 18 + "x":0, 19 + "y":0 20 + }, 21 + { 22 + "draworder":"topdown", 23 + "id":2, 24 + "name":"Object Layer 1", 25 + "objects":[ 26 + { 27 + "height":19, 28 + "id":1, 29 + "name":"", 30 + "rotation":0, 31 + "text": 32 + { 33 + "text":"Hello World", 34 + "wrap":true 35 + }, 36 + "type":"", 37 + "visible":true, 38 + "width":91.4375, 39 + "x":70, 40 + "y":44.6353383458647 41 + }, 42 + { 43 + "height":84.2105263157895, 44 + "id":2, 45 + "name":"", 46 + "rotation":0, 47 + "type":"", 48 + "visible":true, 49 + "width":100.250626566416, 50 + "x":214.53634085213, 51 + "y":172.431077694236 52 + }], 53 + "opacity":1, 54 + "type":"objectgroup", 55 + "visible":true, 56 + "x":0, 57 + "y":0 58 + }, 59 + { 60 + "id":3, 61 + "image":"", 62 + "name":"Image Layer 1", 63 + "opacity":1, 64 + "type":"imagelayer", 65 + "visible":true, 66 + "x":0, 67 + "y":0 68 + }], 69 + "nextlayerid":4, 70 + "nextobjectid":3, 71 + "orientation":"orthogonal", 72 + "renderorder":"right-down", 73 + "tiledversion":"1.11.2", 74 + "tileheight":32, 75 + "tilesets":[ 76 + { 77 + "firstgid":1, 78 + "source":"src\/test\/source_tileset.tsj" 79 + }, 80 + { 81 + "firstgid":1037, 82 + "source":"src\/test\/images_tileset.tsj" 83 + }], 84 + "tilewidth":32, 85 + "type":"map", 86 + "version":"1.10", 87 + "width":30 88 + }
+88
src/test/map-base64-zstd.tmj
··· 1 + { "class":"bar", 2 + "compressionlevel":-1, 3 + "height":30, 4 + "infinite":false, 5 + "layers":[ 6 + { 7 + "class":"bar", 8 + "compression":"zstd", 9 + "data":"KLUv\/WAQDW0AADARAAAADAABAAf2QRE=", 10 + "encoding":"base64", 11 + "height":30, 12 + "id":1, 13 + "name":"Tile Layer 1", 14 + "opacity":1, 15 + "type":"tilelayer", 16 + "visible":true, 17 + "width":30, 18 + "x":0, 19 + "y":0 20 + }, 21 + { 22 + "draworder":"topdown", 23 + "id":2, 24 + "name":"Object Layer 1", 25 + "objects":[ 26 + { 27 + "height":19, 28 + "id":1, 29 + "name":"", 30 + "rotation":0, 31 + "text": 32 + { 33 + "text":"Hello World", 34 + "wrap":true 35 + }, 36 + "type":"", 37 + "visible":true, 38 + "width":91.4375, 39 + "x":70, 40 + "y":44.6353383458647 41 + }, 42 + { 43 + "height":84.2105263157895, 44 + "id":2, 45 + "name":"", 46 + "rotation":0, 47 + "type":"", 48 + "visible":true, 49 + "width":100.250626566416, 50 + "x":214.53634085213, 51 + "y":172.431077694236 52 + }], 53 + "opacity":1, 54 + "type":"objectgroup", 55 + "visible":true, 56 + "x":0, 57 + "y":0 58 + }, 59 + { 60 + "id":3, 61 + "image":"", 62 + "name":"Image Layer 1", 63 + "opacity":1, 64 + "type":"imagelayer", 65 + "visible":true, 66 + "x":0, 67 + "y":0 68 + }], 69 + "nextlayerid":4, 70 + "nextobjectid":3, 71 + "orientation":"orthogonal", 72 + "renderorder":"right-down", 73 + "tiledversion":"1.11.2", 74 + "tileheight":32, 75 + "tilesets":[ 76 + { 77 + "firstgid":1, 78 + "source":"src\/test\/source_tileset.tsj" 79 + }, 80 + { 81 + "firstgid":1037, 82 + "source":"src\/test\/images_tileset.tsj" 83 + }], 84 + "tilewidth":32, 85 + "type":"map", 86 + "version":"1.10", 87 + "width":30 88 + }
+41
src/test/map-csv.tmj
··· 1 + { "compressionlevel":-1, 2 + "height":5, 3 + "infinite":false, 4 + "layers":[ 5 + { 6 + "class":"bar", 7 + "data":[10, 15, 5, 3221225478, 1073741830, 8 + 5, 5, 5, 2147483654, 6, 9 + 3221225475, 1073741827, 5, 5, 5, 10 + 2147483651, 3, 5, 15, 16, 11 + 5, 5, 5, 16, 11], 12 + "height":5, 13 + "id":1, 14 + "name":"base64-ground", 15 + "opacity":1, 16 + "type":"tilelayer", 17 + "visible":true, 18 + "width":5, 19 + "x":0, 20 + "y":0 21 + }], 22 + "nextlayerid":2, 23 + "nextobjectid":1, 24 + "orientation":"orthogonal", 25 + "renderorder":"right-down", 26 + "tiledversion":"1.10.2", 27 + "tileheight":8, 28 + "tilesets":[ 29 + { 30 + "firstgid":1, 31 + "source":"src\/test\/source_tileset.tsj" 32 + }, 33 + { 34 + "firstgid":1037, 35 + "source":"src\/test\/images_tileset.tsj" 36 + }], 37 + "tilewidth":8, 38 + "type":"map", 39 + "version":"1.10", 40 + "width":5 41 + }
+137
src/test/map-infinite-base64-zstd.tmj
··· 1 + { "class":"bar", 2 + "compressionlevel":-1, 3 + "height":30, 4 + "infinite":true, 5 + "layers":[ 6 + { 7 + "chunks":[ 8 + { 9 + "data":"KLUv\/WAAA9UGAPLFDxPAJR3\/v+v\/N\/1v7iZkS5mLRlcKP\/0tQiBieEGG8GMICH4MPzYOmGJNQOVq5aaGbEmZttVhSeHUaB2RrH7+FVeooLhlDoCCGaoyDxGQhJYSEFVFbbUcm4S4\/zC+1IopmU\/wPW1YdH8THhx4e8zYoeYLWfd+\/yFv\/Fod+L5mxuF\/X6oPaz\/UozixnBL+ZPfLGts0fY52QV\/AjX2rjgjX+Ags9rs7voEFYm2abNBRqMnswvxgNq6UC\/co\/efu+5ldPHd43rLv+aGhPPgAz\/QczylL5tdg5gqn", 10 + "height":16, 11 + "width":16, 12 + "x":0, 13 + "y":0 14 + }, 15 + { 16 + "data":"KLUv\/WAAA80GAHKECw\/gaQwAIABQYJJJpjQkngI88BOQ6uvWSdXibJAo7pq11qIPts0JBskYK0OSJXlhqNC44XCCkak7DxGgiECShKgWxJY5v59BPzPfmxfuVoU9TdRy8Onzd4QOmw7JvPYnCmAY3ZAvRZcH43ZHDPllarkdzvPQg4a5IfFJc5yOEIec8Ui+mg18NPthM60tgTyyd6XeXz19Hsz0eFAHIF4XPAn3d53gj0\/2bCHcHrv7MC\/3xqNSfs4D3aTNOiAP8HstjnS45vrC+84HcMRY4rNb04PsbNJQkAE=", 17 + "height":16, 18 + "width":16, 19 + "x":16, 20 + "y":0 21 + }, 22 + { 23 + "data":"KLUv\/WAAA7UGACKECw\/gGQ4AoKAGHsqUpEw3Hyk2RxbCkZhs\/pVpXz7QjKkRbIyqLUWs7b5MgfDYRgFYqND4YlCCIURpHhIAEkBgrGEAUTCvuf5\/B5070Y5yrvUw3SjPgje6q9+wPTUdHb0F+YTtaAbG9wB0xUUOtxfrNUk70nPsnA68ilkrdudLbPKZD3DTlEGP95KHzQb+oqO9twvrmY+UwTEjHyg3iGboEx+7k5zzR34v2tHz6Cl2t\/t8Ocx1t99FTcWJ\/PfMzOi7dFT++cH9Yk8+0zsXT11wAPgMmCk=", 24 + "height":16, 25 + "width":16, 26 + "x":0, 27 + "y":16 28 + }, 29 + { 30 + "data":"KLUv\/WAAA10HAEJFDxawJekMAzgASZKDOAzo5JZ7791AzNoULZINBgdQZ4K5jr+iy6TIkbZjUaCjIHAukXTY4e+XPzD8\/PWTfgtbqPF5C+2\/AWCCQlNWHhKgRARsjSiUEUkKYsv+3wGdmkGHgRF9Gqs0D74bPO730c0fJr8HsZVh+fwF8Y98wTaHqT1D+3uMfSfkirM\/SDYK43DvMsLLd4lvsfVbBzPv5K\/\/Wwx0Zlv8Q2vYDaLC9GeeizrXHSrOjo2Pg78PGFr7PJEPDScnD+7LMoy9m7c9Xw\/GxIL\/9VzLX\/WhLaoJh9naWj7q4JXnt9iloAY=", 31 + "height":16, 32 + "width":16, 33 + "x":16, 34 + "y":16 35 + }], 36 + "class":"bar", 37 + "compression":"zstd", 38 + "encoding":"base64", 39 + "height":32, 40 + "id":1, 41 + "name":"ground", 42 + "opacity":1, 43 + "startx":0, 44 + "starty":0, 45 + "type":"tilelayer", 46 + "visible":true, 47 + "width":32, 48 + "x":0, 49 + "y":0 50 + }, 51 + { 52 + "draworder":"topdown", 53 + "id":2, 54 + "name":"objects", 55 + "objects":[ 56 + { 57 + "height":16, 58 + "id":1, 59 + "name":"pool", 60 + "rotation":0, 61 + "type":"", 62 + "visible":true, 63 + "width":16, 64 + "x":88, 65 + "y":96 66 + }, 67 + { 68 + "height":20, 69 + "id":2, 70 + "name":"", 71 + "rotation":0, 72 + "text": 73 + { 74 + "color":"#241f31", 75 + "fontfamily":"Serif", 76 + "text":"tmz", 77 + "wrap":true 78 + }, 79 + "type":"", 80 + "visible":true, 81 + "width":30, 82 + "x":70, 83 + "y":16 84 + }], 85 + "opacity":1, 86 + "type":"objectgroup", 87 + "visible":true, 88 + "x":0, 89 + "y":0 90 + }, 91 + { 92 + "id":3, 93 + "image":"tiles.png", 94 + "name":"tile_image", 95 + "offsetx":1, 96 + "offsety":1, 97 + "opacity":1, 98 + "type":"imagelayer", 99 + "visible":true, 100 + "x":0, 101 + "y":0 102 + }], 103 + "nextlayerid":4, 104 + "nextobjectid":3, 105 + "orientation":"orthogonal", 106 + "properties":[ 107 + { 108 + "name":"beautiful", 109 + "type":"bool", 110 + "value":true 111 + }], 112 + "renderorder":"right-down", 113 + "tiledversion":"1.11.2", 114 + "tileheight":8, 115 + "tilesets":[ 116 + { 117 + "firstgid":1, 118 + "source":"src\/test\/source_tileset.tsj" 119 + }, 120 + { 121 + "columns":78, 122 + "firstgid":1037, 123 + "image":"tilemap.png", 124 + "imageheight":475, 125 + "imagewidth":628, 126 + "margin":0, 127 + "name":"embedded_tiles", 128 + "spacing":0, 129 + "tilecount":4602, 130 + "tileheight":8, 131 + "tilewidth":8 132 + }], 133 + "tilewidth":8, 134 + "type":"map", 135 + "version":"1.10", 136 + "width":32 137 + }
+195
src/test/map-infinite-csv.tmj
··· 1 + { "class":"bar", 2 + "compressionlevel":-1, 3 + "height":30, 4 + "infinite":true, 5 + "layers":[ 6 + { 7 + "chunks":[ 8 + { 9 + "data":[16, 11, 16, 16, 16, 16, 16, 16, 10, 10, 16, 14, 16, 16, 10, 16, 10 + 16, 11, 11, 13, 14, 10, 11, 12, 16, 11, 11, 10, 13, 14, 13, 16, 11 + 16, 14, 13, 10, 12, 16, 16, 11, 10, 16, 9, 13, 11, 11, 10, 16, 12 + 10, 16, 16, 9, 13, 9, 15, 9, 14, 15, 9, 12, 13, 11, 13, 14, 13 + 11, 9, 14, 9, 9, 9, 13, 12, 9, 13, 10, 16, 9, 16, 9, 12, 14 + 13, 16, 12, 9, 12, 9, 12, 9, 9, 9, 12, 11, 16, 9, 16, 15, 15 + 12, 11, 14, 9, 16, 11, 10, 16, 12, 16, 9, 16, 12, 14, 16, 11, 16 + 14, 11, 14, 15, 11, 9, 9, 13, 9, 13, 16, 16, 14, 16, 13, 16, 17 + 9, 11, 9, 10, 14, 9, 9, 11, 13, 9, 13, 13, 16, 16, 9, 12, 18 + 12, 9, 10, 10, 11, 16, 16, 10, 9, 10, 10, 12, 9, 13, 10, 11, 19 + 11, 16, 12, 16, 14, 13, 16, 1073741834, 9, 15, 9, 12, 16, 12, 9, 9, 20 + 11, 11, 15, 16, 13, 9, 9, 13, 11, 13, 5, 5, 5, 5, 10, 13, 21 + 16, 11, 9, 13, 10, 10, 16, 14, 10, 15, 5, 3221225478, 1073741830, 5, 13, 10, 22 + 16, 13, 14, 13, 16, 9, 14, 5, 5, 5, 5, 2147483654, 6, 5, 10, 12, 23 + 16, 9, 9, 14, 16, 9, 14, 5, 3221225475, 1073741827, 5, 5, 5, 5, 12, 11, 24 + 16, 9, 14, 11, 9, 13, 10, 5, 2147483651, 3, 5, 15, 16, 10, 12, 13], 25 + "height":16, 26 + "width":16, 27 + "x":0, 28 + "y":0 29 + }, 30 + { 31 + "data":[16, 16, 16, 16, 9, 10, 16, 16, 16, 11, 11, 10, 12, 16, 11, 9, 32 + 16, 16, 16, 11, 15, 12, 16, 16, 9, 16, 3221225487, 3221225487, 16, 16, 16, 9, 33 + 9, 16, 11, 16, 13, 15, 15, 15, 9, 3221225487, 3221225487, 16, 3221225487, 11, 16, 16, 34 + 14, 10, 13, 15, 14, 11, 14, 3221225487, 14, 16, 16, 10, 10, 12, 16, 16, 35 + 11, 14, 12, 9, 12, 9, 13, 16, 16, 10, 14, 16, 9, 9, 11, 16, 36 + 13, 12, 13, 16, 12, 14, 9, 9, 12, 2, 2, 2, 9, 9, 14, 16, 37 + 12, 9, 13, 12, 2, 2, 2, 2, 2, 2, 16, 16, 2, 9, 16, 9, 38 + 10, 12, 11, 13, 2, 14, 12, 2, 2, 11, 16, 11, 2, 9, 15, 9, 39 + 12, 16, 14, 2, 2, 9, 10, 2, 2, 16, 10, 13, 2, 12, 15, 16, 40 + 10, 10, 11, 14, 2, 16, 9, 14, 13, 14, 14, 2, 2, 14, 9, 16, 41 + 9, 12, 16, 13, 2, 14, 9, 9, 11, 11, 16, 2, 9, 9, 11, 16, 42 + 9, 16, 14, 15, 2, 2, 13, 12, 14, 16, 2, 2, 16, 14, 9, 11, 43 + 14, 11, 10, 10, 11, 2, 9, 13, 16, 2, 2, 9, 14, 14, 9, 16, 44 + 9, 13, 12, 9, 9, 2, 2, 9, 9, 2, 10, 13, 9, 16, 15, 12, 45 + 13, 10, 16, 2147483663, 11, 15, 2, 2, 2, 2, 13, 16, 16, 12, 16, 14, 46 + 16, 9, 16, 2147483663, 16, 9, 11, 2, 2, 11, 15, 12, 14, 9, 16, 9], 47 + "height":16, 48 + "width":16, 49 + "x":16, 50 + "y":0 51 + }, 52 + { 53 + "data":[16, 16, 9, 9, 15, 3221225487, 16, 5, 5, 5, 5, 16, 11, 11, 13, 15, 54 + 12, 12, 15, 13, 14, 3221225487, 2147483663, 16, 16, 12, 10, 16, 16, 2147483663, 12, 9, 55 + 14, 10, 14, 9, 12, 12, 16, 2147483663, 11, 13, 14, 12, 2147483663, 9, 16, 1073741834, 56 + 12, 10, 12, 12, 9, 16, 9, 2147483663, 15, 16, 10, 14, 10, 11, 16, 16, 57 + 16, 12, 16, 10, 16, 16, 9, 12, 14, 12, 14, 9, 14, 10, 14, 9, 58 + 13, 9, 16, 9, 16, 16, 9, 13, 11, 11, 16, 14, 10, 3221225483, 15, 9, 59 + 13, 10, 10, 9, 16, 9, 16, 11, 10, 13, 12, 16, 2147483663, 11, 15, 11, 60 + 16, 11, 9, 9, 12, 14, 11, 16, 9, 16, 9, 10, 13, 10, 13, 13, 61 + 16, 11, 12, 11, 10, 13, 13, 10, 10, 9, 12, 15, 16, 12, 9, 11, 62 + 16, 11, 10, 9, 11, 15, 10, 15, 10, 11, 16, 10, 13, 15, 14, 3221225487, 63 + 16, 9, 13, 11, 9, 11, 14, 14, 9, 16, 16, 16, 16, 12, 11, 14, 64 + 16, 11, 9, 12, 16, 16, 9, 9, 14, 16, 16, 14, 15, 10, 10, 15, 65 + 12, 15, 11, 16, 9, 13, 16, 15, 14, 15, 12, 13, 13, 13, 14, 10, 66 + 16, 16, 16, 10, 12, 16, 16, 10, 13, 10, 14, 10, 10, 14, 13, 16, 67 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 69 + "height":16, 70 + "width":16, 71 + "x":0, 72 + "y":16 73 + }, 74 + { 75 + "data":[13, 11, 11, 13, 14, 12, 2147483658, 2, 9, 2147483663, 2147483663, 11, 16, 9, 15, 9, 76 + 14, 9, 10, 11, 16, 11, 9, 12, 14, 9, 9, 11, 11, 11, 16, 9, 77 + 12, 14, 11, 12, 11, 16, 10, 2147483658, 2147483658, 9, 15, 10, 16, 9, 14, 16, 78 + 34, 34, 34, 34, 34, 14, 10, 2147483663, 2147483658, 14, 11, 10, 11, 9, 15, 9, 79 + 34, 3221225511, 3221225511, 3221225511, 34, 16, 2147483663, 10, 2147483658, 16, 11, 16, 16, 16, 11, 9, 80 + 34, 3221225511, 34, 3221225511, 34, 9, 9, 10, 9, 11, 16, 16, 16, 16, 9, 10, 81 + 34, 3221225511, 3221225511, 3221225511, 34, 14, 16, 9, 14, 14, 16, 16, 16, 11, 12, 13, 82 + 34, 34, 34, 34, 34, 9, 13, 13, 9, 9, 12, 9, 13, 16, 12, 11, 83 + 16, 10, 11, 14, 11, 15, 10, 12, 16, 16, 16, 3221225487, 3221225487, 16, 13, 15, 84 + 13, 15, 12, 9, 13, 10, 16, 10, 9, 9, 16, 8, 8, 8, 8, 8, 85 + 13, 14, 13, 12, 15, 13, 12, 12, 16, 16, 9, 8, 1, 1, 1, 1, 86 + 15, 10, 13, 12, 14, 15, 16, 16, 3221225483, 3221225483, 3221225483, 8, 1, 1073741825, 1073741825, 1, 87 + 9, 15, 9, 13, 11, 13, 9, 10, 3221225487, 3221225487, 11, 8, 1, 1073741825, 1073741825, 1, 88 + 14, 9, 14, 12, 16, 13, 16, 16, 14, 9, 9, 8, 1, 1073741825, 1073741825, 1, 89 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 90 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 91 + "height":16, 92 + "width":16, 93 + "x":16, 94 + "y":16 95 + }], 96 + "class":"bar", 97 + "height":32, 98 + "id":1, 99 + "name":"ground", 100 + "opacity":1, 101 + "startx":0, 102 + "starty":0, 103 + "type":"tilelayer", 104 + "visible":true, 105 + "width":32, 106 + "x":0, 107 + "y":0 108 + }, 109 + { 110 + "draworder":"topdown", 111 + "id":2, 112 + "name":"objects", 113 + "objects":[ 114 + { 115 + "height":16, 116 + "id":1, 117 + "name":"pool", 118 + "rotation":0, 119 + "type":"", 120 + "visible":true, 121 + "width":16, 122 + "x":88, 123 + "y":96 124 + }, 125 + { 126 + "height":20, 127 + "id":2, 128 + "name":"", 129 + "rotation":0, 130 + "text": 131 + { 132 + "color":"#241f31", 133 + "fontfamily":"Serif", 134 + "text":"tmz", 135 + "wrap":true 136 + }, 137 + "type":"", 138 + "visible":true, 139 + "width":30, 140 + "x":70, 141 + "y":16 142 + }], 143 + "opacity":1, 144 + "type":"objectgroup", 145 + "visible":true, 146 + "x":0, 147 + "y":0 148 + }, 149 + { 150 + "id":3, 151 + "image":"tiles.png", 152 + "name":"tile_image", 153 + "offsetx":1, 154 + "offsety":1, 155 + "opacity":1, 156 + "type":"imagelayer", 157 + "visible":true, 158 + "x":0, 159 + "y":0 160 + }], 161 + "nextlayerid":4, 162 + "nextobjectid":3, 163 + "orientation":"orthogonal", 164 + "properties":[ 165 + { 166 + "name":"beautiful", 167 + "type":"bool", 168 + "value":true 169 + }], 170 + "renderorder":"right-down", 171 + "tiledversion":"1.10.2", 172 + "tileheight":8, 173 + "tilesets":[ 174 + { 175 + "firstgid":1, 176 + "source":"src/test/source_tileset.tsj" 177 + }, 178 + { 179 + "columns":4, 180 + "firstgid":17, 181 + "image":"tiles.png", 182 + "imageheight":32, 183 + "imagewidth":32, 184 + "margin":0, 185 + "name":"embedded_tiles", 186 + "spacing":0, 187 + "tilecount":16, 188 + "tileheight":8, 189 + "tilewidth":8 190 + }], 191 + "tilewidth":8, 192 + "type":"map", 193 + "version":"1.10", 194 + "width":32 195 + }
+115
src/test/map.tmj
··· 1 + { "class":"bar", 2 + "compressionlevel":-1, 3 + "height":30, 4 + "infinite":false, 5 + "layers":[ 6 + { 7 + "class":"bar", 8 + "data":[17, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 9 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 11 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 13 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 14 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 15 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 16 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 18 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 21 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 22 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 24 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 25 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 26 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 27 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 34 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 35 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 36 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 38 + "height":30, 39 + "id":1, 40 + "name":"Tile Layer 1", 41 + "opacity":1, 42 + "type":"tilelayer", 43 + "visible":true, 44 + "width":30, 45 + "x":0, 46 + "y":0 47 + }, 48 + { 49 + "draworder":"topdown", 50 + "id":2, 51 + "name":"Object Layer 1", 52 + "objects":[ 53 + { 54 + "height":19, 55 + "id":1, 56 + "name":"hello", 57 + "rotation":0, 58 + "text": 59 + { 60 + "text":"Hello World", 61 + "wrap":true 62 + }, 63 + "type":"hello_world", 64 + "visible":true, 65 + "width":91.4375, 66 + "x":70, 67 + "y":44 68 + }, 69 + { 70 + "height":84.2105263157895, 71 + "id":2, 72 + "name":"", 73 + "rotation":0, 74 + "type":"", 75 + "visible":true, 76 + "width":100.250626566416, 77 + "x":214.53634085213, 78 + "y":172.431077694236 79 + }], 80 + "opacity":1, 81 + "type":"objectgroup", 82 + "visible":true, 83 + "x":0, 84 + "y":0 85 + }, 86 + { 87 + "id":3, 88 + "image":"", 89 + "name":"Image Layer 1", 90 + "opacity":1, 91 + "type":"imagelayer", 92 + "visible":true, 93 + "x":0, 94 + "y":0 95 + }], 96 + "nextlayerid":4, 97 + "nextobjectid":3, 98 + "orientation":"orthogonal", 99 + "renderorder":"right-down", 100 + "tiledversion":"1.11.2", 101 + "tileheight":32, 102 + "tilesets":[ 103 + { 104 + "firstgid":1, 105 + "source":"src\/test\/source_tileset.tsj" 106 + }, 107 + { 108 + "firstgid":1037, 109 + "source":"src\/test\/images_tileset.tsj" 110 + }], 111 + "tilewidth":32, 112 + "type":"map", 113 + "version":"1.10", 114 + "width":30 115 + }
+68
src/test/object_layer.json
··· 12 12 "text": "Hello World", 13 13 "wrap": true 14 14 }, 15 + "type": "hello", 16 + "visible": true, 17 + "width": 91.4375, 18 + "x": 70, 19 + "y": 44.6353383458647 20 + }, 21 + { 22 + "gid":16403, 23 + "height":48, 24 + "id":2, 25 + "name":"", 26 + "rotation":0, 27 + "type":"player", 28 + "visible":true, 29 + "width":32, 30 + "x":55.2142976793752, 31 + "y":183.914075980747 32 + }, 33 + { 34 + "height": 19, 35 + "id": 3, 36 + "ellipse": true, 37 + "name": "", 38 + "rotation": 0, 15 39 "type": "", 16 40 "visible": true, 17 41 "width": 91.4375, 18 42 "x": 70, 19 43 "y": 44.6353383458647 44 + }, 45 + { 46 + "height":0, 47 + "id":8, 48 + "name":"polygon", 49 + "polygon":[ 50 + { 51 + "x":0, 52 + "y":0 53 + }, 54 + { 55 + "x":52.043665905052, 56 + "y":49.5049504950495 57 + }, 58 + { 59 + "x":77.4308200050775, 60 + "y":-8.8855039350089 61 + }], 62 + "rotation":0, 63 + "type":"", 64 + "visible":true, 65 + "width":0, 66 + "x":88.8550393500889, 67 + "y":248.794110180249 68 + }, 69 + { 70 + "height":0, 71 + "id":9, 72 + "name":"", 73 + "polyline":[ 74 + { 75 + "x":0, 76 + "y":0 77 + }, 78 + { 79 + "x":58.3904544300584, 80 + "y":77.4308200050774 81 + }], 82 + "rotation":0, 83 + "type":"", 84 + "visible":true, 85 + "width":0, 86 + "x":302.107133790302, 87 + "y":126.935770500127 20 88 } 21 89 ], 22 90 "opacity": 1,
+11 -1
src/tmz.zig
··· 1 - pub const Property = @import("property.zig").Property; 1 + pub const Map = map.Map; 2 + pub const loadMapFromSlice = Map.initFromSlice; 3 + pub const loadMapFromFile = Map.initFromFile; 2 4 3 5 pub const Tileset = tileset.Tileset; 4 6 pub const Tile = tileset.Tile; 5 7 pub const loadTilesetFromSlice = Tileset.initFromSlice; 6 8 pub const loadTilesetFromFile = Tileset.initFromFile; 9 + 10 + pub const Layer = layer.Layer; 11 + pub const TileLayer = layer.TileLayer; 12 + pub const Object = layer.Object; 13 + pub const ObjectGroup = layer.ObjectGroup; 14 + 15 + pub const Property = @import("property.zig").Property; 7 16 8 17 pub const Color = packed struct(u32) { 9 18 a: u8 = 0, ··· 137 146 const ParseOptions = std.json.ParseOptions; 138 147 const Value = std.json.Value; 139 148 149 + const map = @import("map.zig"); 140 150 const tileset = @import("tileset.zig"); 141 151 const layer = @import("layer.zig");