From 88c2ba01e27176b0c5f9f49478d1c03ecb7171b3 Mon Sep 17 00:00:00 2001 From: Insality Date: Wed, 24 Dec 2025 16:22:04 +0200 Subject: [PATCH 01/71] Add support for hex and iso grids from tiled tile layers --- detiled/internal/detiled_decore.lua | 40 ++++-- detiled/internal/grid.lua | 76 ++++++++++ detiled/internal/hexgrid.lua | 87 ++++++++++++ .../hexgrid/hexgrid_convertations.lua | 134 ++++++++++++++++++ detiled/internal/isogrid.lua | 81 +++++++++++ 5 files changed, 404 insertions(+), 14 deletions(-) create mode 100644 detiled/internal/grid.lua create mode 100644 detiled/internal/hexgrid.lua create mode 100644 detiled/internal/hexgrid/hexgrid_convertations.lua create mode 100644 detiled/internal/isogrid.lua diff --git a/detiled/internal/detiled_decore.lua b/detiled/internal/detiled_decore.lua index a792fdb..25e8f3c 100644 --- a/detiled/internal/detiled_decore.lua +++ b/detiled/internal/detiled_decore.lua @@ -2,9 +2,26 @@ local detiled_internal = require("detiled.internal.detiled_internal") local logger = require("detiled.internal.detiled_logger") local base64 = require("detiled.internal.base64") +local grid = require("detiled.internal.grid") +local isogrid = require("detiled.internal.isogrid") +local hexgrid = require("detiled.internal.hexgrid") + local M = {} +---@param map detiled.map +---@return table +local function get_grid_module(map) + if map.orientation == "hexagonal" then + return hexgrid + elseif map.orientation == "staggered" then + return isogrid + else + return grid + end +end + + ---@param layer detiled.map.layer ---@param map detiled.map ---@return decore.entities_pack_data.instance[] @@ -12,7 +29,11 @@ local function get_entities_from_tile_layer(layer, map) ---@type decore.entities_pack_data.instance[] local entities = {} - local map_height = map.height * map.tileheight + local grid_module = get_grid_module(map) + local map_params = grid_module.get_map_params_from_tiled(map) + + local map_width = map_params.scene.size_x + local map_height = map_params.scene.size_y local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 local layer_data = layer.data @@ -38,21 +59,12 @@ local function get_entities_from_tile_layer(layer, map) local tile_gid = layer_data[tile_index] local tile, tileset = detiled_internal.get_tile_by_gid(map, tile_gid) if tile and tileset then - -- TODO: This works only for grid based maps, for isometric or hex we need to use another approach local tile_i = ((tile_index - 1) % map.width) local tile_j = (math.floor((tile_index - 1) / map.width)) - local pos_x = tile_i * map.tilewidth - local pos_y = tile_j * map.tileheight - - -- Center the tile position (tiles are positioned at their center, not top-left corner) - pos_x = pos_x + map.tilewidth / 2 - pos_y = pos_y + map.tileheight / 2 - - -- Apply the same coordinate transformation as objects - local map_width = map.width * map.tilewidth - pos_y = map_height - pos_y -- Flip Y axis - pos_x = pos_x - map_width / 2 -- Center X relative to map center - pos_y = pos_y - map_height / 2 -- Center Y relative to map center + local pos_x, pos_y = grid_module.cell_to_pos(tile_i, tile_j, map_params) + + pos_x = pos_x - map_width / 2 + pos_y = pos_y - map_height / 2 local prefab_id = tile.class or tile.type if not prefab_id or prefab_id == "" then diff --git a/detiled/internal/grid.lua b/detiled/internal/grid.lua new file mode 100644 index 0000000..51ad430 --- /dev/null +++ b/detiled/internal/grid.lua @@ -0,0 +1,76 @@ +local M = {} + + +local function get_scene_size(map_params) + local data = map_params + + local width = data.scene.tiles_x * data.tile.width + local height = data.scene.tiles_y * data.tile.height + return width, height +end + + +---@param tiled_data detiled.map +---@return table +function M.get_map_params_from_tiled(tiled_data) + local map_params = {} + map_params.tile = { + width = tiled_data.tilewidth, + height = tiled_data.tileheight, + } + map_params.scene = { + invert_y = true, + tiles_x = tiled_data.width, + tiles_y = tiled_data.height, + size_x = 0, + size_y = 0, + } + + local size_x, size_y = get_scene_size(map_params) + map_params.scene.size_x = size_x + map_params.scene.size_y = size_y + + return map_params +end + + +---@param i number +---@param j number +---@param map_params table +---@return number, number +function M.cell_to_pos(i, j, map_params) + local data = map_params + + local x = data.tile.width * i + local y = data.tile.height * j + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + x = x + data.tile.width/2 + y = y + (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) + + return x, y +end + + +---@param i number +---@param j number +---@param z_layer number|nil +---@param map_params table +---@return number, number, number +function M.get_tile_pos(i, j, z_layer, map_params) + z_layer = z_layer or 0 + local x, y = M.cell_to_pos(i, j, map_params) + + local y_value = (y - z_layer * 100000) + y_value = map_params.scene.size_y - y_value + local z_pos = y_value / 100000 + + return x, y, z_pos +end + + +return M + diff --git a/detiled/internal/hexgrid.lua b/detiled/internal/hexgrid.lua new file mode 100644 index 0000000..a9ac86a --- /dev/null +++ b/detiled/internal/hexgrid.lua @@ -0,0 +1,87 @@ +local hexgrid_convert = require("detiled.internal.hexgrid.hexgrid_convertations") + +local M = {} + +local HEXMAP_TYPE = { + POINTYTOP = "pointytop", + FLATTOP = "flattop", +} + + +local function get_scene_size(map_params) + local data = map_params + + local double_size = data.tile.height + data.tile.side + + local width = (data.scene.tiles_x+0.5) * data.tile.width + local height = (data.scene.tiles_y/2 * double_size) + (data.tile.height-data.tile.side)/2 + return width, height +end + + +---@param tiled_data detiled.map +---@return table +function M.get_map_params_from_tiled(tiled_data) + local hexmap_type = HEXMAP_TYPE.POINTYTOP + if tiled_data.staggeraxis == "x" then + hexmap_type = HEXMAP_TYPE.FLATTOP + end + + local map_params = {} + map_params.tile = { + width = tiled_data.tilewidth, + height = tiled_data.tileheight, + side = tiled_data.hexsidelength or 0, + } + map_params.scene = { + invert_y = true, + tiles_x = tiled_data.width, + tiles_y = tiled_data.height, + size_x = 0, + size_y = 0, + hexmap_type = hexmap_type, + } + + local size_x, size_y = get_scene_size(map_params) + map_params.scene.size_x = size_x + map_params.scene.size_y = size_y + + return map_params +end + + +---@param i number +---@param j number +---@param map_params table +---@return number, number +function M.cell_to_pos(i, j, map_params) + if map_params.scene.hexmap_type == HEXMAP_TYPE.POINTYTOP then + return hexgrid_convert.cell_to_pos_pointytop(i, j, map_params) + end + if map_params.scene.hexmap_type == HEXMAP_TYPE.FLATTOP then + return hexgrid_convert.cell_to_pos_flattop(i, j, map_params) + end + + return 0, 0 +end + + +---@param i number +---@param j number +---@param z_layer number|nil +---@param map_params table +---@return number, number, number +function M.get_tile_pos(i, j, z_layer, map_params) + z_layer = z_layer or 0 + local x, y = M.cell_to_pos(i, j, map_params) + + local y_value = (y - z_layer * 100000) + y_value = map_params.scene.size_y - y_value + local z_pos = y_value / 100000 + + return x, y, z_pos +end + + +return M + diff --git a/detiled/internal/hexgrid/hexgrid_convertations.lua b/detiled/internal/hexgrid/hexgrid_convertations.lua new file mode 100644 index 0000000..c2fabb7 --- /dev/null +++ b/detiled/internal/hexgrid/hexgrid_convertations.lua @@ -0,0 +1,134 @@ +local M = {} + + +local function round(x) + return math.floor(x + 0.5) +end + + +function M.cell_to_pos_flattop(i, j, data) + local part_size = data.tile.width - data.tile.side + local two_hex_width = data.tile.width + data.tile.side + + local x = two_hex_width / 2 * i + local y = data.tile.height * (j + 0.5 * (bit.band(i, 1))) + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + x = x + part_size + y = y + (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) + + return x, y +end + + +function M.cell_to_pos_pointytop(i, j, data) + local part_size = data.tile.height - data.tile.side + local two_hex_height = data.tile.height + data.tile.side + + local x = data.tile.width * (i + 0.5 * (bit.band(j, 1))) + local y = two_hex_height / 2 * j + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + x = x + data.tile.width/2 + y = y + (data.scene.invert_y and -part_size or part_size) + + return x, y +end + + +function M.pos_to_cell_flattop(x, y, map_params) + local data = map_params + + local part_size = data.tile.width - data.tile.side + local two_hex_width = data.tile.width + data.tile.side + + x = x - part_size + y = y - (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + local i = round(2 * x / two_hex_width) + local j = round(y / data.tile.height - 0.5 * bit.band(i, 1)) + + return i, j +end + + +function M.pos_to_cell_pointytop(x, y, map_params) + local data = map_params + + local part_size = data.tile.height - data.tile.side + local two_hex_height = data.tile.height + data.tile.side + + x = x - data.tile.width/2 + y = y - (data.scene.invert_y and -part_size or part_size) + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + local j = round(2 * y / two_hex_height) + local i = round(x / data.tile.width - 0.5 * bit.band(j, 1)) + + return i, j +end + + +function M.cell_cube_to_pos_pointytop(i, j, k, map_params) + local offset_i, offset_j = M.cube_to_offset_pointytop(i, j, k, map_params) + return M.cell_to_pos_pointytop(offset_i, offset_j, map_params) +end + + +function M.cell_cube_to_pos_flattop(i, j, k, map_params) + local offset_i, offset_j = M.cube_to_offset_flattop(i, j, k, map_params) + return M.cell_to_pos_flattop(offset_i, offset_j, map_params) +end + + +function M.pos_to_cell_cube_pointytop(x, y, map_params) + local offset_i, offset_j = M.pos_to_cell_pointytop(x, y, map_params) + return M.offset_to_cube_pointytop(offset_i, offset_j, map_params) +end + + +function M.pos_to_cell_cube_flattop(x, y, map_params) + local offset_i, offset_j = M.pos_to_cell_flattop(x, y, map_params) + return M.offset_to_cube_flattop(offset_i, offset_j, map_params) +end + + +function M.cube_to_offset_pointytop(i, j, k, map_params) + return i + (k - bit.band(k, 1)) / 2, k +end + + +function M.cube_to_offset_flattop(i, j, k, map_params) + return i, k + (i - bit.band(i, 1)) / 2 +end + + +function M.offset_to_cube_pointytop(i, j, map_params) + local x = i - (j - bit.band(j, 1)) / 2 + + return x, -x - j, j +end + + +function M.offset_to_cube_flattop(i, j, map_params) + local z = j - (i - bit.band(i, 1)) / 2 + + return i, -i - z, z +end + + +return M + diff --git a/detiled/internal/isogrid.lua b/detiled/internal/isogrid.lua new file mode 100644 index 0000000..1000dbd --- /dev/null +++ b/detiled/internal/isogrid.lua @@ -0,0 +1,81 @@ +local M = {} + + +local function round(x) + return math.floor(x + 0.5) +end + + +local function get_scene_size(map_params) + local data = map_params + + local width = data.scene.tiles_x * data.tile.width + data.tile.width / 2 + local height = data.tile.height + ((data.scene.tiles_y - 1) * data.tile.height/2) + return width, height +end + + +---@param tiled_data detiled.map +---@return table +function M.get_map_params_from_tiled(tiled_data) + local map_params = {} + map_params.tile = { + width = tiled_data.tilewidth, + height = tiled_data.tileheight, + } + map_params.scene = { + invert_y = true, + tiles_x = tiled_data.width, + tiles_y = tiled_data.height, + size_x = 0, + size_y = 0, + } + + local size_x, size_y = get_scene_size(map_params) + map_params.scene.size_x = size_x + map_params.scene.size_y = size_y + + return map_params +end + + +---@param i number +---@param j number +---@param map_params table +---@return number, number +function M.cell_to_pos(i, j, map_params) + local data = map_params + + local x = data.tile.width * (i + 0.5 * (bit.band(j, 1))) + local y = data.tile.height/2 * j + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + x = x + data.tile.width/2 + y = y + (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) + + return x, y +end + + +---@param i number +---@param j number +---@param z_layer number|nil +---@param map_params table +---@return number, number, number +function M.get_tile_pos(i, j, z_layer, map_params) + z_layer = z_layer or 0 + local x, y = M.cell_to_pos(i, j, map_params) + + local y_value = (y - z_layer * 100000) + y_value = map_params.scene.size_y - y_value + local z_pos = y_value / 100000 + + return x, y, z_pos +end + + +return M + From 3e52d55994e10dc3d53bd1adace58df8c9020758 Mon Sep 17 00:00:00 2001 From: Insality Date: Wed, 24 Dec 2025 16:50:09 +0200 Subject: [PATCH 02/71] Update object positions --- detiled/internal/detiled_decore.lua | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/detiled/internal/detiled_decore.lua b/detiled/internal/detiled_decore.lua index 25e8f3c..efa8427 100644 --- a/detiled/internal/detiled_decore.lua +++ b/detiled/internal/detiled_decore.lua @@ -103,8 +103,11 @@ local function get_entities_from_object_layer(layer, map) ---@type decore.entities_pack_data.instance[] local entities = {} - local map_width = map.width * map.tilewidth - local map_height = map.height * map.tileheight + local grid_module = get_grid_module(map) + local map_params = grid_module.get_map_params_from_tiled(map) + + local map_width = map_params.scene.size_x + local map_height = map_params.scene.size_y local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or nil for object_index = 1, #layer.objects do @@ -116,7 +119,7 @@ local function get_entities_from_object_layer(layer, map) local tile, tileset = detiled_internal.get_tile_by_gid(map, object_gid) if tile and tileset then local entity = {} - local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, tile, map_width, map_height) + local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, tile, map_width, map_height, map_params) position_x = position_x + (layer.offsetx or 0) position_y = position_y - (layer.offsety or 0) @@ -182,7 +185,7 @@ local function get_entities_from_object_layer(layer, map) end elseif object.class and object.class ~= "" then -- If object is map-created-object and has a prefab to spawn instead local entity = {} - local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, nil, map_width, map_height) + local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, nil, map_width, map_height, map_params) --position_y = map_height - position_y position_x = position_x + (layer.offsetx or 0) position_y = position_y - (layer.offsety or 0) @@ -224,7 +227,7 @@ local function get_entities_from_object_layer(layer, map) table.insert(entities, entity) else -- Empty object from tiled without any prefabs - local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, nil, map_width, map_height) + local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, nil, map_width, map_height, map_params) position_x = position_x + (layer.offsetx or 0) position_y = position_y - (layer.offsety or 0) position_y = position_y - object.height @@ -316,8 +319,9 @@ end ---@param tile detiled.tileset.tile|nil ---@param map_width number|nil ---@param map_height number|nil +---@param map_params table|nil ---@return number, number, number, number -function M.get_defold_position_from_tiled_object(object, tile, map_width, map_height) +function M.get_defold_position_from_tiled_object(object, tile, map_width, map_height, map_params) map_height = map_height or 0 map_width = map_width or 0 @@ -375,7 +379,11 @@ function M.get_defold_position_from_tiled_object(object, tile, map_width, map_he rotated_offset_y = rotated_offset_y * scale_y local position_x = object.x + rotated_offset_x - local position_y = map_height - (object.y - rotated_offset_y) + local position_y = object.y - rotated_offset_y + + if map_params and map_params.scene.invert_y then + position_y = map_height - position_y + end -- Transform center from left bottom to center position_x = position_x - map_width / 2 From 9ddef2cbae170195527575c3e2992600499f6995 Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 25 Dec 2025 13:42:39 +0200 Subject: [PATCH 03/71] Fix for position z of objects --- detiled/internal/detiled_decore.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detiled/internal/detiled_decore.lua b/detiled/internal/detiled_decore.lua index efa8427..0a3cbb6 100644 --- a/detiled/internal/detiled_decore.lua +++ b/detiled/internal/detiled_decore.lua @@ -108,7 +108,7 @@ local function get_entities_from_object_layer(layer, map) local map_width = map_params.scene.size_x local map_height = map_params.scene.size_y - local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or nil + local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 for object_index = 1, #layer.objects do local object = layer.objects[object_index] From a9d3f6fd5257f98ee050500d935ba4b4ad1acd0c Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 29 Dec 2025 20:55:32 +0200 Subject: [PATCH 04/71] Update --- detiled/internal/detiled_annotations.lua | 2 ++ detiled/internal/detiled_decore.lua | 6 +++--- detiled/internal/{ => grid}/grid.lua | 0 detiled/internal/{ => grid}/hexgrid.lua | 2 +- .../internal/{hexgrid => grid}/hexgrid_convertations.lua | 0 detiled/internal/{ => grid}/isogrid.lua | 0 test/test_detiled.lua | 2 -- 7 files changed, 6 insertions(+), 6 deletions(-) rename detiled/internal/{ => grid}/grid.lua (100%) rename detiled/internal/{ => grid}/hexgrid.lua (95%) rename detiled/internal/{hexgrid => grid}/hexgrid_convertations.lua (100%) rename detiled/internal/{ => grid}/isogrid.lua (100%) diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 043713c..5cbe7f1 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -77,6 +77,8 @@ ---@field type string ---@field version string ---@field width number +---@field staggeraxis string +---@field hexsidelength number ---@class detiled.map.layer ---@field data number[] Global tile id diff --git a/detiled/internal/detiled_decore.lua b/detiled/internal/detiled_decore.lua index 0a3cbb6..311ef55 100644 --- a/detiled/internal/detiled_decore.lua +++ b/detiled/internal/detiled_decore.lua @@ -2,9 +2,9 @@ local detiled_internal = require("detiled.internal.detiled_internal") local logger = require("detiled.internal.detiled_logger") local base64 = require("detiled.internal.base64") -local grid = require("detiled.internal.grid") -local isogrid = require("detiled.internal.isogrid") -local hexgrid = require("detiled.internal.hexgrid") +local grid = require("detiled.internal.grid.grid") +local isogrid = require("detiled.internal.grid.isogrid") +local hexgrid = require("detiled.internal.grid.hexgrid") local M = {} diff --git a/detiled/internal/grid.lua b/detiled/internal/grid/grid.lua similarity index 100% rename from detiled/internal/grid.lua rename to detiled/internal/grid/grid.lua diff --git a/detiled/internal/hexgrid.lua b/detiled/internal/grid/hexgrid.lua similarity index 95% rename from detiled/internal/hexgrid.lua rename to detiled/internal/grid/hexgrid.lua index a9ac86a..8816125 100644 --- a/detiled/internal/hexgrid.lua +++ b/detiled/internal/grid/hexgrid.lua @@ -1,4 +1,4 @@ -local hexgrid_convert = require("detiled.internal.hexgrid.hexgrid_convertations") +local hexgrid_convert = require("detiled.internal.grid.hexgrid_convertations") local M = {} diff --git a/detiled/internal/hexgrid/hexgrid_convertations.lua b/detiled/internal/grid/hexgrid_convertations.lua similarity index 100% rename from detiled/internal/hexgrid/hexgrid_convertations.lua rename to detiled/internal/grid/hexgrid_convertations.lua diff --git a/detiled/internal/isogrid.lua b/detiled/internal/grid/isogrid.lua similarity index 100% rename from detiled/internal/isogrid.lua rename to detiled/internal/grid/isogrid.lua diff --git a/test/test_detiled.lua b/test/test_detiled.lua index bda58de..26230b5 100644 --- a/test/test_detiled.lua +++ b/test/test_detiled.lua @@ -1,5 +1,3 @@ -local decore = require("decore.decore") - return function() describe("Detiled", function() ---@type detiled From bed640523b709cbf200d1ca4acad864db8551da9 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 09:31:52 +0200 Subject: [PATCH 05/71] Update --- example/assets/grid/entities.go | 0 example/assets/grid/entities/icon_barrel.go | 11 + example/assets/grid/grid_items.atlas | 22 + example/assets/grid/grid_tileset.tilesource | 10 + example/example_grid/example_grid.collection | 14 + example/example_grid/example_grid.script | 32 + game.project | 6 +- resources/components.json | 156 - resources/entities.json | 236 - resources/maps/game.json | 13173 ----------------- resources/maps_list.json | 5 - resources/tilesets/shooting_circle.json | 352 - resources/tilesets_list.json | 5 - tiled/assets/grid/cactus.png | Bin 0 -> 190 bytes tiled/assets/grid/icon_barrel.png | Bin 0 -> 189 bytes tiled/assets/grid/icon_chest.png | Bin 0 -> 182 bytes tiled/assets/grid/icon_key.png | Bin 0 -> 179 bytes tiled/assets/grid/icon_stop.png | Bin 0 -> 194 bytes tiled/assets/grid/icon_table.png | Bin 0 -> 187 bytes tiled/assets/grid/tilemap_packed.png | Bin 0 -> 6442 bytes tiled/assets/grid/tree.png | Bin 0 -> 182 bytes tiled/detiled.tiled-project | 14 + tiled/detiled.tiled-session | 68 + tiled/export/grid-grid_items.tilemap | 73 + tiled/export/grid-grid_tileset.tilemap | 4886 ++++++ tiled/export/grid.collection | 40 + tiled/game_shooting_circle.tiled-project | 442 - tiled/game_shooting_circle.tiled-session | 76 - tiled/images/arena_background.png | Bin 1887 -> 0 bytes tiled/images/bullet_sniper.png | Bin 426 -> 0 bytes tiled/images/enemy.png | Bin 1792 -> 0 bytes tiled/images/enemy_rectangle.png | Bin 733 -> 0 bytes tiled/images/explosion.png | Bin 2092 -> 0 bytes tiled/images/pit.png | Bin 1090 -> 0 bytes tiled/images/ui_circle_32.png | Bin 426 -> 0 bytes tiled/images/ui_circle_64.png | Bin 787 -> 0 bytes tiled/images/wall.png | Bin 1305 -> 0 bytes tiled/images/wall_pit.png | Bin 1028 -> 0 bytes tiled/maps/game.tmx | 4432 ------ tiled/maps/grid.json | 189 + tiled/tilesets/grid_items.json | 60 + tiled/tilesets/grid_tileset.json | 30 + tiled/tilesets/shooting_circle.tsx | 181 - 43 files changed, 5452 insertions(+), 19061 deletions(-) create mode 100644 example/assets/grid/entities.go create mode 100644 example/assets/grid/entities/icon_barrel.go create mode 100644 example/assets/grid/grid_items.atlas create mode 100644 example/assets/grid/grid_tileset.tilesource create mode 100644 example/example_grid/example_grid.collection create mode 100644 example/example_grid/example_grid.script delete mode 100644 resources/components.json delete mode 100644 resources/entities.json delete mode 100644 resources/maps/game.json delete mode 100644 resources/maps_list.json delete mode 100644 resources/tilesets/shooting_circle.json delete mode 100644 resources/tilesets_list.json create mode 100644 tiled/assets/grid/cactus.png create mode 100644 tiled/assets/grid/icon_barrel.png create mode 100644 tiled/assets/grid/icon_chest.png create mode 100644 tiled/assets/grid/icon_key.png create mode 100644 tiled/assets/grid/icon_stop.png create mode 100644 tiled/assets/grid/icon_table.png create mode 100644 tiled/assets/grid/tilemap_packed.png create mode 100644 tiled/assets/grid/tree.png create mode 100644 tiled/detiled.tiled-project create mode 100644 tiled/detiled.tiled-session create mode 100644 tiled/export/grid-grid_items.tilemap create mode 100644 tiled/export/grid-grid_tileset.tilemap create mode 100644 tiled/export/grid.collection delete mode 100644 tiled/game_shooting_circle.tiled-project delete mode 100644 tiled/game_shooting_circle.tiled-session delete mode 100644 tiled/images/arena_background.png delete mode 100644 tiled/images/bullet_sniper.png delete mode 100644 tiled/images/enemy.png delete mode 100644 tiled/images/enemy_rectangle.png delete mode 100644 tiled/images/explosion.png delete mode 100644 tiled/images/pit.png delete mode 100644 tiled/images/ui_circle_32.png delete mode 100644 tiled/images/ui_circle_64.png delete mode 100644 tiled/images/wall.png delete mode 100644 tiled/images/wall_pit.png delete mode 100644 tiled/maps/game.tmx create mode 100644 tiled/maps/grid.json create mode 100644 tiled/tilesets/grid_items.json create mode 100644 tiled/tilesets/grid_tileset.json delete mode 100644 tiled/tilesets/shooting_circle.tsx diff --git a/example/assets/grid/entities.go b/example/assets/grid/entities.go new file mode 100644 index 0000000..e69de29 diff --git a/example/assets/grid/entities/icon_barrel.go b/example/assets/grid/entities/icon_barrel.go new file mode 100644 index 0000000..6086d36 --- /dev/null +++ b/example/assets/grid/entities/icon_barrel.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"icon_barrel\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/grid/grid_items.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/grid/grid_items.atlas b/example/assets/grid/grid_items.atlas new file mode 100644 index 0000000..b8e4fd5 --- /dev/null +++ b/example/assets/grid/grid_items.atlas @@ -0,0 +1,22 @@ +images { + image: "/tiled/assets/grid/cactus.png" +} +images { + image: "/tiled/assets/grid/icon_barrel.png" +} +images { + image: "/tiled/assets/grid/icon_chest.png" +} +images { + image: "/tiled/assets/grid/icon_key.png" +} +images { + image: "/tiled/assets/grid/icon_stop.png" +} +images { + image: "/tiled/assets/grid/icon_table.png" +} +images { + image: "/tiled/assets/grid/tree.png" +} +extrude_borders: 2 diff --git a/example/assets/grid/grid_tileset.tilesource b/example/assets/grid/grid_tileset.tilesource new file mode 100644 index 0000000..7f7655b --- /dev/null +++ b/example/assets/grid/grid_tileset.tilesource @@ -0,0 +1,10 @@ +image: "/tiled/assets/grid/tilemap_packed.png" +tile_width: 16 +tile_height: 16 +collision_groups: "default" +animations { + id: "anim" + start_tile: 1 + end_tile: 1 +} +extrude_borders: 2 diff --git a/example/example_grid/example_grid.collection b/example/example_grid/example_grid.collection new file mode 100644 index 0000000..ebf8124 --- /dev/null +++ b/example/example_grid/example_grid.collection @@ -0,0 +1,14 @@ +name: "example_grid" +collection_instances { + id: "grid" + collection: "/tiled/export/grid.collection" +} +scale_along_z: 0 +embedded_instances { + id: "go" + data: "components {\n" + " id: \"example_grid\"\n" + " component: \"/example/example_grid/example_grid.script\"\n" + "}\n" + "" +} diff --git a/example/example_grid/example_grid.script b/example/example_grid/example_grid.script new file mode 100644 index 0000000..9170ed1 --- /dev/null +++ b/example/example_grid/example_grid.script @@ -0,0 +1,32 @@ +local detiled = require("detiled.detiled") + + +local function spawn_entity(entity) + local prefab_id = entity.prefab_id + local components = entity.components + local transform = components.transform + local position_x = transform.position_x + local position_y = transform.position_y + local position_z = transform.position_z + + local factory_url = "/entities#" .. prefab_id + factory.create(factory_url, vmath.vector3(position_x, position_y, position_z)) + + print("Spawn entity: ", factory_url) +end + + +local function spawn_map(map) + local entities = map.child_instancies + for _, entity in ipairs(entities) do + spawn_entity(entity) + end +end + + +function init(self) + detiled.load_tileset("/tiled/tilesets/grid_items.json") + + local map = detiled.get_entity_from_map("/tiled/maps/grid.json") + spawn_map(map) +end diff --git a/game.project b/game.project index 4e1833a..3a21441 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /test/test.collectionc +main_collection = /example/example_grid/example_grid.collectionc [script] shared_state = 1 @@ -14,8 +14,8 @@ input_method = HiddenInputField [project] title = Detiled version = 2 -custom_resources = /resources -dependencies#0 = https://github.com/Insality/decore/archive/refs/tags/2.zip +custom_resources = /tiled/maps,/tiled/tilesets +dependencies#0 = https://github.com/Insality/decore/archive/refs/tags/3.zip dependencies#1 = https://github.com/britzl/deftest/archive/master.zip dependencies#2 = https://github.com/Insality/defold-event/archive/refs/tags/13.zip diff --git a/resources/components.json b/resources/components.json deleted file mode 100644 index 8fc42ec..0000000 --- a/resources/components.json +++ /dev/null @@ -1,156 +0,0 @@ -{ - "pack_id": "core", - - "components": { - "id": "", - "prefab_id": false, - "pack_id": false, - "name": false, - "tiled_id": false, - "layer_id": false, - "hidden": false, - - "transform": { - "position_x": 0, - "position_y": 0, - "position_z": 0, - "size_x": 1, - "size_y": 1, - "size_z": 1, - "scale_x": 1, - "scale_y": 1, - "scale_z": 1, - "rotation": 0 - }, - - "game_object": { - "factory_url": "", - "is_slice9": false - }, - - "color": { - "hex_color": "", - "sprite_url": "" - }, - - "level_loader_command": { - "world_id": null, - "pack_id": null, - "offset_x": 0, - "offset_y": 0 - }, - - "debug": { - "is_profiler_active": null - }, - - "on_spawn_command": { - "command": false - }, - - "input": {}, - - "on_key_released": { - "key_to_add_component_json": null, - "key_to_add_component": null - }, - - "window_event": { - "is_focus_gained": false, - "is_focus_lost": false, - "is_resized": false - }, - - "camera": { - "camera_url": "" - }, - - "health": { - "health": 0 - }, - - "gui_main": {}, - "health_circle_visual": {}, - "cursor": {}, - - "damage_number": { - "damage": 1 - }, - - "panthera": { - "animation_path": "" - }, - - "movement": { - "velocity_x": 0, - "velocity_y": 0, - "friction": 0 - }, - - "movement_controller": { - "speed": 1, - "movement_x": 0, - "movement_y": 0 - }, - - "remove_with_delay": { - "delay": 0 - }, - - "explosion": {}, - - "make_explosion_on_spawn": { - "power": 0, - "distance": 0, - "position_x": 0, - "position_y": 0 - }, - - "physics": { - "velocity_x": 0, - "velocity_y": 0 - }, - - "collision": {}, - - "on_collision_remove": false, - - "on_collision_damage": { - "damage": 0 - }, - - "on_collision_explosion": { - "power": 0, - "distance": 0 - }, - - "play_fx_on_remove": { - "fx_url": "" - }, - - "acceleration": { - "value": 0 - }, - - "shooter_controller": { - "bullet_prefab_id": "", - "is_auto_shoot": false, - "spread_angle": 0, - "damage": 0, - "bullet_speed": 2000, - "fire_rate": 0, - "fire_rate_timer": 0, - "burst_count": 5, - "burst_count_current": 0, - "burst_rate": 1, - "bullets_per_shoot": 1 - }, - - "on_target_count_command": { - "amount": 0, - "command": false - }, - - "target": false - } -} diff --git a/resources/entities.json b/resources/entities.json deleted file mode 100644 index 0abd37d..0000000 --- a/resources/entities.json +++ /dev/null @@ -1,236 +0,0 @@ -{ - "pack_id": "core", - "entities": { - "debug": { - "debug": {}, - "on_key_released": { - "key_to_command": { - "key_p": { "debug_command": { "toggle_profiler": true } }, - "key_r": { "debug_command": { "restart": true } } - } - } - }, - - "gui_main": { - "game_object": { - "factory_url": "/spawner/spawner#gui_main" - }, - "gui_main": {} - }, - - "damage_number": { - "transform": {}, - "game_object": { - "factory_url": "/spawner/spawner#damage_number" - }, - "damage_number": { - "amount": 1 - } - }, - - "bullet_sniper": { - "transform": { - "scale_x": 1.25, - "scale_y": 1.25 - }, - "color": { - "hex_color": "95C8E2", - "sprite_url": "/root#sprite" - }, - "game_object": { - "factory_url": "/spawner/spawner#bullet" - }, - "on_collision_explosion": { - "power": 50000, - "damage": 30, - "distance": 128 - }, - "on_collision_damage": { - "damage": 30 - }, - "play_fx_on_remove": { - "fx_url": "explosion" - }, - "on_collision_remove": true, - "physics": {}, - "collision": {}, - "remove_with_delay": { - "delay": 0.5 - } - }, - - "bullet_arcade": { - "transform": { - }, - "color": { - "hex_color": "95C8E2", - "sprite_url": "/root#sprite" - }, - "game_object": { - "factory_url": "/spawner/spawner#bullet" - }, - "on_collision_damage": { - "damage": 50 - }, - "physics": {}, - "collision": {}, - "remove_with_delay": { - "delay": 3 - } - }, - - "bullet_pistol": { - "transform": {}, - "color": { - "hex_color": "95C8E2", - "sprite_url": "/root#sprite" - }, - "game_object": { - "factory_url": "/spawner/spawner#bullet" - }, - "on_collision_damage": { - "damage": 50 - }, - "on_collision_remove": true, - "physics": {}, - "collision": {}, - "remove_with_delay": { - "delay": 0.7 - } - }, - - "bullet_shotgun": { - "transform": {}, - "color": { - "hex_color": "95C8E2", - "sprite_url": "/root#sprite" - }, - "game_object": { - "factory_url": "/spawner/spawner#bullet_shotgun" - }, - "on_collision_damage": { - "damage": 40 - }, - "on_collision_remove": true, - "physics": {}, - "collision": {}, - "remove_with_delay": { - "delay": 0.7 - } - }, - - "bullet_rocket": { - "transform": { - }, - "color": { - "hex_color": "CA8BD0", - "sprite_url": "/root#sprite" - }, - "game_object": { - "factory_url": "/spawner/spawner#rocket" - }, - "on_collision_damage": { - "damage": 50 - }, - "on_collision_explosion": { - "power": 80000, - "damage": 50, - "distance": 350 - }, - "acceleration": { - "value": 500 - }, - "on_collision_remove": true, - "physics": {}, - "collision": {}, - "remove_with_delay": { - "delay": 2 - }, - "play_fx_on_remove": { - "fx_url": "explosion_rocket" - } - }, - - "bullet_rocket_small": { - "transform": { - "scale_x": 0.5, - "scale_y": 0.5 - }, - "color": { - "hex_color": "CA8BD0", - "sprite_url": "/root#sprite" - }, - "game_object": { - "factory_url": "/spawner/spawner#rocket" - }, - "on_collision_damage": { - "damage": 20 - }, - "on_collision_explosion": { - "power": 30000, - "damage": 50, - "distance": 128 - }, - "acceleration": { - "value": 600 - }, - "on_collision_remove": true, - "physics": {}, - "collision": {}, - "remove_with_delay": { - "delay": 2 - }, - "play_fx_on_remove": { - "fx_url": "explosion_rocket" - } - }, - - "bullet_pistol_explosion": { - "transform": {}, - "color": { - "hex_color": "95C8E2", - "sprite_url": "/root#sprite" - }, - "game_object": { - "factory_url": "/spawner/spawner#bullet" - }, - "on_collision_damage": { - "damage": 10 - }, - "on_collision_explosion": { - "power": 15000, - "damage": 30, - "distance": 256 - }, - "on_collision_remove": true, - "physics": {}, - "collision": {}, - "remove_with_delay": { - "delay": 0.7 - }, - "play_fx_on_remove": { - "fx_url": "explosion" - } - }, - - "explosion": { - "transform": {}, - "game_object": { - "factory_url": "/spawner/spawner#explosion" - }, - "remove_with_delay": { - "delay": 0.1 - } - }, - - "explosion_enemy": { - "transform": {}, - "game_object": { - "factory_url": "/spawner/spawner#explosion_enemy" - }, - "remove_with_delay": { - "delay": 0.1 - } - } - } -} diff --git a/resources/maps/game.json b/resources/maps/game.json deleted file mode 100644 index 28ee12b..0000000 --- a/resources/maps/game.json +++ /dev/null @@ -1,13173 +0,0 @@ -{ "compressionlevel":-1, - "height":18, - "infinite":false, - "layers":[ - { - "draworder":"topdown", - "id":4, - "name":"background", - "objects":[ - { - "class":"", - "gid":5, - "height":1080, - "id":41, - "name":"", - "rotation":0, - "visible":true, - "width":1080, - "x":0, - "y":1080 - }, - { - "class":"", - "gid":6, - "height":363.5, - "id":42, - "name":"", - "rotation":0, - "visible":true, - "width":1454, - "x":-221, - "y":10 - }, - { - "class":"", - "gid":6, - "height":363.5, - "id":43, - "name":"", - "rotation":0, - "visible":true, - "width":1454, - "x":-205, - "y":1425 - }, - { - "class":"", - "gid":6, - "height":363.5, - "id":44, - "name":"", - "rotation":90, - "visible":true, - "width":1454, - "x":-350, - "y":-86 - }, - { - "class":"", - "gid":6, - "height":363.5, - "id":45, - "name":"", - "rotation":90, - "visible":true, - "width":1454, - "x":1070, - "y":-86 - }], - "opacity":1, - "properties":[ - { - "name":"position_z", - "type":"float", - "value":-10 - }], - "type":"objectgroup", - "visible":true, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":9, - "name":"level1", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":182, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_pistol", - "bullet_speed":3000, - "burst_count":6, - "burst_rate":0.4, - "damage":40, - "fire_rate":0.15, - "is_auto_shoot":true, - "spread":32, - "spread_angle":5 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":147, - "y":589 - }, - { - "class":"", - "gid":3, - "height":64, - "id":189, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":40 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":828, - "y":419 - }, - { - "class":"", - "gid":3, - "height":64, - "id":195, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":40 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":915, - "y":584 - }, - { - "class":"", - "gid":3, - "height":64, - "id":201, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":40 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":849, - "y":798 - }, - { - "class":"", - "gid":3, - "height":64, - "id":210, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":40 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":479, - "y":968 - }, - { - "class":"", - "gid":3, - "height":64, - "id":216, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":40 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":678, - "y":903 - }, - { - "class":"", - "gid":3, - "height":64, - "id":229, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":40 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":698, - "y":271 - }, - { - "class":"", - "gid":3, - "height":64, - "id":230, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":40 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":488, - "y":198 - }, - { - "class":"", - "gid":10, - "height":200, - "id":231, - "name":"", - "rotation":0, - "visible":true, - "width":200, - "x":796, - "y":-381 - }, - { - "class":"", - "gid":11, - "height":140, - "id":268, - "name":"", - "rotation":270, - "visible":true, - "width":1080, - "x":419, - "y":1080 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":true, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":10, - "name":"level2", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":236, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_pistol_explosion", - "bullet_speed":3000, - "burst_count":2, - "burst_rate":0.4, - "damage":40, - "fire_rate":0.15, - "is_auto_shoot":true, - "spread":32, - "spread_angle":15 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":134, - "y":589 - }, - { - "class":"", - "gid":3, - "height":64, - "id":237, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":828, - "y":419 - }, - { - "class":"", - "gid":3, - "height":64, - "id":238, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":915, - "y":584 - }, - { - "class":"", - "gid":3, - "height":64, - "id":239, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":847, - "y":805 - }, - { - "class":"", - "gid":3, - "height":64, - "id":240, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":479, - "y":1013 - }, - { - "class":"", - "gid":3, - "height":64, - "id":241, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":717, - "y":936 - }, - { - "class":"", - "gid":3, - "height":64, - "id":242, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":698, - "y":271 - }, - { - "class":"", - "gid":3, - "height":64, - "id":243, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":488, - "y":198 - }, - { - "class":"", - "gid":10, - "height":200, - "id":244, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"Explosion\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":796, - "y":-381 - }, - { - "class":"", - "gid":3, - "height":64, - "id":245, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":888, - "y":338 - }, - { - "class":"", - "gid":3, - "height":64, - "id":246, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":975, - "y":503 - }, - { - "class":"", - "gid":3, - "height":64, - "id":247, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":907, - "y":724 - }, - { - "class":"", - "gid":3, - "height":64, - "id":248, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":539, - "y":932 - }, - { - "class":"", - "gid":3, - "height":64, - "id":249, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":777, - "y":855 - }, - { - "class":"", - "gid":3, - "height":64, - "id":250, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":758, - "y":190 - }, - { - "class":"", - "gid":3, - "height":64, - "id":251, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":548, - "y":117 - }, - { - "class":"", - "gid":3, - "height":64, - "id":252, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":917, - "y":435 - }, - { - "class":"", - "gid":3, - "height":64, - "id":253, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":1004, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":254, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":936, - "y":821 - }, - { - "class":"", - "gid":3, - "height":64, - "id":255, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":568, - "y":1029 - }, - { - "class":"", - "gid":3, - "height":64, - "id":256, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":806, - "y":952 - }, - { - "class":"", - "gid":3, - "height":64, - "id":257, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":787, - "y":287 - }, - { - "class":"", - "gid":3, - "height":64, - "id":258, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":60 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":577, - "y":214 - }, - { - "class":"", - "gid":11, - "height":140, - "id":267, - "name":"", - "rotation":270, - "visible":true, - "width":1080, - "x":420, - "y":1080 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":11, - "name":"level3", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":269, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_pistol_explosion", - "bullet_speed":4000, - "burst_count":4, - "burst_rate":0.8, - "damage":40, - "fire_rate":0.2, - "is_auto_shoot":true, - "spread":32, - "spread_angle":20 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":134, - "y":589 - }, - { - "class":"", - "gid":3, - "height":64, - "id":270, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":828, - "y":419 - }, - { - "class":"", - "gid":3, - "height":64, - "id":271, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":915, - "y":584 - }, - { - "class":"", - "gid":3, - "height":64, - "id":272, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":847, - "y":805 - }, - { - "class":"", - "gid":3, - "height":64, - "id":273, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":479, - "y":1013 - }, - { - "class":"", - "gid":3, - "height":64, - "id":274, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":717, - "y":936 - }, - { - "class":"", - "gid":3, - "height":64, - "id":275, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":698, - "y":271 - }, - { - "class":"", - "gid":3, - "height":64, - "id":276, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":488, - "y":198 - }, - { - "class":"", - "gid":10, - "height":200, - "id":277, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"More\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":796, - "y":-381 - }, - { - "class":"", - "gid":3, - "height":64, - "id":278, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":888, - "y":338 - }, - { - "class":"", - "gid":3, - "height":64, - "id":279, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":975, - "y":503 - }, - { - "class":"", - "gid":3, - "height":64, - "id":280, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":907, - "y":724 - }, - { - "class":"", - "gid":3, - "height":64, - "id":281, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":539, - "y":932 - }, - { - "class":"", - "gid":3, - "height":64, - "id":282, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":777, - "y":855 - }, - { - "class":"", - "gid":3, - "height":64, - "id":283, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":758, - "y":190 - }, - { - "class":"", - "gid":3, - "height":64, - "id":284, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":548, - "y":117 - }, - { - "class":"", - "gid":3, - "height":64, - "id":285, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":917, - "y":435 - }, - { - "class":"", - "gid":3, - "height":64, - "id":286, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":1004, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":287, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":936, - "y":821 - }, - { - "class":"", - "gid":3, - "height":64, - "id":288, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":568, - "y":1029 - }, - { - "class":"", - "gid":3, - "height":64, - "id":289, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":806, - "y":952 - }, - { - "class":"", - "gid":3, - "height":64, - "id":290, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":787, - "y":287 - }, - { - "class":"", - "gid":3, - "height":64, - "id":291, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":577, - "y":214 - }, - { - "class":"", - "gid":11, - "height":140, - "id":292, - "name":"", - "rotation":270, - "visible":true, - "width":1080, - "x":420, - "y":1080 - }, - { - "class":"", - "gid":3, - "height":64, - "id":293, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":591, - "y":437 - }, - { - "class":"", - "gid":3, - "height":64, - "id":294, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":678, - "y":602 - }, - { - "class":"", - "gid":3, - "height":64, - "id":295, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":610, - "y":823 - }, - { - "class":"", - "gid":3, - "height":64, - "id":296, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":651, - "y":356 - }, - { - "class":"", - "gid":3, - "height":64, - "id":297, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":738, - "y":521 - }, - { - "class":"", - "gid":3, - "height":64, - "id":298, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":670, - "y":742 - }, - { - "class":"", - "gid":3, - "height":64, - "id":299, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":680, - "y":453 - }, - { - "class":"", - "gid":3, - "height":64, - "id":300, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":767, - "y":618 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":301, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":699, - "y":839 - }, - { - "class":"", - "gid":3, - "height":64, - "id":302, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":467, - "y":621 - }, - { - "class":"", - "gid":3, - "height":64, - "id":303, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":527, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":304, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":556, - "y":637 - }, - { - "class":"", - "gid":3, - "height":64, - "id":305, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":438, - "y":377 - }, - { - "class":"", - "gid":3, - "height":64, - "id":306, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":498, - "y":296 - }, - { - "class":"", - "gid":3, - "height":64, - "id":307, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":527, - "y":393 - }, - { - "class":"", - "gid":3, - "height":64, - "id":308, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":427, - "y":809 - }, - { - "class":"", - "gid":3, - "height":64, - "id":309, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":487, - "y":728 - }, - { - "class":"", - "gid":3, - "height":64, - "id":310, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":516, - "y":825 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":12, - "name":"level4", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":311, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_pistol_explosion", - "bullet_speed":3000, - "burst_count":10, - "burst_rate":0.4, - "damage":40, - "fire_rate":0.1, - "is_auto_shoot":true, - "spread":32, - "spread_angle":25 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":134, - "y":589 - }, - { - "class":"", - "gid":3, - "height":315, - "id":315, - "name":"", - "properties":[ - { - "name":"game_object", - "propertytype":"game_object", - "type":"class", - "value": - { - "factory_url":"\/spawner\/spawner#enemy_big" - } - }, - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":1000 - } - }], - "rotation":0, - "visible":true, - "width":315, - "x":594, - "y":716 - }, - { - "class":"", - "gid":10, - "height":200, - "id":319, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"Boss\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":796, - "y":-381 - }, - { - "class":"", - "gid":11, - "height":140, - "id":334, - "name":"", - "rotation":270, - "visible":true, - "width":1080, - "x":420, - "y":1080 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":8, - "name":"level5", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":146, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_arcade", - "bullet_speed":1500, - "burst_count":3, - "burst_rate":0.5, - "damage":100, - "fire_rate":0.3, - "is_auto_shoot":true, - "spread":32, - "spread_angle":0 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":518, - "y":966 - }, - { - "class":"", - "gid":9, - "height":64, - "id":153, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":420, - "y":540 - }, - { - "class":"", - "gid":9, - "height":64, - "id":154, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":540, - "y":420 - }, - { - "class":"", - "gid":9, - "height":64, - "id":155, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":480, - "y":600 - }, - { - "class":"", - "gid":9, - "height":64, - "id":156, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":660, - "y":420 - }, - { - "class":"", - "gid":9, - "height":64, - "id":157, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":540, - "y":540 - }, - { - "class":"", - "gid":9, - "height":64, - "id":158, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":360, - "y":480 - }, - { - "class":"", - "gid":9, - "height":64, - "id":159, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":480, - "y":480 - }, - { - "class":"", - "gid":9, - "height":64, - "id":160, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":600, - "y":480 - }, - { - "class":"", - "gid":9, - "height":64, - "id":161, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":300, - "y":420 - }, - { - "class":"", - "gid":9, - "height":64, - "id":162, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":420, - "y":420 - }, - { - "class":"", - "gid":9, - "height":64, - "id":163, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":480, - "y":360 - }, - { - "class":"", - "gid":9, - "height":64, - "id":164, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":600, - "y":360 - }, - { - "class":"", - "gid":9, - "height":64, - "id":165, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":240, - "y":360 - }, - { - "class":"", - "gid":9, - "height":64, - "id":166, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":360, - "y":360 - }, - { - "class":"", - "gid":9, - "height":64, - "id":167, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":720, - "y":360 - }, - { - "class":"", - "gid":9, - "height":64, - "id":168, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":420, - "y":300 - }, - { - "class":"", - "gid":9, - "height":64, - "id":169, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":540, - "y":300 - }, - { - "class":"", - "gid":9, - "height":64, - "id":170, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":180, - "y":300 - }, - { - "class":"", - "gid":9, - "height":64, - "id":171, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":300, - "y":300 - }, - { - "class":"", - "gid":9, - "height":64, - "id":172, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":660, - "y":300 - }, - { - "class":"", - "gid":9, - "height":64, - "id":173, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":360, - "y":240 - }, - { - "class":"", - "gid":9, - "height":64, - "id":174, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":480, - "y":240 - }, - { - "class":"", - "gid":9, - "height":64, - "id":175, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":120, - "y":240 - }, - { - "class":"", - "gid":9, - "height":64, - "id":176, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":240, - "y":240 - }, - { - "class":"", - "gid":9, - "height":64, - "id":177, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":600, - "y":240 - }, - { - "class":"", - "gid":9, - "height":64, - "id":178, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":840, - "y":240 - }, - { - "class":"", - "gid":9, - "height":64, - "id":179, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":780, - "y":300 - }, - { - "class":"", - "gid":9, - "height":64, - "id":180, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":200 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":720, - "y":240 - }, - { - "class":"", - "gid":10, - "height":200, - "id":234, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"Arcanoid?\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":510, - "y":-441 - }, - { - "class":"", - "gid":11, - "height":140, - "id":353, - "name":"", - "rotation":0, - "visible":true, - "width":1080, - "x":-2, - "y":881 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":13, - "name":"level6", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":354, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_sniper", - "bullet_speed":2500, - "burst_count":6, - "burst_rate":0.4, - "damage":100, - "fire_rate":0.15, - "is_auto_shoot":true, - "spread":32, - "spread_angle":0 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":518, - "y":966 - }, - { - "class":"", - "gid":9, - "height":64, - "id":355, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":420, - "y":540 - }, - { - "class":"", - "gid":9, - "height":64, - "id":356, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":540, - "y":420 - }, - { - "class":"", - "gid":9, - "height":64, - "id":357, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":480, - "y":600 - }, - { - "class":"", - "gid":9, - "height":64, - "id":358, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":660, - "y":420 - }, - { - "class":"", - "gid":9, - "height":64, - "id":359, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":540, - "y":540 - }, - { - "class":"", - "gid":9, - "height":64, - "id":360, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":360, - "y":480 - }, - { - "class":"", - "gid":9, - "height":64, - "id":361, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":480, - "y":480 - }, - { - "class":"", - "gid":9, - "height":64, - "id":362, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":600, - "y":480 - }, - { - "class":"", - "gid":9, - "height":64, - "id":363, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":300, - "y":420 - }, - { - "class":"", - "gid":9, - "height":64, - "id":364, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":420, - "y":420 - }, - { - "class":"", - "gid":9, - "height":64, - "id":365, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":480, - "y":360 - }, - { - "class":"", - "gid":9, - "height":64, - "id":366, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":600, - "y":360 - }, - { - "class":"", - "gid":9, - "height":64, - "id":367, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":240, - "y":360 - }, - { - "class":"", - "gid":9, - "height":64, - "id":368, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":360, - "y":360 - }, - { - "class":"", - "gid":9, - "height":64, - "id":369, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":720, - "y":360 - }, - { - "class":"", - "gid":9, - "height":64, - "id":370, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":420, - "y":300 - }, - { - "class":"", - "gid":9, - "height":64, - "id":371, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":540, - "y":300 - }, - { - "class":"", - "gid":9, - "height":64, - "id":372, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":180, - "y":300 - }, - { - "class":"", - "gid":9, - "height":64, - "id":373, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":300, - "y":300 - }, - { - "class":"", - "gid":9, - "height":64, - "id":374, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":660, - "y":300 - }, - { - "class":"", - "gid":9, - "height":64, - "id":375, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":360, - "y":240 - }, - { - "class":"", - "gid":9, - "height":64, - "id":376, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":480, - "y":240 - }, - { - "class":"", - "gid":9, - "height":64, - "id":377, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":120, - "y":240 - }, - { - "class":"", - "gid":9, - "height":64, - "id":378, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":240, - "y":240 - }, - { - "class":"", - "gid":9, - "height":64, - "id":379, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":600, - "y":240 - }, - { - "class":"", - "gid":9, - "height":64, - "id":380, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":840, - "y":240 - }, - { - "class":"", - "gid":9, - "height":64, - "id":381, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":780, - "y":300 - }, - { - "class":"", - "gid":9, - "height":64, - "id":382, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":128, - "x":720, - "y":240 - }, - { - "class":"", - "gid":10, - "height":200, - "id":383, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"+ Explosion\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":510, - "y":-441 - }, - { - "class":"", - "gid":11, - "height":140, - "id":384, - "name":"", - "rotation":0, - "visible":true, - "width":1080, - "x":-2, - "y":881 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":14, - "name":"level7", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":385, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_sniper", - "bullet_speed":4000, - "burst_count":20, - "burst_rate":0.4, - "damage":100, - "fire_rate":0.08, - "is_auto_shoot":true, - "spread":32, - "spread_angle":20 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":518, - "y":966 - }, - { - "class":"", - "gid":10, - "height":200, - "id":414, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"Bad Day\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":510, - "y":-441 - }, - { - "class":"", - "gid":11, - "height":140, - "id":415, - "name":"", - "rotation":0, - "visible":true, - "width":1080, - "x":-2, - "y":881 - }, - { - "class":"", - "gid":3, - "height":64, - "id":417, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":419, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":420, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":421, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":422, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":423, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":424, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":425, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":426, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":427, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":428, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":429, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":430, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":431, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":433, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":434, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":435, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":436, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":437, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":438, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":439, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":440, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":441, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":442, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":443, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":444, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":445, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":446, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":447, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":300 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":448, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":449, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":450, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":451, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":452, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":453, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":454, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":455, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":456, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":457, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":458, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":459, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":460, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":300 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":15, - "name":"level8", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":461, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_sniper", - "bullet_speed":5000, - "burst_count":40, - "burst_rate":0.4, - "damage":100, - "fire_rate":0.04, - "is_auto_shoot":true, - "spread":32, - "spread_angle":25 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":518, - "y":966 - }, - { - "class":"", - "gid":10, - "height":200, - "id":462, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"Can More?\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":510, - "y":-441 - }, - { - "class":"", - "gid":11, - "height":140, - "id":463, - "name":"", - "rotation":0, - "visible":true, - "width":1080, - "x":-2, - "y":881 - }, - { - "class":"", - "gid":3, - "height":64, - "id":464, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":465, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":466, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":467, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":468, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":469, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":470, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":471, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":472, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":473, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":474, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":475, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":476, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":477, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":478, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":479, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":480, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":481, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":482, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":483, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":484, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":485, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":486, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":487, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":488, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":489, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":490, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":491, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":492, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":300 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":493, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":494, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":495, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":496, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":497, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":498, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":499, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":500, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":501, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":502, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":503, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":504, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":505, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":506, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":507, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":508, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":509, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":510, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":511, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":512, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":513, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":514, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":515, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":516, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":517, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":518, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":519, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":520, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":521, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":522, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":523, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":524, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":420 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":525, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":526, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":527, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":528, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":529, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":530, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":531, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":532, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":533, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":534, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":535, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":536, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":537, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":538, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":539, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":540, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":541, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":542, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":543, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":544, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":545, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":546, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":547, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":548, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":549, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":550, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":551, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":552, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":553, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":554, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":555, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":556, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":540 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":557, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":558, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":559, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":560, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":561, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":562, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":563, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":564, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":565, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":566, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":567, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":568, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":569, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":570, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":571, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":572, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":573, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":574, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":575, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":576, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":577, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":578, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":579, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":580, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":581, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":582, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":583, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":584, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":585, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":586, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":587, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":588, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":660 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":589, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":590, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":591, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":592, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":593, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":594, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":595, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":596, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":597, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":598, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":599, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":600, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":601, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":602, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":603, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":604, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":605, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":606, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":607, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":660 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":16, - "name":"level9", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":608, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_rocket", - "bullet_speed":500, - "burst_count":1, - "burst_rate":0.7, - "damage":100, - "fire_rate":0.7, - "is_auto_shoot":true, - "spread":32, - "spread_angle":10 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":518, - "y":966 - }, - { - "class":"", - "gid":10, - "height":200, - "id":609, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"Rocket\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":510, - "y":-441 - }, - { - "class":"", - "gid":11, - "height":140, - "id":610, - "name":"", - "rotation":0, - "visible":true, - "width":1080, - "x":-2, - "y":881 - }, - { - "class":"", - "gid":3, - "height":64, - "id":611, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":612, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":613, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":614, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":615, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":616, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":617, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":618, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":619, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":620, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":621, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":622, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":623, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":624, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":625, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":626, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":627, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":628, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":629, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":630, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":631, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":632, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":633, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":634, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":635, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":636, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":637, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":638, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":639, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":300 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":640, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":641, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":642, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":643, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":644, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":645, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":646, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":647, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":648, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":649, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":650, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":651, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":652, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":737, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":738, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":739, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":746, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":747, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":748, - "name":"", - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":300 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":17, - "name":"level10", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":755, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_rocket", - "bullet_speed":500, - "burst_count":1, - "burst_rate":0.1, - "damage":100, - "fire_rate":0.1, - "is_auto_shoot":true, - "spread":32, - "spread_angle":10 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":520, - "y":600 - }, - { - "class":"", - "gid":10, - "height":200, - "id":756, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"No Chances\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":510, - "y":-441 - }, - { - "class":"", - "gid":3, - "height":64, - "id":758, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":759, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":760, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":761, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":762, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":763, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":764, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":765, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":766, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":767, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":768, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":769, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":770, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":771, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":772, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":773, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":774, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":775, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":776, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":777, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":778, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":779, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":780, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":781, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":782, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":783, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":784, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":785, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":786, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":787, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":300 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":788, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":789, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":790, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":791, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":792, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":793, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":794, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":795, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":796, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":797, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":798, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":799, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":800, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":801, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":802, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":803, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":804, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":805, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":806, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":807, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":808, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":809, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":810, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":811, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":812, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":813, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":814, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":815, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":816, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":817, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":818, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":819, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":900 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":820, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":821, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":822, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":823, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":824, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":825, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":826, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":827, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":828, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":829, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":830, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":831, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":832, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":833, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":834, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":835, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":240, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":836, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":837, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":838, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":839, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":840, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":841, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":842, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":843, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":844, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":845, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":780, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":846, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":847, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":848, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":900 - }, - { - "class":"", - "gid":3, - "height":64, - "id":849, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":850, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":851, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":900 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":852, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":960 - }, - { - "class":"", - "gid":3, - "height":64, - "id":853, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":1020 - }, - { - "class":"", - "gid":3, - "height":64, - "id":854, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":855, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":856, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":857, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":858, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":859, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":860, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":861, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":862, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":863, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":864, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":865, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":866, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":867, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":868, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":869, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":870, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":871, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":872, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":720 - }, - { - "class":"", - "gid":3, - "height":64, - "id":873, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":720 - }, - { - "class":"", - "gid":3, - "height":64, - "id":874, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":780 - }, - { - "class":"", - "gid":3, - "height":64, - "id":875, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":780 - }, - { - "class":"", - "gid":3, - "height":64, - "id":876, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":120, - "y":840 - }, - { - "class":"", - "gid":3, - "height":64, - "id":877, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":180, - "y":840 - }, - { - "class":"", - "gid":3, - "height":64, - "id":878, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":720 - }, - { - "class":"", - "gid":3, - "height":64, - "id":879, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":780 - }, - { - "class":"", - "gid":3, - "height":64, - "id":880, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":60, - "y":840 - }, - { - "class":"", - "gid":3, - "height":64, - "id":881, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":882, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":883, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":600 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":884, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":885, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":886, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":887, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":888, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":889, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":660 - }, - { - "class":"", - "gid":3, - "height":64, - "id":890, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":720 - }, - { - "class":"", - "gid":3, - "height":64, - "id":891, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":720 - }, - { - "class":"", - "gid":3, - "height":64, - "id":892, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":780 - }, - { - "class":"", - "gid":3, - "height":64, - "id":893, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":780 - }, - { - "class":"", - "gid":3, - "height":64, - "id":894, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":840 - }, - { - "class":"", - "gid":3, - "height":64, - "id":895, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":840 - }, - { - "class":"", - "gid":3, - "height":64, - "id":896, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":720 - }, - { - "class":"", - "gid":3, - "height":64, - "id":897, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":780 - }, - { - "class":"", - "gid":3, - "height":64, - "id":898, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":840 - }, - { - "class":"", - "gid":3, - "height":64, - "id":899, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":900, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":901, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":902, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":903, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":900, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":904, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":960, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":905, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":906, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":907, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":80 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":840, - "y":480 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":18, - "name":"level11", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":908, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_sniper", - "bullet_speed":4000, - "burst_count":1, - "burst_rate":0.2, - "damage":100, - "fire_rate":0.2, - "is_auto_shoot":true, - "spread":32, - "spread_angle":15 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":63, - "y":544 - }, - { - "class":"", - "gid":10, - "height":200, - "id":909, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"Ambush\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":510, - "y":-441 - }, - { - "class":"", - "gid":3, - "height":315, - "id":1060, - "name":"", - "properties":[ - { - "name":"game_object", - "propertytype":"game_object", - "type":"class", - "value": - { - "factory_url":"\/spawner\/spawner#enemy_big" - } - }, - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":4000 - } - }], - "rotation":0, - "visible":true, - "width":315, - "x":376, - "y":680 - }, - { - "class":"", - "gid":11, - "height":140, - "id":1061, - "name":"", - "rotation":0, - "visible":true, - "width":1080, - "x":-4, - "y":931 - }, - { - "class":"", - "gid":11, - "height":140, - "id":1062, - "name":"", - "rotation":0, - "visible":true, - "width":1080, - "x":-4, - "y":250 - }, - { - "class":"", - "gid":11, - "height":140, - "id":1063, - "name":"", - "rotation":90, - "visible":true, - "width":1080, - "x":128, - "y":-2 - }, - { - "class":"", - "gid":11, - "height":140, - "id":1064, - "name":"", - "rotation":90, - "visible":true, - "width":1080, - "x":821, - "y":2 - }, - { - "class":"", - "gid":1, - "height":64, - "id":1065, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_sniper", - "bullet_speed":4000, - "burst_count":1, - "burst_rate":0.15, - "damage":100, - "fire_rate":0.2, - "is_auto_shoot":true, - "spread":32, - "spread_angle":15 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":499, - "y":110 - }, - { - "class":"", - "gid":1, - "height":64, - "id":1066, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_sniper", - "bullet_speed":4000, - "burst_count":1, - "burst_rate":0.25, - "damage":100, - "fire_rate":0.2, - "is_auto_shoot":true, - "spread":32, - "spread_angle":15 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":966, - "y":546 - }, - { - "class":"", - "gid":1, - "height":64, - "id":1067, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_sniper", - "bullet_speed":4000, - "burst_count":1, - "burst_rate":0.1, - "damage":100, - "fire_rate":0.2, - "is_auto_shoot":true, - "spread":32, - "spread_angle":15 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":506, - "y":1017 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":19, - "name":"level12", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":1068, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_rocket_small", - "bullet_speed":100, - "burst_count":1, - "burst_rate":0.25, - "damage":100, - "fire_rate":0.25, - "is_auto_shoot":true, - "spread":32, - "spread_angle":15 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":63, - "y":544 - }, - { - "class":"", - "gid":10, - "height":200, - "id":1069, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"Mini Rockets\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":510, - "y":-441 - }, - { - "class":"", - "gid":3, - "height":315, - "id":1070, - "name":"", - "properties":[ - { - "name":"game_object", - "propertytype":"game_object", - "type":"class", - "value": - { - "factory_url":"\/spawner\/spawner#enemy_big" - } - }, - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":1000 - } - }], - "rotation":0, - "visible":true, - "width":315, - "x":376, - "y":680 - }, - { - "class":"", - "gid":11, - "height":140, - "id":1071, - "name":"", - "rotation":0, - "visible":true, - "width":1080, - "x":-4, - "y":931 - }, - { - "class":"", - "gid":11, - "height":140, - "id":1072, - "name":"", - "rotation":0, - "visible":true, - "width":1080, - "x":-4, - "y":250 - }, - { - "class":"", - "gid":11, - "height":140, - "id":1073, - "name":"", - "rotation":90, - "visible":true, - "width":1080, - "x":128, - "y":-2 - }, - { - "class":"", - "gid":11, - "height":140, - "id":1074, - "name":"", - "rotation":90, - "visible":true, - "width":1080, - "x":821, - "y":2 - }, - { - "class":"", - "gid":1, - "height":64, - "id":1076, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_rocket_small", - "bullet_speed":100, - "burst_count":1, - "burst_rate":0.25, - "damage":100, - "fire_rate":0.25, - "is_auto_shoot":true, - "spread":32, - "spread_angle":15 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":966, - "y":546 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":20, - "name":"level13", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":1078, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_shotgun", - "bullet_speed":3000, - "bullets_per_shoot":12, - "burst_count":1, - "burst_rate":0.4, - "damage":100, - "fire_rate":0.1, - "is_auto_shoot":true, - "spread":32, - "spread_angle":45 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":192, - "y":951 - }, - { - "class":"", - "gid":10, - "height":200, - "id":1079, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"Shotgun\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":510, - "y":-441 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1080, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1086, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1087, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1088, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1093, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1094, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1095, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1096, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1101, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1102, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1103, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1104, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1105, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1106, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1107, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1108, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1109, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1110, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1111, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1112, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1113, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1114, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1115, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1116, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1117, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1118, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1119, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1120, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1121, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1122, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":480 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":1123, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1124, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1125, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1126, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1127, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1128, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1129, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1130, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1131, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1132, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1133, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1134, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1135, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1136, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1137, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1138, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1139, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1140, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1141, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1142, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1143, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1144, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1145, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1146, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1147, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1148, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1149, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1150, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1151, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1152, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1153, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1154, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":240 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":1155, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1156, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":180 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":21, - "name":"level14", - "objects":[ - { - "class":"", - "gid":1, - "height":64, - "id":1157, - "name":"", - "properties":[ - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_sniper", - "bullet_speed":3500, - "bullets_per_shoot":8, - "burst_count":1, - "burst_rate":0.4, - "damage":100, - "fire_rate":0.1, - "is_auto_shoot":true, - "spread":32, - "spread_angle":45 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":819, - "y":944 - }, - { - "class":"", - "gid":10, - "height":200, - "id":1158, - "name":"", - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"Hellgun\"}}" - } - }], - "rotation":0, - "visible":true, - "width":200, - "x":510, - "y":-441 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1159, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1160, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1161, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1162, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1163, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1164, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1165, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1166, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1167, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1168, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1169, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1170, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1171, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1172, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":600 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1173, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1174, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":540 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1175, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1176, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1177, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1178, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1179, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1180, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1181, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1182, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1183, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1184, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1185, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1186, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1187, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":480 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1188, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":480 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":1189, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1190, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":420 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1191, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1192, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1193, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1194, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1195, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1196, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1197, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1198, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1199, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1200, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1201, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1202, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1203, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1204, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":360 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1205, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1206, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":300 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1207, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1208, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1209, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":300, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1210, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":360, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1211, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1212, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1213, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":420, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1214, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":480, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1215, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1216, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1217, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":660, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1218, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":720, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1219, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":240 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1220, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":240 - }, - - { - "class":"", - "gid":3, - "height":64, - "id":1221, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":540, - "y":180 - }, - { - "class":"", - "gid":3, - "height":64, - "id":1222, - "name":"", - "properties":[ - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":100 - } - }], - "rotation":0, - "visible":true, - "width":64, - "x":600, - "y":180 - }], - "opacity":1, - "properties":[ - { - "name":"exclude", - "type":"bool", - "value":true - }], - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }, - { - "draworder":"topdown", - "id":5, - "name":"system", - "objects":[ - { - "class":"", - "height":1080, - "id":48, - "name":"camera", - "properties":[ - { - "name":"camera", - "propertytype":"camera", - "type":"class", - "value": - { - "camera_url":"\/offset#camera" - } - }], - "rotation":0, - "visible":true, - "width":1920, - "x":-440, - "y":0 - }, - { - "class":"debug", - "height":0, - "id":83, - "name":"debug", - "point":true, - "rotation":0, - "visible":true, - "width":0, - "x":3, - "y":1081 - }, - { - "class":"gui_main", - "height":0, - "id":84, - "name":"gui_main", - "point":true, - "rotation":0, - "visible":true, - "width":0, - "x":21, - "y":1096 - }], - "opacity":1, - "type":"objectgroup", - "visible":false, - "x":0, - "y":0 - }], - "nextlayerid":22, - "nextobjectid":1223, - "orientation":"orthogonal", - "renderorder":"right-down", - "tiledversion":"2022.09.22", - "tileheight":60, - "tilesets":[ - { - "firstgid":1, - "source":"..\/..\/tiled\/tilesets\/shooting_circle.tsx" - }], - "tilewidth":60, - "type":"map", - "version":"1.9", - "width":32 -} \ No newline at end of file diff --git a/resources/maps_list.json b/resources/maps_list.json deleted file mode 100644 index 15d5e6a..0000000 --- a/resources/maps_list.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "tiled": { - "game": "/resources/maps/game.json" - } -} diff --git a/resources/tilesets/shooting_circle.json b/resources/tilesets/shooting_circle.json deleted file mode 100644 index 5b6ccdd..0000000 --- a/resources/tilesets/shooting_circle.json +++ /dev/null @@ -1,352 +0,0 @@ -{ "class":"shooting_circle", - "columns":0, - "grid": - { - "height":1, - "orientation":"orthogonal", - "width":1 - }, - "margin":0, - "name":"shooting_circle", - "spacing":0, - "tilecount":9, - "tiledversion":"2022.09.22", - "tileheight":200, - "tiles":[ - { - "class":"player", - "id":0, - "image":"..\/..\/tiled\/images\/ui_circle_64.png", - "imageheight":64, - "imagewidth":64, - "properties":[ - { - "name":"color", - "propertytype":"color", - "type":"class", - "value": - { - "hex_color":"95C8E2", - "sprite_url":"\/root#sprite" - } - }, - { - "name":"game_object", - "propertytype":"game_object", - "type":"class", - "value": - { - "factory_url":"\/spawner\/spawner#player" - } - }, - { - "name":"movement_controller", - "propertytype":"movement_controller", - "type":"class", - "value": - { - "speed":4000 - } - }, - { - "name":"physics", - "propertytype":"physics", - "type":"class", - "value": - { - - } - }, - { - "name":"shooter_controller", - "propertytype":"shooter_controller", - "type":"class", - "value": - { - "bullet_prefab_id":"bullet_pistol", - "bullet_speed":3000, - "burst_count":8, - "burst_rate":0.5, - "damage":1, - "fire_rate":0.05, - "is_auto_shoot":true, - "spread":32, - "spread_angle":14 - } - }] - }, - { - "class":"enemy", - "id":2, - "image":"..\/..\/tiled\/images\/enemy.png", - "imageheight":64, - "imagewidth":64, - "properties":[ - { - "name":"color", - "propertytype":"color", - "type":"class", - "value": - { - "hex_color":"612C2C", - "sprite_url":"\/root#sprite" - } - }, - { - "name":"game_object", - "propertytype":"game_object", - "type":"class", - "value": - { - "factory_url":"\/spawner\/spawner#enemy" - } - }, - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":20 - } - }, - { - "name":"health_circle_visual", - "propertytype":"health_circle_visual", - "type":"class", - "value": - { - - } - }, - { - "name":"panthera", - "propertytype":"panthera", - "type":"class", - "value": - { - "animation_path":"\/resources\/animations\/health_visual_circle.json" - } - }, - { - "name":"physics", - "propertytype":"physics", - "type":"class", - "value": - { - - } - }, - { - "name":"play_fx_on_remove", - "propertytype":"play_fx_on_remove", - "type":"class", - "value": - { - "fx_url":"explosion_enemy" - } - }, - { - "name":"target", - "type":"bool", - "value":true - }] - }, - { - "class":"arena_background", - "id":4, - "image":"..\/..\/tiled\/images\/arena_background.png", - "imageheight":200, - "imagewidth":200, - "properties":[ - { - "name":"game_object", - "propertytype":"game_object", - "type":"class", - "value": - { - "factory_url":"\/spawner\/spawner#background", - "is_slice9":true - } - }] - }, - { - "class":"wall", - "id":5, - "image":"..\/..\/tiled\/images\/wall.png", - "imageheight":50, - "imagewidth":200, - "properties":[ - { - "name":"game_object", - "propertytype":"game_object", - "type":"class", - "value": - { - "factory_url":"\/spawner\/spawner#wall", - "is_slice9":false - } - }] - }, - { - "class":"pit", - "id":6, - "image":"..\/..\/tiled\/images\/pit.png", - "imageheight":16, - "imagewidth":16, - "properties":[ - { - "name":"color", - "propertytype":"color", - "type":"class", - "value": - { - "hex_color":"612C2C", - "sprite_url":"\/root#sprite" - } - }, - { - "name":"game_object", - "propertytype":"game_object", - "type":"class", - "value": - { - "factory_url":"\/spawner\/spawner#pit", - "is_slice9":true - } - }] - }, - { - "class":"wall_pit", - "id":7, - "image":"..\/..\/tiled\/images\/wall.png", - "imageheight":50, - "imagewidth":200, - "properties":[ - { - "name":"game_object", - "propertytype":"game_object", - "type":"class", - "value": - { - "factory_url":"\/spawner\/spawner#wall_pit", - "is_slice9":false - } - }] - }, - { - "class":"enemy_rectangle", - "id":8, - "image":"..\/..\/tiled\/images\/enemy_rectangle.png", - "imageheight":64, - "imagewidth":128, - "properties":[ - { - "name":"color", - "propertytype":"color", - "type":"class", - "value": - { - "hex_color":"612C2C", - "sprite_url":"\/root#sprite" - } - }, - { - "name":"game_object", - "propertytype":"game_object", - "type":"class", - "value": - { - "factory_url":"\/spawner\/spawner#enemy_rectangle" - } - }, - { - "name":"health", - "propertytype":"health", - "type":"class", - "value": - { - "health":400 - } - }, - { - "name":"health_circle_visual", - "propertytype":"health_circle_visual", - "type":"class", - "value": - { - - } - }, - { - "name":"panthera", - "propertytype":"panthera", - "type":"class", - "value": - { - "animation_path":"\/resources\/animations\/health_visual_rectangle.json" - } - }, - { - "name":"physics", - "propertytype":"physics", - "type":"class", - "value": - { - - } - }, - { - "name":"target", - "type":"bool", - "value":true - }] - }, - { - "class":"level_controller", - "id":9, - "image":"..\/..\/tiled\/images\/arena_background.png", - "imageheight":200, - "imagewidth":200, - "properties":[ - { - "name":"on_spawn_command", - "propertytype":"on_spawn_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"text\": \"Shoot\"}}" - } - }, - { - "name":"on_target_count_command", - "propertytype":"on_target_count_command", - "type":"class", - "value": - { - "command":"{\"gui_main_command\": {\"level_complete\": true}}" - } - }] - }, - { - "class":"pit", - "id":10, - "image":"..\/..\/tiled\/images\/wall_pit.png", - "imageheight":140, - "imagewidth":1080, - "properties":[ - { - "name":"game_object", - "propertytype":"game_object", - "type":"class", - "value": - { - "factory_url":"\/spawner\/spawner#pit", - "is_slice9":false - } - }] - }], - "tilewidth":1080, - "type":"tileset", - "version":"1.9" -} \ No newline at end of file diff --git a/resources/tilesets_list.json b/resources/tilesets_list.json deleted file mode 100644 index 605ef26..0000000 --- a/resources/tilesets_list.json +++ /dev/null @@ -1,5 +0,0 @@ -{ - "tilesets": [ - "/resources/tilesets/shooting_circle.json" - ] -} diff --git a/tiled/assets/grid/cactus.png b/tiled/assets/grid/cactus.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad34f0d1eff404a978d11edb4b1f86bd267c8c7 GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zKstHHvg#X0+>N|7yWPToe8!R>zhDN3XE)M-oB&T3#}JO|$q5_&A3kv4!+(2b=FjWD zvP;Z}Py5d(_+N5H{Mxwl3IBOK{;+SX+Z)BHlBaw3{D;?BKjhouy)WAv{E3#TYdH8% iYr+F|L7w=>k__?C4w9=DE_6(2>+0?n)^a{_^r+w&0bX9-BkN}9 f9zA+gw~>)S^ODpJ^U16r;~6|%{an^LB{Ts5T^u@M literal 0 HcmV?d00001 diff --git a/tiled/assets/grid/icon_chest.png b/tiled/assets/grid/icon_chest.png new file mode 100644 index 0000000000000000000000000000000000000000..ecd5a352d8fc16b1af9992ad47b34d963b9cc0a2 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&W-sjKjxXx*K`Fotp3fD92b5{MC@CXnPXk@w08Up!i7Cts Y=IQD!Yo2m20nK6XboFyt=akR{0HGf@!~g&Q literal 0 HcmV?d00001 diff --git a/tiled/assets/grid/icon_key.png b/tiled/assets/grid/icon_key.png new file mode 100644 index 0000000000000000000000000000000000000000..97986df60aa6f549f4d9ed1ca187cbcb9e3988a0 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF8|#vxe3y4g84CdSF}(!zC$dZ&&ZJHazy%A_m}myIhkH6pB!uqd45G8JZLU~suA V9DDnsju_A=22WQ%mvv4FO#n7@HWUB= literal 0 HcmV?d00001 diff --git a/tiled/assets/grid/icon_stop.png b/tiled/assets/grid/icon_stop.png new file mode 100644 index 0000000000000000000000000000000000000000..0344112b8e2077fe53e3902d21895f41c0d3622f GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFEal|aXmTV0NbTY z4l2=75-JQkGf$>DG%5OedfxQ#I^4Rc@JyxQjGvh| dLv-sg28M&hvh!2_tppj);OXk;vd$@?2>{piJn#Sj literal 0 HcmV?d00001 diff --git a/tiled/assets/grid/tilemap_packed.png b/tiled/assets/grid/tilemap_packed.png new file mode 100644 index 0000000000000000000000000000000000000000..7740ae53c02478d353162cd6685ee123e6603a95 GIT binary patch literal 6442 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

rnT<^;JoHyY(8ik!4%4YM*jFe-?&W!uq4ZI4mx z;G@nRX6T~!(P__oDK;-#rmm_KUAw4mP|b;E0yEFXEHr`c=lh=>JUz4C&Vgb|Tfxk0 zEc+YtFLP6`4diQ20n%r*%J^|N77qfYvx|(tcL-D011cVMB(dvD(Lg4%)~j&tzh<40 z8bMH`?KOEqKC`QgQmKuZcB`trd@}Z#vTh*2-N62kUpo?&ju1t`zkbeaTeX}5*9ISB(@KgJA6=F)FSkpy*mX0`)b%*w8Z3T2;>M_T=mEjmoTot!P`L zhp*#yDN#bf_y2mB-*OO&=u@< z8_Hh8(kDiTuvPoAtz6&z&WGX57SY%BZMQqWoZ;{FsXFrgPsY1O*LLz zB6_Rj>f4OZshQT3)s0~Hv)lXL5@n&GLOWyFR+8{}sc=PMY#`(kjcu!7saASdo1I>hq$ z@FDH~?AyBM_8fF8tY<~r-b}<(l)kDV!d3Mt1I|{Mn#!SeqXR4K{Q0zi;BueIn801}oNct>YAamlzVxHK0Y^$JFqsPd!Qh_aIG{)%x0L25C&!PZ^k0;Dfnc=2(6lfB$y@aqVO0$o-Lg>ds7~XjlZ^4~ajuEcvY2|Ae!+ z+msVWxE2twIRvQO6}W3_HWwa#O}sHQP1fo@`SPNHS^&4V4=FdX1xH!K445YDQ|o6W v2K>?kWF?cy_9adgZ#9I|a>Pn~54FEJMOlBm{Yv8KV*)VNx6rH7agP2UozSwd literal 0 HcmV?d00001 diff --git a/tiled/assets/grid/tree.png b/tiled/assets/grid/tree.png new file mode 100644 index 0000000000000000000000000000000000000000..321bfd146168505fc7f565c19eb1dcff1b17d7a9 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_(mawBHOhl)nDVH--y6`MI zVx)y8EIg;ha3;FCjxxqvPRMLHJAcM`p7T8K_x(Qa=g0T?KJWY62|p}Y&r}Zp0DygQ zUIewj{Z~35b>{|GKUAA;94>?g0O%Y2D-FQC``gq|gGRu50IGXnQ|dwUocnQi0HF4c zzA8cs001redbtPCHROXB|FEEK!UgHd@Z<8GhPW(M-i}uBcCZeTU{ii!=7T*64q+&;v1|#NM(fOvwvDg;dI_Q!@C3m?Qq;O4FusSi){M;A6?$eD+omv& z_xrt*{p3T2ybF|{uf?8PZXN6}#0%43w8za_+h|_Rf}Cyrb>GN^UFKQ|7bC~EMwGA> zNY!97i={BINOKU7nfy>WGL0AQR`XrSLS$DriO2->q{c^kqN?ZpG~Ne>-lIxKY-9-b zJ0Ctw6MI@Mb#wD%^@5Q7qx9XY3sc1+4yXP_M!eN{&q;R!R>%jK|lezFF7UC6CO% zxoNy?zAk(Hz%}mJg9YVg=?|-01ElkJg2SXv#BJh{wm%NcV!7m(eHOKPORILkO~XeM zX-YquRuZWaTNhiu{DnG1y0pLRpcyFIP7s}Ek)2`ltORl(dEbd&|s;=+*gR#Zy4?R6pZ^rT03Y6nGR?fXV=Vz8)e z%eoP)(YxVlOWwktuTB)9GLPDpnQWMf>pWn01M?8jqp4rf)UFU$v3$MjU`!b#+HN{U z8`BY$>(4L99@ERHHE`IH@I#xHzMu4iR&27$F>B%Nyqa4`VVd3vB6_p z=p?Y>(F9O4!y+E_yq|#S)^=18MjgO0^u7LT{@6%hBQe-D8w#ul)$`mNwY70X0kJK} zILt=nhP#a0YY#t}|A{e?StdPGHrmx$`0j2&Ogl4lk}&SAjvOir;Y$n!nSi?d(7?t{ zMFBMEP9aiDdPZi9&@n6NfPg1WBcdKAEzKK__>^w;hS+kRMQo(xvNW;wOcndczFXhv zdwhB$BTCO06fb&6KZ@B2iGgeA#kK;AVVMpgG!44HfbM zc>}DF)cmE%#YuJra`2+tqrXq}tJ?aW$gN%_mp4=z8R6HTM!N~(s}s_al2WAXWfdiL4N2?=j@cBG1?5Ie-iZ4WuUD-6kJ zo|eKPS({h(uBh@OJT#vP6)QU>;Q{oT_wJCHNyJ(eW?&XQaGPixn1kSRe4Y+Dtqvg6 zCxcJJtmaWZp@TAro7)_etz&3d#VVhZM&6xOE0Qf;faB=}R<$K&cGi*yviOwb=_qq^ z(YMrG=SbbsV~R-Or+fnh-~z*Q&lRjDpi|sxmUHSv+AV!aL)Beff|>py{eNq-uNum!WIYPYuShFMYp<< zbTqOw8+xOcwC3|5eD0QC3Zk5Qx|uoq=?mlNz9p^dY5Gcv*@ZfTIf6$$oeUWWX=#v` zt!AN}GEgHwFZ^+#?>pp&V_?e+>|n!C+8ICvJ1Pd?VTb1!VE@O}>U8uBKwwA#V;Df1 zg~K{}2GGKep%Q+>jxz)JgdL};6muf7_!J+CFfYF&KSz4s$8^j;dN?2-hu~?yB>RKK zqV!S_cFXb`W}=bUZJLZ*vsbwuzGHojkue)biK7d~<$v#YScv>?&!1I~NVGlw0c;JC U7Bs?Q-T(jq07*qoM6N<$f(Nj)C;$Ke diff --git a/tiled/images/enemy.png b/tiled/images/enemy.png deleted file mode 100644 index ab2ab2c11ab85970dee90bf3409583185f360248..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1792 zcmY*Z3s_QT82&*BfsxnEdl8yhDF>`MB_t>`G04kfUedgTWaJbSh$E>fW;adODl5%$ zwn=H))O42GaC0r(W+s-}N}XFzX=N9)(wXg0&bI$N-}&C}``_>V{_lUzbM^;rSVtn* z5&!@so*y?D@oa+`&qLmo;*HVt|?DY(l(Y`5|VgdGC$NP#+Y_&~t2dnb8MqC~HWB>Jf*R`bEe9AX*p<1&U8v zBWe-ikZ^gpfX@(0lBjXLO;etT&T1l#i>_MebX%rTLOeQl^m5U|GWP@(p7KuXcO`#YX&8_$6 zl#921=#(s*9Sa!{GVDNfDh-;`MoO86EF&OQEJ8XP^jUP~JLdm#vwfJ5q4|Ff^M2BI zS!7fefeFoB8;f8Q{Ra;Dh_ZQHP6&*892pd9OScrvQ{67?XoDuIn$*Jt|FAOR7lh?m zHSEnC1-7gSG^6`DBZPM78FBvW8+!Ce^9l>wJz&L0E>5K;&S^TQCj%`l@$M#_q3I3F z3r}#>_dNexXp>+wN_F&HFZ-inUF+fVyt?`L;{5%m)m{fVyZZX5V?mh;s~8`B>uq5H zKGVg1hb6|gVYTUx))!>-mfIaqZk}PSzA)2mye;hZNc?jpj}}zns~=}Xe|=}M(4`Y+ z6dF?`YIh!5oQ2bw=PRz&Rldn?%3sfQMW0Hn?*5{-e&a#d6sAFLlnK!VTUTO9%s$}R z82@G1*~3wN1)&ip+>d7VUC#^8vDiq@S5b7kx@4EmUazTS*}KVASHwrpyfo9HRlU`c zi${FMoGOE#jgHq>Pj{yEd91PMYE7$@E+WL)W&Wm8k8dA^HP*g+12HeQyB$yW;O8WU zXljoRdLP$Zk6M^@XpsF>TRNdQt!v|>RSg=wfWFhg|H0Ul+vcyJ5(akYvG~Un`k(y= zmkyuI$k^3V^;7v`ZASK2qFjRBE+=(Qd7sz(sbTha0bLui+wC$F2=G(1>&(?8bp;-M zxwkO4Ng}mqJ-?T%`Q7E90M+|~K6SBvlS%2Zs@%^$9vG8YeYdLa9-Zjt4C_Lkf=7bf z7!iKpSXzYM{xl(2fUAy;M-9{-wTX_w+Vhc!3uLdw-`1T=YlC@PWO%L3DV;1veN-8q zy)&7IJ_g!KEh4sEFI|YLT8-s)E*M%6%T$6Mbfy)hgN(YmiShu2RBaRaY(*Q(^DmOV(HuM~5ZILsv5lI)H!=RC|M1&@EN@}; zI>M5^9;*`&c86zM!DQfsakc}i>>Sj{?&vo%hQ9@s3(8GN>$(cB^rSDP+_1;kpD@{2 zXc`C08SUY(Dio663rv@@M`7jQU1PJ?PgDi`qUVgR$yJ<`ME4K}4@~r$u?;Av%MGC= z?x8I<{^PjhL9}*v({Am7ymGbwtm{5bi~>$ z%j~ne1lp?+m+3VPV{~*ZR?cS@FWm0q*uC=A%^Nu9x_!F5Ve}Kf;u6>XsQsgp8!d&O zkcrp$2b{gQz0ZPZ4egqN28@=^FD7WsS7z|kMZj_@MKSLYseSUIHD{=23RqsNiriV* z{T!x@m&i5jeN`cu8ru5%moP(dRXN{qKzU7@b9af9(@Q%vtaZPM!(^)}UPw$FTw~5m z-(%K?DM$jap#1IQ(nU{Uhhu&ZFn728^~*AC+DIUa+;`2^_sFeU<%z}~>_pf&(Tr@z zj-vnYF#4e<=}f_=nYY}RC`xw}`T*MrVSdNgzv4fANx?0vxul=OMi2Bf4T{MLI-v#G zPN~8Ebmx3Gr3fE2+PV@QpVQ=Me5msdF+VRLMT3jp(y}%(rTNybQ=#}keT^v4sn{z2 s-c`rk*MBp2YH=l^8Q!LwJi%M+g_Fm(o^p#`Z}_kCd^T`v*2Jp+0hlzgRsaA1 diff --git a/tiled/images/enemy_rectangle.png b/tiled/images/enemy_rectangle.png deleted file mode 100644 index 28f41f95bb3025274f4e7004dd2327f2de0a99ab..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 733 zcmeAS@N?(olHy`uVBq!ia0vp^4M6O`!3HERU8}DLQk(@Ik;M!Q+`=Ht$S`Y;1W=H% zILO_JVcj{Imp~3nx}&cn1H;CC?mvmF3=B*~o-U3d6^w81KJ1J(sQ7$ef=_%=*vQK(b+z1P2sqfgNOS!(&- zX*OE(4Y~_IsC)_!`n6Q4x@^UU>kcohO~0-B`*lgxPv<34(^B`omVd3M9{KQlu-Ec$ zW$`Pxm#zABzA2!#DXz8 zC#>_&|J<|Y_4Z?8ZTrQ!4?k79&{eOdW7p)kZ&UVGWruy|_6s#7ERUL8VBE zMK%9T=d+#v{W$u1nGSzA(JL2G7q5Opra*y3^M>!vn}^|tn()pI!WILXY1hA%?pN5pE%%Od zPx4t_))n$aACIp-ZeGSW_ozg1IH#TWj@z?J@BeA#k3N2@-gTe~DWM4f{L?d+ diff --git a/tiled/images/explosion.png b/tiled/images/explosion.png deleted file mode 100644 index cdcfdaec9f313ca8c407d59066d22663cd4a5e5f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 2092 zcmZ`)2~-p37XBwe9tot65-kd7V^9zz3HuU52z!DAVuBJZMnViSNES(uh)`3DOQVPg z&r+)~Vg;l{v_dR#mYxhF~3d@caFE&yl?0Cl~Oe_C8`1p4IOc1Qni?*k!8wNbWJdMl0ip&6sD0$ zlN9xqV6u?QBZVunq$Gc;C)Jb8#FI!QM%Jb@IzJ+6T8`WWlhf5|C7njg$;qMS_)ryD zn`vG_K|wT6Z<@C^1z}KB+vRGph9XxvPbK*?PlQw@$%2(?SRp5&dBv%UY;`c1j23!( zO!cXT(`G8kRnuc31Jck4&5Pq)epFq+}K}mpxe~>F>(S3QP+bH1u81diPTs zYZ66v78B2)z1^iuyzb2_3G&S{IT4`=8tC^Ay7{+R^WXTN*5wNH#;pFrfL-)9!=O;l z>IE81AI=bOU_xfgR~DXw2M)a0n>$$OgNX-;`1*5t+E&-DL%#6su+Lw#sr})@KYZA$ zSB*Ux{^Z&@>BhvZItLdsu&)Yhed@G8!#8Dp6ke*tP^6B%N=I(vy{50|7Zr}9=N;6$ zKg@rcO(@YUWr;)>({I+C*hN=f7RnfcE8j5n+a~&~0^1jiH|a))t4C9p|K6Ox!F3U9 zLreGK(zN@oeeT-mPJXI8{)5zYisyF4McO^0;(D1)&5cvWQxBt@AKY0t%5NWeV`Y$R z5eu|;zy3D8>W|`m9FNgc1kq0fNo~Wq5br*m)*0V58d^K1s|+B#{9#q-=)6{V@(l-9t)FUn_2m=GgjGrrkD` z3}ZV+1}*hfooV&Kk(Y_)$l9Vp(+%i!>n%lg@g}07;jX6p-<{7I)d&3;Yt9P?a8}p1 zoARZ3ylt?X^9}E`!GQt|F|avKY%HkK6O?8hj3_qOAaD`0%@D(6lfR`=lLVY)~8ypxv7&gvDS z5FBHoC_S_a+VRTp^N^w>j8Y~LjIaC|ob6xGIVLkRD&Dibz-AdK9?zTH8r`hx$q+<2 zzw_?>W5G7G{zV$ zhI8LUo&M6I#iiz2bj^n5_1K{o*|Wr=>jGvsAGMzVG9Kdy=~-U~0*YJIL| z9|SHUUBS%(LjIH5BbSX9cXo=n#Ed}ubk41ltM~!DaLn*(Z;JpM9kr>x>e{WTDI zJzuM6H3#au9!haJ?^iF!EBWpn*+M0T{>d^S)}@&sF+awcZ5Z{gzx z{;xfIjvNQf7YVW!JClk1PO;NaM}1IT1~zupj}NfrbqCf*ojKe}kbGKjl4{C(eKiCV zOK4kZ+1`Ap`a$hVO6PBG-zBf#@%&w*>0=u~b@#x(xaC&Id=lgOYp(YCp4)nNgqV^+ zXe)QA{OPT$ZRp%359_!yOAL(1RXMcTigVW=pN*U&fB*W6@m$C!R q@sBR#F@NfImv`8ho#88-v1c1K9(0l*X+<~s59CC~MVt*w+4VomUlExA diff --git a/tiled/images/pit.png b/tiled/images/pit.png deleted file mode 100644 index a896b11d46890e74e433456032aa1262674b3302..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1090 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Ea{HEjtmSN`?>!lvI6-E$sR$z z3=CCj3=9n|3=F@3LJcn%7)lKo7+xhXFj&oCU=S~uvn$XBDAAG{;hE;^%b*2hb1<+n z3NbJPS&Tr)z$nE4G7ZRL@M4sPvx68lplX;H7}_%#SfFa6fHVkr05M1pgl1mAh%j*h z6I`{x0%imor0saV%ts)_S>O>_%)r1c48n{Iv*t(uO^eJ7i71Ki^|4CM&(%vz$xlkv ztH>0+>{umUo3Q%e#RDspr3imfVamB1>jfNYSkzLEl1NlCV?QiN}Sf^&XRs)CuG zfu4bq9hZWFf=y9MnpKdC8&o@xXRDM^Qc_^0uU}qXu2*iXmtT~wZ)j<0sc&GUZ)Btk zRH0j3nOBlnp_^B%3^4>|j!SBBa#3bMNoIbY0?6FNr2NtnTO}osMQ{LdXGvxn!lt}p zsJDO~)CbAv8|oS8!_5Y2wE>A*`4?rT0&NDFZ)a!&R*518wZ}#uWI2*!AU*|)0=;U- zWup%dHajlKxQFb(KtAm0;uvBf*c%+{$K=S9mtJ-;BSI<8fuC{Tq6z^+fprIUdFo#| z_B@o_(;Vk;=0W$H__yY>pECAbXfgPG_IlZ`t*JrMCl2sbOn7V)=`(BE%F|BQRf-sW zI_`hXcS|`wH!YoU&6kIt6qNq_F{|Y`w4lBuX5m+VpUg>3-iZ(&o%wLN;5Rknq#pLzAt-g~CIwx1IAubAWCesy!! zZQZ-GI(x0!q|;p-6pj`=-*?B#YW>{@TX#HK{xev4#Rr?-%Szf8{!VM1df=bR%c=Vm zUN1~LWNgm*SC~=esgtnsC1+0Ej>T=WzDFP2C~(tYd(VUzwSe6sIrSXpzsg=Ro9*<> zdC$LR5=s9q+!L4jbM~fdDDxRMwlhzZjP)0-s@%|VsCe^Q@T_`bX~te;_|DL16+d|r!KS?y~)7+#ZQ=LBYVL;o#34l84PdD t@Uz_(k+fnh-~z*Q&lRjDpi|sxmUHSv+AV!aL)Beff|>py{eNq-uNum!WIYPYuShFMYp<< zbTqOw8+xOcwC3|5eD0QC3Zk5Qx|uoq=?mlNz9p^dY5Gcv*@ZfTIf6$$oeUWWX=#v` zt!AN}GEgHwFZ^+#?>pp&V_?e+>|n!C+8ICvJ1Pd?VTb1!VE@O}>U8uBKwwA#V;Df1 zg~K{}2GGKep%Q+>jxz)JgdL};6muf7_!J+CFfYF&KSz4s$8^j;dN?2-hu~?yB>RKK zqV!S_cFXb`W}=bUZJLZ*vsbwuzGHojkue)biK7d~<$v#YScv>?&!1I~NVGlw0c;JC U7Bs?Q-T(jq07*qoM6N<$f(Nj)C;$Ke diff --git a/tiled/images/ui_circle_64.png b/tiled/images/ui_circle_64.png deleted file mode 100644 index c74547d003d6d35f63b233192cf44fb55e95e4e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 787 zcmV+u1MK{XP)|B(;dt~AYjWN?pEK- z0%J3XUEbdRMKm(ZoX9B^yAn&R#rEuyixu|#N9+KLq9`Zd5T{eIwOGcdlZidynKWnQ z1!J)Xu~#0COzf78s^-B&jyJ(?t$EvFg*i$&p1NhQf9{dvkHciWf!Xs@Er7s6edW8g``4J{-LRWI||o%fK;fdpi)491z#666}SpWDSYQaO$Dw3G74M%E`=!I zGcJw_U^Cv9kRD>|bCm+$NFQHuIHrIy`IqF928+m+{u$|HffVqutNT%;+5@me0Io8akH%ka7@!ob-|-00rr#(5`?N1mK1AazFqMq?f~` zJ8Y+ma?%F|MDns7@Qd{Ej6)fKpQMi+4(_n{E9vPO9>)W5;WmYTkRDd$g{uI3ebfdT zrpBtZ0+j;nT$u(H?A(PC&FS&bRgjC_xB;kjhph@$6fUdgGMTP5LRch`Qdm?azf0GE z$ae~>n+#uW+WyfR04tM_QepM3tv8Yi8}^?^It6*ami=Yh=igNn{1`6_P!I zd>I(3)EF2VS{N990fib~Fff!FFfhDIU|_JC!N4G1FlSew4N#&bHNrE^*Ox&H$mU>R zWfWpy2C^7|kbzN(0c0AG#o)y#4QB^2YCzR6F)*}eGO$3^L;-0K@Bm_v9th36fDvKh z0w%cX6APH(Y$K4itfvxLK#H@#BeIx*fm;}a85w5Hkzin8I*}O?Q4-E(HYzo1&C7s~{IQsCFRFRw<*Tq`*pFzr4I$uiRKKzbIYb(9+UU-@r)U z$VeBcLbtdwuOzWTH?LS3VhGF}m(=3qqRfJl%=|nBkhzIT`K2YcN=hJ$-~i&zlFT%O zO?kyoZvj2150cS0)HBe>rY*H16NfgC3`85)Ul8kTK!#aG2Bj9~=ahn+WoK?=1GWK0 z5aB+E288<1yv!0im=-i)bX^e$d4x5{g6JCji!xJz0SR`OA=FvOVo2&izOxF*tVqp? zaLLR~%_|1^#mvM;AFBkqM(6yT{G#B3#N<>vpgmwMNJ8kU!PZ3LvIa>4s?kOt6xT>` z4@p>HQDDll*js!t_jUCJ% Tv@RU~56bYKu6{1-oD!MVM%xNb!1@J*w6hZk(Gggd8Vg}V@L(#+Z&9$3KP7w1Cd8K`GBN?e*uV7*~APaPYBBZNr!n4fF#2w7Iq*xK^^3x2AhM7 sK - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/tiled/maps/grid.json b/tiled/maps/grid.json new file mode 100644 index 0000000..d9eaec0 --- /dev/null +++ b/tiled/maps/grid.json @@ -0,0 +1,189 @@ +{ "compressionlevel":-1, + "editorsettings": + { + "export": + { + "format":"defoldcollection", + "target":"..\/export\/grid.collection" + } + }, + "height":20, + "infinite":false, + "layers":[ + { + "data":[65, 66, 65, 66, 65, 65, 66, 65, 66, 65, 66, 66, 65, 65, 65, 66, 66, 65, 65, 66, 66, 65, 65, 65, 66, 65, 66, 65, 65, 65, + 65, 65, 65, 66, 66, 66, 66, 66, 65, 66, 65, 66, 66, 65, 65, 66, 65, 65, 65, 65, 66, 65, 66, 65, 65, 65, 66, 65, 65, 66, + 65, 66, 66, 66, 65, 65, 65, 66, 66, 66, 66, 66, 65, 65, 66, 65, 66, 66, 65, 65, 66, 66, 65, 66, 66, 65, 66, 65, 65, 66, + 65, 65, 66, 66, 65, 65, 66, 66, 66, 66, 66, 65, 66, 66, 66, 65, 66, 65, 65, 66, 65, 66, 65, 66, 65, 65, 66, 66, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 65, 65, 66, 66, 65, 65, 65, 65, 66, 65, 66, 66, 65, 66, 66, 66, 66, 65, 66, 66, + 66, 66, 65, 66, 65, 65, 66, 66, 66, 65, 65, 66, 66, 65, 65, 66, 65, 65, 65, 65, 66, 66, 65, 66, 66, 65, 65, 66, 66, 65, + 65, 66, 66, 65, 66, 65, 155, 156, 157, 101, 102, 103, 65, 65, 66, 65, 65, 65, 66, 66, 66, 65, 65, 65, 66, 65, 66, 65, 65, 65, + 65, 66, 65, 65, 66, 65, 173, 174, 175, 119, 120, 121, 65, 66, 65, 65, 65, 66, 65, 66, 66, 66, 66, 65, 65, 65, 66, 65, 66, 66, + 65, 66, 66, 65, 66, 66, 191, 192, 193, 137, 138, 139, 65, 66, 65, 66, 66, 65, 65, 66, 66, 65, 65, 65, 66, 66, 65, 66, 66, 65, + 65, 65, 65, 65, 66, 66, 91, 92, 93, 96, 97, 98, 66, 66, 65, 65, 66, 65, 65, 66, 66, 66, 66, 66, 65, 65, 66, 65, 66, 66, + 66, 66, 66, 66, 66, 66, 109, 110, 111, 114, 115, 116, 65, 65, 66, 65, 65, 66, 65, 66, 65, 65, 66, 65, 65, 66, 65, 65, 65, 66, + 66, 66, 66, 65, 65, 65, 127, 128, 129, 132, 133, 134, 65, 65, 65, 66, 66, 66, 66, 65, 65, 66, 66, 66, 66, 65, 65, 65, 66, 66, + 66, 65, 66, 65, 65, 66, 65, 65, 66, 66, 65, 65, 66, 66, 65, 65, 66, 65, 65, 66, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, + 66, 66, 66, 65, 65, 65, 66, 66, 66, 65, 66, 66, 65, 65, 66, 65, 66, 66, 66, 66, 65, 65, 66, 65, 65, 66, 66, 65, 66, 65, + 65, 65, 66, 65, 65, 66, 66, 65, 65, 66, 65, 66, 65, 65, 65, 66, 65, 66, 65, 66, 65, 65, 66, 66, 66, 65, 66, 65, 65, 66, + 65, 65, 66, 66, 66, 65, 65, 65, 65, 66, 66, 66, 66, 65, 65, 65, 65, 66, 66, 65, 66, 65, 66, 66, 65, 66, 65, 65, 66, 66, + 65, 65, 66, 66, 66, 66, 65, 66, 66, 66, 66, 66, 66, 66, 66, 65, 66, 66, 65, 66, 66, 65, 65, 65, 65, 65, 66, 65, 66, 65, + 66, 66, 65, 65, 65, 65, 65, 66, 65, 65, 65, 65, 66, 66, 65, 66, 66, 65, 66, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 65, + 66, 66, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 65, 66, 65, 66, 66, 66, 66, 65, 65, 66, 66, 66, + 65, 65, 65, 66, 66, 65, 66, 66, 65, 66, 66, 66, 66, 66, 65, 66, 65, 66, 65, 66, 66, 65, 65, 66, 65, 65, 66, 65, 66, 66], + "height":20, + "id":1, + "name":"back", + "opacity":1, + "properties":[ + { + "name":"exclude", + "type":"bool", + "value":true + }], + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }, + { + "draworder":"topdown", + "id":2, + "name":"items", + "objects":[ + { + "gid":243, + "height":16, + "id":1, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":16, + "x":173.068, + "y":137.38 + }, + { + "gid":243, + "height":16, + "id":2, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":16, + "x":149.337, + "y":140.956 + }, + { + "gid":243, + "height":16, + "id":3, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":16, + "x":155.513, + "y":120.151 + }, + { + "gid":246, + "height":16, + "id":4, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":16, + "x":98.6251, + "y":180.616 + }, + { + "gid":246, + "height":16, + "id":5, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":16, + "x":157.139, + "y":162.086 + }, + { + "gid":246, + "height":16, + "id":6, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":16, + "x":100.901, + "y":117.226 + }], + "opacity":1, + "type":"objectgroup", + "visible":true, + "x":0, + "y":0 + }, + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 58, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 0, 58, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 58, 58, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":20, + "id":3, + "name":"tile_items", + "opacity":1, + "properties":[ + { + "name":"exclude", + "type":"bool", + "value":true + }], + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }], + "nextlayerid":4, + "nextobjectid":7, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.11.2", + "tileheight":16, + "tilesets":[ + { + "firstgid":1, + "source":"..\/tilesets\/grid_tileset.json" + }, + { + "firstgid":235, + "source":"..\/tilesets\/grid_items.json" + }], + "tilewidth":16, + "type":"map", + "version":"1.10", + "width":30 +} \ No newline at end of file diff --git a/tiled/tilesets/grid_items.json b/tiled/tilesets/grid_items.json new file mode 100644 index 0000000..68640d0 --- /dev/null +++ b/tiled/tilesets/grid_items.json @@ -0,0 +1,60 @@ +{ "columns":0, + "grid": + { + "height":1, + "orientation":"orthogonal", + "width":1 + }, + "margin":0, + "name":"grid_items", + "spacing":0, + "tilecount":7, + "tiledversion":"1.11.2", + "tileheight":16, + "tiles":[ + { + "id":7, + "image":"..\/assets\/grid\/cactus.png", + "imageheight":16, + "imagewidth":16 + }, + { + "id":8, + "image":"..\/assets\/grid\/icon_barrel.png", + "imageheight":16, + "imagewidth":16 + }, + { + "id":9, + "image":"..\/assets\/grid\/icon_chest.png", + "imageheight":16, + "imagewidth":16 + }, + { + "id":10, + "image":"..\/assets\/grid\/icon_key.png", + "imageheight":16, + "imagewidth":16 + }, + { + "id":11, + "image":"..\/assets\/grid\/icon_stop.png", + "imageheight":16, + "imagewidth":16 + }, + { + "id":12, + "image":"..\/assets\/grid\/icon_table.png", + "imageheight":16, + "imagewidth":16 + }, + { + "id":14, + "image":"..\/assets\/grid\/tree.png", + "imageheight":16, + "imagewidth":16 + }], + "tilewidth":16, + "type":"tileset", + "version":"1.10" +} \ No newline at end of file diff --git a/tiled/tilesets/grid_tileset.json b/tiled/tilesets/grid_tileset.json new file mode 100644 index 0000000..d957c21 --- /dev/null +++ b/tiled/tilesets/grid_tileset.json @@ -0,0 +1,30 @@ +{ "columns":18, + "image":"..\/assets\/grid\/tilemap_packed.png", + "imageheight":208, + "imagewidth":288, + "margin":0, + "name":"grid_tileset", + "properties":[ + { + "name":"tilesource", + "type":"string", + "value":"\/example\/assets\/grid\/grid_tileset.tilesource" + }], + "spacing":0, + "tilecount":234, + "tiledversion":"1.11.2", + "tileheight":16, + "tiles":[ + { + "id":0, + "properties":[ + { + "name":"tilesource", + "type":"string", + "value":"\/example\/assets\/grid\/grid_tileset.tilesource" + }] + }], + "tilewidth":16, + "type":"tileset", + "version":"1.10" +} \ No newline at end of file diff --git a/tiled/tilesets/shooting_circle.tsx b/tiled/tilesets/shooting_circle.tsx deleted file mode 100644 index c7982fe..0000000 --- a/tiled/tilesets/shooting_circle.tsx +++ /dev/null @@ -1,181 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - From 19470cd02b539c1c07fe6a43c43b4d336d466321 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 09:36:38 +0200 Subject: [PATCH 06/71] Update --- example/assets/grid/entities.go | 42 ++++++++++++++++++++ example/assets/grid/entities/cactus.go | 11 +++++ example/assets/grid/entities/icon_chest.go | 11 +++++ example/assets/grid/entities/icon_key.go | 11 +++++ example/assets/grid/entities/icon_stop.go | 11 +++++ example/assets/grid/entities/icon_table.go | 11 +++++ example/assets/grid/entities/tree.go | 11 +++++ example/example_grid/example_grid.collection | 11 +++++ example/example_grid/example_grid.script | 13 ++++-- 9 files changed, 128 insertions(+), 4 deletions(-) create mode 100644 example/assets/grid/entities/cactus.go create mode 100644 example/assets/grid/entities/icon_chest.go create mode 100644 example/assets/grid/entities/icon_key.go create mode 100644 example/assets/grid/entities/icon_stop.go create mode 100644 example/assets/grid/entities/icon_table.go create mode 100644 example/assets/grid/entities/tree.go diff --git a/example/assets/grid/entities.go b/example/assets/grid/entities.go index e69de29..acdbe8b 100644 --- a/example/assets/grid/entities.go +++ b/example/assets/grid/entities.go @@ -0,0 +1,42 @@ +embedded_components { + id: "cactus" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/cactus.go\"\n" + "" +} +embedded_components { + id: "icon_barrel" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/icon_barrel.go\"\n" + "" +} +embedded_components { + id: "icon_chest" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/icon_chest.go\"\n" + "" +} +embedded_components { + id: "icon_key" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/icon_key.go\"\n" + "" +} +embedded_components { + id: "icon_stop" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/icon_stop.go\"\n" + "" +} +embedded_components { + id: "icon_table" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/icon_table.go\"\n" + "" +} +embedded_components { + id: "tree" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/tree.go\"\n" + "" +} diff --git a/example/assets/grid/entities/cactus.go b/example/assets/grid/entities/cactus.go new file mode 100644 index 0000000..1cdc797 --- /dev/null +++ b/example/assets/grid/entities/cactus.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"cactus\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/grid/grid_items.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/grid/entities/icon_chest.go b/example/assets/grid/entities/icon_chest.go new file mode 100644 index 0000000..cd20347 --- /dev/null +++ b/example/assets/grid/entities/icon_chest.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"icon_chest\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/grid/grid_items.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/grid/entities/icon_key.go b/example/assets/grid/entities/icon_key.go new file mode 100644 index 0000000..5d705d6 --- /dev/null +++ b/example/assets/grid/entities/icon_key.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"icon_key\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/grid/grid_items.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/grid/entities/icon_stop.go b/example/assets/grid/entities/icon_stop.go new file mode 100644 index 0000000..5c4dfa4 --- /dev/null +++ b/example/assets/grid/entities/icon_stop.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"icon_stop\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/grid/grid_items.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/grid/entities/icon_table.go b/example/assets/grid/entities/icon_table.go new file mode 100644 index 0000000..44172c9 --- /dev/null +++ b/example/assets/grid/entities/icon_table.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"icon_table\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/grid/grid_items.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/grid/entities/tree.go b/example/assets/grid/entities/tree.go new file mode 100644 index 0000000..db9937f --- /dev/null +++ b/example/assets/grid/entities/tree.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tree\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/grid/grid_items.atlas\"\n" + "}\n" + "" +} diff --git a/example/example_grid/example_grid.collection b/example/example_grid/example_grid.collection index ebf8124..93f2cae 100644 --- a/example/example_grid/example_grid.collection +++ b/example/example_grid/example_grid.collection @@ -1,7 +1,18 @@ name: "example_grid" +instances { + id: "entities" + prototype: "/example/assets/grid/entities.go" +} collection_instances { id: "grid" collection: "/tiled/export/grid.collection" + position { + z: -0.1 + } + scale3 { + x: 2.0 + y: 2.0 + } } scale_along_z: 0 embedded_instances { diff --git a/example/example_grid/example_grid.script b/example/example_grid/example_grid.script index 9170ed1..a21c94c 100644 --- a/example/example_grid/example_grid.script +++ b/example/example_grid/example_grid.script @@ -5,14 +5,19 @@ local function spawn_entity(entity) local prefab_id = entity.prefab_id local components = entity.components local transform = components.transform - local position_x = transform.position_x - local position_y = transform.position_y + local position_x = (transform.position_x + (30*16/2)) * 2 + local position_y = (transform.position_y + (20*16/2)) * 2 local position_z = transform.position_z + local scale_x = transform.scale_x or 2 + local scale_y = transform.scale_y or 2 local factory_url = "/entities#" .. prefab_id - factory.create(factory_url, vmath.vector3(position_x, position_y, position_z)) + local position = vmath.vector3(position_x, position_y, position_z) + local scale = vmath.vector3(scale_x, scale_y, 1) + factory.create(factory_url, position, nil, nil, scale) - print("Spawn entity: ", factory_url) + + print("Spawn entity: ", factory_url, position_x, position_y, position_z) end From 7f29ba46f443bd4f4e5c419c942223368d28e8af Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 09:58:45 +0200 Subject: [PATCH 07/71] Update --- detiled/internal/detiled_decore.lua | 13 +- example/assets/empty.png | Bin 0 -> 2803 bytes .../assets/grid/grid_ignore_export.tilesource | 4 + example/example_grid/example_grid.collection | 24 +- example/example_grid/example_grid.script | 11 +- tiled/detiled.tiled-session | 7 +- tiled/export/grid-grid_items.tilemap | 50 +- tiled/export/grid-grid_tileset.tilemap | 582 +++++++++++++++++- tiled/export/grid.collection | 15 + tiled/maps/grid.json | 111 ++-- tiled/tilesets/grid_items.json | 6 + tiled/tilesets/grid_tileset.json | 81 ++- 12 files changed, 787 insertions(+), 117 deletions(-) create mode 100755 example/assets/empty.png create mode 100644 example/assets/grid/grid_ignore_export.tilesource diff --git a/detiled/internal/detiled_decore.lua b/detiled/internal/detiled_decore.lua index 311ef55..1e6af37 100644 --- a/detiled/internal/detiled_decore.lua +++ b/detiled/internal/detiled_decore.lua @@ -32,8 +32,6 @@ local function get_entities_from_tile_layer(layer, map) local grid_module = get_grid_module(map) local map_params = grid_module.get_map_params_from_tiled(map) - local map_width = map_params.scene.size_x - local map_height = map_params.scene.size_y local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 local layer_data = layer.data @@ -63,9 +61,6 @@ local function get_entities_from_tile_layer(layer, map) local tile_j = (math.floor((tile_index - 1) / map.width)) local pos_x, pos_y = grid_module.cell_to_pos(tile_i, tile_j, map_params) - pos_x = pos_x - map_width / 2 - pos_y = pos_y - map_height / 2 - local prefab_id = tile.class or tile.type if not prefab_id or prefab_id == "" then -- Take from tile.image as a default prefab_id and strip path + extension @@ -325,9 +320,7 @@ function M.get_defold_position_from_tiled_object(object, tile, map_width, map_he map_height = map_height or 0 map_width = map_width or 0 - -- Get offset from object point in Tiled to Defold assets object - -- Tiled point in left bottom, Defold - in object center - -- And add sprite anchor.x for visual correct posing from tiled (In Tiled we pos the image) + -- Offset from object point in Tiled to sprite anchor (default center). Origin (0,0) at map left bottom. local base_width = tile and tile.imagewidth or object.width local base_height = tile and tile.imageheight or object.height local scale_x = 1 @@ -385,10 +378,6 @@ function M.get_defold_position_from_tiled_object(object, tile, map_width, map_he position_y = map_height - position_y end - -- Transform center from left bottom to center - position_x = position_x - map_width / 2 - position_y = position_y - map_height / 2 - return position_x, position_y, scale_x, scale_y end diff --git a/example/assets/empty.png b/example/assets/empty.png new file mode 100755 index 0000000000000000000000000000000000000000..36b4ff13ef659b6f359f09f9a83ee730559439be GIT binary patch literal 2803 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 Date: Sat, 14 Feb 2026 10:03:42 +0200 Subject: [PATCH 08/71] Update --- example/assets/camera_wasd_control.script | 48 ++++++++++++++++++++ example/example_grid/example_grid.collection | 16 ++++++- example/example_grid/example_grid.script | 3 -- game.project | 7 +++ input/game.input_binding | 30 ++++++++++++ 5 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 example/assets/camera_wasd_control.script diff --git a/example/assets/camera_wasd_control.script b/example/assets/camera_wasd_control.script new file mode 100644 index 0000000..b33d9e6 --- /dev/null +++ b/example/assets/camera_wasd_control.script @@ -0,0 +1,48 @@ +go.property("movement_speed", 400) +go.property("zoom_speed", 2) + +function init(self) + msg.post(".", "acquire_input_focus") + self.move = vmath.vector3() + self.zoom_delta = 0 + self.move_up = hash("key_w") + self.move_down = hash("key_s") + self.move_left = hash("key_a") + self.move_right = hash("key_d") + self.zoom_out = hash("key_q") + self.zoom_in = hash("key_e") +end + + +function update(self, dt) + local p = go.get_position() + p.x = p.x + self.move.x * self.movement_speed * dt + p.y = p.y + self.move.y * self.movement_speed * dt + go.set_position(p) + + if self.zoom_delta ~= 0 then + local zoom = go.get("#camera", "orthographic_zoom") + zoom = zoom + self.zoom_delta * self.zoom_speed * dt + zoom = math.max(0.1, zoom) + go.set("#camera", "orthographic_zoom", zoom) + end +end + + +function on_input(self, action_id, action) + local v = action.pressed and 1 or (action.released and -1) or 0 + if v == 0 then return end + if action_id == self.move_up then + self.move.y = self.move.y + v + elseif action_id == self.move_down then + self.move.y = self.move.y - v + elseif action_id == self.move_left then + self.move.x = self.move.x - v + elseif action_id == self.move_right then + self.move.x = self.move.x + v + elseif action_id == self.zoom_in then + self.zoom_delta = self.zoom_delta + v + elseif action_id == self.zoom_out then + self.zoom_delta = self.zoom_delta - v + end +end diff --git a/example/example_grid/example_grid.collection b/example/example_grid/example_grid.collection index 0964501..a3c1838 100644 --- a/example/example_grid/example_grid.collection +++ b/example/example_grid/example_grid.collection @@ -21,7 +21,21 @@ embedded_instances { } embedded_instances { id: "camera" - data: "embedded_components {\n" + data: "components {\n" + " id: \"camera_wasd_control\"\n" + " component: \"/example/assets/camera_wasd_control.script\"\n" + " properties {\n" + " id: \"movement_speed\"\n" + " value: \"100.0\"\n" + " type: PROPERTY_TYPE_NUMBER\n" + " }\n" + " properties {\n" + " id: \"zoom_speed\"\n" + " value: \"2.0\"\n" + " type: PROPERTY_TYPE_NUMBER\n" + " }\n" + "}\n" + "embedded_components {\n" " id: \"camera\"\n" " type: \"camera\"\n" " data: \"aspect_ratio: 1.0\\n" diff --git a/example/example_grid/example_grid.script b/example/example_grid/example_grid.script index 26ec51c..d1c7e61 100644 --- a/example/example_grid/example_grid.script +++ b/example/example_grid/example_grid.script @@ -15,15 +15,12 @@ local function spawn_entity(entity) local position = vmath.vector3(position_x, position_y, position_z) local scale = vmath.vector3(scale_x, scale_y, 1) factory.create(factory_url, position, nil, nil, scale) - - print("Spawn entity: ", factory_url, position_x, position_y, position_z) end local function spawn_map(map) local entities = map.child_instancies for _, entity in ipairs(entities) do - print("Want to spawn entity: ", entity.prefab_id) spawn_entity(entity) end end diff --git a/game.project b/game.project index 3a21441..771dcd2 100644 --- a/game.project +++ b/game.project @@ -22,3 +22,10 @@ dependencies#2 = https://github.com/Insality/defold-event/archive/refs/tags/13.z [library] include_dirs = detiled +[input] +game_binding = /builtins/input/all.input_bindingc + +[graphics] +default_texture_min_filter = nearest +default_texture_mag_filter = nearest + diff --git a/input/game.input_binding b/input/game.input_binding index 8ed1d4e..276e70b 100644 --- a/input/game.input_binding +++ b/input/game.input_binding @@ -1,3 +1,33 @@ +key_trigger { + input: KEY_W + action: "move_up" +} + +key_trigger { + input: KEY_S + action: "move_down" +} + +key_trigger { + input: KEY_A + action: "move_left" +} + +key_trigger { + input: KEY_D + action: "move_right" +} + +key_trigger { + input: KEY_E + action: "zoom_in" +} + +key_trigger { + input: KEY_Q + action: "zoom_out" +} + mouse_trigger { input: MOUSE_BUTTON_1 action: "touch" From 87a0fdff7034ec9ab0caba9bdd534bb8d90035e9 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 15:25:22 +0200 Subject: [PATCH 09/71] Update --- example/assets/camera_wasd_control.script | 1 + .../assets/hexgrid/hexgrid_resources.atlas | 7 + example/assets/hexgrid/hexgrid_tiles.atlas | 37 ++ .../example_hexgrid/examle_hexgrid.collection | 2 + .../example_hexgrid/example_hexgrid.script | 56 +++ tiled/assets/hexgrid/r_tree_round.png | Bin 0 -> 9298 bytes tiled/assets/hexgrid/r_tree_round_2.png | Bin 0 -> 13927 bytes tiled/assets/hexgrid/tile_dirt.png | Bin 0 -> 5096 bytes tiled/assets/hexgrid/tile_dirt_2.png | Bin 0 -> 5063 bytes tiled/assets/hexgrid/tile_dirt_3.png | Bin 0 -> 4897 bytes tiled/assets/hexgrid/tile_grass.png | Bin 0 -> 5621 bytes tiled/assets/hexgrid/tile_grass_2.png | Bin 0 -> 5371 bytes tiled/assets/hexgrid/tile_grass_3.png | Bin 0 -> 5499 bytes tiled/assets/hexgrid/tile_sand.png | Bin 0 -> 4104 bytes tiled/assets/hexgrid/tile_sand_2.png | Bin 0 -> 4194 bytes tiled/assets/hexgrid/tile_sand_3.png | Bin 0 -> 4279 bytes tiled/assets/hexgrid/tile_stone.png | Bin 0 -> 6053 bytes tiled/assets/hexgrid/tile_stone_2.png | Bin 0 -> 5656 bytes tiled/assets/hexgrid/tile_stone_3.png | Bin 0 -> 5968 bytes tiled/detiled.tiled-session | 39 +- tiled/maps/hexgrid.json | 357 ++++++++++++++++++ tiled/tilesets/hexgrid_objects.json | 30 ++ tiled/tilesets/hexgrid_tiles.json | 90 +++++ 23 files changed, 611 insertions(+), 8 deletions(-) create mode 100644 example/assets/hexgrid/hexgrid_resources.atlas create mode 100644 example/assets/hexgrid/hexgrid_tiles.atlas create mode 100644 example/example_hexgrid/examle_hexgrid.collection create mode 100644 example/example_hexgrid/example_hexgrid.script create mode 100644 tiled/assets/hexgrid/r_tree_round.png create mode 100644 tiled/assets/hexgrid/r_tree_round_2.png create mode 100644 tiled/assets/hexgrid/tile_dirt.png create mode 100644 tiled/assets/hexgrid/tile_dirt_2.png create mode 100644 tiled/assets/hexgrid/tile_dirt_3.png create mode 100644 tiled/assets/hexgrid/tile_grass.png create mode 100644 tiled/assets/hexgrid/tile_grass_2.png create mode 100644 tiled/assets/hexgrid/tile_grass_3.png create mode 100644 tiled/assets/hexgrid/tile_sand.png create mode 100644 tiled/assets/hexgrid/tile_sand_2.png create mode 100644 tiled/assets/hexgrid/tile_sand_3.png create mode 100644 tiled/assets/hexgrid/tile_stone.png create mode 100644 tiled/assets/hexgrid/tile_stone_2.png create mode 100644 tiled/assets/hexgrid/tile_stone_3.png create mode 100644 tiled/maps/hexgrid.json create mode 100644 tiled/tilesets/hexgrid_objects.json create mode 100644 tiled/tilesets/hexgrid_tiles.json diff --git a/example/assets/camera_wasd_control.script b/example/assets/camera_wasd_control.script index b33d9e6..e639baa 100644 --- a/example/assets/camera_wasd_control.script +++ b/example/assets/camera_wasd_control.script @@ -3,6 +3,7 @@ go.property("zoom_speed", 2) function init(self) msg.post(".", "acquire_input_focus") + self.move = vmath.vector3() self.zoom_delta = 0 self.move_up = hash("key_w") diff --git a/example/assets/hexgrid/hexgrid_resources.atlas b/example/assets/hexgrid/hexgrid_resources.atlas new file mode 100644 index 0000000..e47acd1 --- /dev/null +++ b/example/assets/hexgrid/hexgrid_resources.atlas @@ -0,0 +1,7 @@ +images { + image: "/tiled/assets/hexgrid/r_tree_round.png" +} +images { + image: "/tiled/assets/hexgrid/r_tree_round_2.png" +} +extrude_borders: 2 diff --git a/example/assets/hexgrid/hexgrid_tiles.atlas b/example/assets/hexgrid/hexgrid_tiles.atlas new file mode 100644 index 0000000..888d110 --- /dev/null +++ b/example/assets/hexgrid/hexgrid_tiles.atlas @@ -0,0 +1,37 @@ +images { + image: "/tiled/assets/hexgrid/tile_dirt.png" +} +images { + image: "/tiled/assets/hexgrid/tile_dirt_2.png" +} +images { + image: "/tiled/assets/hexgrid/tile_dirt_3.png" +} +images { + image: "/tiled/assets/hexgrid/tile_grass.png" +} +images { + image: "/tiled/assets/hexgrid/tile_grass_2.png" +} +images { + image: "/tiled/assets/hexgrid/tile_grass_3.png" +} +images { + image: "/tiled/assets/hexgrid/tile_sand.png" +} +images { + image: "/tiled/assets/hexgrid/tile_sand_2.png" +} +images { + image: "/tiled/assets/hexgrid/tile_sand_3.png" +} +images { + image: "/tiled/assets/hexgrid/tile_stone.png" +} +images { + image: "/tiled/assets/hexgrid/tile_stone_2.png" +} +images { + image: "/tiled/assets/hexgrid/tile_stone_3.png" +} +extrude_borders: 2 diff --git a/example/example_hexgrid/examle_hexgrid.collection b/example/example_hexgrid/examle_hexgrid.collection new file mode 100644 index 0000000..e9916de --- /dev/null +++ b/example/example_hexgrid/examle_hexgrid.collection @@ -0,0 +1,2 @@ +name: "examle_hexgrid" +scale_along_z: 0 diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script new file mode 100644 index 0000000..3f95ef0 --- /dev/null +++ b/example/example_hexgrid/example_hexgrid.script @@ -0,0 +1,56 @@ +function init(self) + -- Add initialization code here + -- Learn more: https://defold.com/manuals/script/ + -- Remove this function if not needed +end + +function final(self) + -- Add finalization code here + -- Learn more: https://defold.com/manuals/script/ + -- Remove this function if not needed +end + +function update(self, dt) + -- Add update code here + -- Learn more: https://defold.com/manuals/script/ + -- Remove this function if not needed +end + +function late_update(self, dt) + -- This function is called at the end of update cycle but before render + -- Learn more: https://defold.com/manuals/script/ + -- Remove this function if not needed +end + +function fixed_update(self, dt) + -- This function is called if 'Fixed Update Frequency' is enabled in the Engine section of game.project + -- Can be coupled with fixed updates of the physics simulation if 'Use Fixed Timestep' is enabled in + -- Physics section of game.project + -- Add update code here + -- Learn more: https://defold.com/manuals/script/ + -- Remove this function if not needed +end + +function on_message(self, message_id, message, sender) + -- Add message-handling code here + -- Learn more: https://defold.com/manuals/message-passing/ + -- Remove this function if not needed +end + +function on_input(self, action_id, action) + -- Add input-handling code here. The game object this script is attached to + -- must have acquired input focus: + -- + -- msg.post(".", "acquire_input_focus") + -- + -- All mapped input bindings will be received. Mouse and touch input will + -- be received regardless of where on the screen it happened. + -- Learn more: https://defold.com/manuals/input/ + -- Remove this function if not needed +end + +function on_reload(self) + -- Add reload-handling code here + -- Learn more: https://defold.com/manuals/hot-reload/ + -- Remove this function if not needed +end diff --git a/tiled/assets/hexgrid/r_tree_round.png b/tiled/assets/hexgrid/r_tree_round.png new file mode 100644 index 0000000000000000000000000000000000000000..85bc7433277d97adfbdc5f7b2e6ce4051f2d2011 GIT binary patch literal 9298 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 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid/tile_dirt.png b/tiled/assets/hexgrid/tile_dirt.png new file mode 100644 index 0000000000000000000000000000000000000000..99e69bf9c3b4cfbe30e202e69807f20063b2c1ce GIT binary patch literal 5096 zcmXY#c{~*VAIHbK@2#v5p%j*!g~(#va;(}Vw~E|H?%Re1wk)qs$ zB1dA8a~rV%2=13g^vXQ0Cs&nty|!=1w2Sh4B+{X zy$=s~VfNOu@C5*9=E*_h7ngMt0M2CSYiXc^vQ}Py^P1~?6+2bp>EfQ`VPtQ_Hdl?^ z$@0a{HMBrjchi&Aur|xBqUUHNgA-dm*nHy|qi0)wX54upy+y(2*(175&K{3Ps>{Q) zb5NyMdKpLdfj55{ar@evZ=A6D_sk;S!INHyG5=#9q&pDB344w+;ePJ zvFs-2vwzu?w@Wupa*Es)c-*`gBIwQ=K%!NU>HPTQeo%_Z)b%=cwYp8$v_`*Ko~KSS zZ+d6|?EBsFsbgyMd5S46L=kc$_+VkBY-e?q^Zl;MZ^l4d+~HyMF`MT0bjoKZwH5EQ zvIPvFMfTl!8vQolZ|Ci>)qNt8#DdieuOvYSr1tkU>wLXKRlZ?}?KX0SiZtq!^^}jL zC}{|mJgXRPMzEy=hCh2z%aD_dz;Kb^76#YE0hE|DFXXWV3jpZsh<;tzh5|rD9Oiq$ z=Nti4IMpZ{-PH}`P`5G>#rQx_ag3dsi?pQ&hMhhvM6(3LK(}AHobWj#kPbLAh3QHF z>172(DgNvU?Ga{1_)d!@`^v9jaLVjJN$7RySw+Y5zlD<{z z`Z#6g6R1-Z=Bf%pOjtGekSnN-mqZXzrJ$rn|9X$)o_U6;=e^Wi?hnKR6UMNjaIe0`YDe+v2;Xu|l((s+(ItOV?a zV7^fXieUNQQa&@R5^ON%0R3A`7aXicFRczOTnd&fWHWOMmw2MSi#6Aw1%49`fr69p0vc%Rh-r zeNxQAe4@R@dj@uz0qoSG{AD=$#J`gD31*>xq9dUG#G_H`eSrDWTDNFY@4p9s|C~fx zKCKOl2gg-*Tf6q#$tZM5-9i(kq4iTkEf3FKo28AKC+Z@+_%&*a}7Z|%sA#45BIy4 zJ(W96roy;!01!07I2LRh;UWkCcj_LCS(A)u0Pd=>>Om3`uMo#8`JfeI@5}uJ2o0}K zmu~naLFW>?)N#*%sR@GL6Oy!+wu@`?4-CZ#U3q6)Aq3w39jw189JT&Od%rP8Xa)M2 zZGNy{XXif9MK8p_tsR>%<~Pv#QCM$QGU|(V&yOVlc*q7oH-S%?yuj$@ZvewIc5S5e zlH}P<&B;w#5#gM%nW>(~_I{7xG0SYS_o0c>qOS&~j8qm5GXw?J3IJD(ht!6I1`g zkZR|RgU4)P%cxwO?%KjRQAso#9oc&isSpg)dRn?{dgAx)!dw*pH(ilSR`#YrO4-j) zIH>e1BU|fFrhfQ}of&ilS58O3pGmc2nvDzUFyz6-3PhB#og7P-F7^)Mdi{Y!33P^C z_P$K;`sk41y)Tbe0^kDl&H=&eEg!NVXyH$44^qyamAzk3A>YqS|LGz&cjqtIJH$In z+jhzYCCMv&{PaYZ)oe$fJ$|qkiC|9Fi0n_e`@_{5^(EcewCJn&Y>oIw+SAkS8(`Lp zbg!sg;z^Ly;~ZBp^5LF4STd_ww_9CC5&5D3eZKFR)NEQ}$gyM!D`-)zqb^)Cvs<{` zAlQ<>^H&SpgM^;TX$5ZKz_JbvT*;8A{xjlKqA3pFX>p~(hn$C-NyMWcq2J@5!c!8O z!9<^)l4nRs`1`6m%MnvDReTnbQ>0dTHW3MmUyoXM{9_^L@+IClE^52Od!ig&d&kfe z2i@_ehzA}OvSizt@L=ce2N=5y}vr#$!&&*6gkU z+q&E3XX03Fa#@7UxQ0K|{W@*j%+oEtxII6(u2F}CA$#uF*tHHD<|2eD1;6o0iL@`g zv9|)Z_>2#Ew!up(Cmd>hEuYA(3vT^6aBxHDW?6C6I#rG?`WCo*h6I5{SQ%ZM#H{?8 zChFWhHcl*i#?#*8M0kwe-Ne?pncnfj-)+y>q;Y*3AFYVUCoIKObi{_^aYmF^tmn%; zzZiH-s#s}~kxfQ6^H;UY{+Ho~J2bqYC@;@_83k0f^0j(vT)m3{@Mbg4{$q@PSDE75 zn_Re9ni6QGM)=5QfhD|#jEPFHL6>}kB7Yd((FhVnnDW44H)|_U^1? zQC^h}$6jpWCYB*3iUjdr7*fTwVB?Na{q+|qrV{!CE+=NTmi{la1eO|_l0MISZxP#* z<#`DH#o-(zEMtl5!6EJA^}QV;Qbo%)T#iDpf{$O)rXy>{klRgdIc#nbENox{`$oAk z%4|AkK`Kgx@|zz`K5i6P|H%^my^2Zw>3|0c+EKr4Rs&VwPc5>l7lkTF1q9*_-8A$ga4-FvUG$9 z;w{`zysYCiJ4Czqk3T)BiQ%^(BZL}Y}pxnTFCU1d%g z;*%u^K=9@Shl;(mp`Q0Z3Es=OI0?v2e=hrqTgvw>0Wo3zOdxErSFxG;$J~^wxp#Fj za%CIQ6tHhL&2c=VS=Vuhm5o#W*>GK0iKaxfO;-6vEvx}dCmyS6Sc=;+fc(8s##)TNf&ggP!03JF;So? z=t#8OoXGLAdYEH&4#51Pxh{6(-{sS>iVRmW{&?Od$jsSt=nP37iR6MiR5DLL5cw?9 zn6zIdKkr7axia#cl`^dqick+R6EpIVvEvIP+dNcX7NQH8;MQ@B6+4J9;*Kn*okEAV zwS8Oh|4!w4NW~@&SP%xjZBfm?`JaRAd+aCVtf^c%BAdi!g2Ouq zU4HZ4RfdbS%mu0c`1q(@!37$|5p93Wg`4tQ&#dt}Dl>= zfo-VLg|U7ucgD49%UrE3SeN@ZV^OsWE1y6M8t2jAi=o(GkCMHUJC*(W;QZy5Y4myI z?3JbZ^JyY^MvfAP%^qh)spx)Z0GNZL3yYz3hnsF5--dZAqm7~y}x7htDRry#`!3Rn5K?Aq%3`2CJBnf?j36?SjRt8A4oy8o7Qvaw{w z9ytyw|B5fPQBdORs{Q#>!f!pq(x%D2_PcZPYS;LUrQ7*003iLRM&U%LGu$*mL+oRe z$LD{}_V2VdjwZO9@3BK>7%i#^h^!F^fVv@}1@|meT-D#wjsAL#uV4aFF)l%o+`F(j z<2Az}ecO^I3WD22w=* z?x?9*xL)}xrTC^O4K%W%&woR6UbQrAu=}aO3jC&pTit>$&((O_#x)J4qLR^GqvQ=u zvj&u)u_z4yEk+$-_4py{{Cm#!r(#|+MPnS(GSF}Hi*Jn0m<)+deqS*NS9(nk0QNG_ z@Cp=l-r?9ukuP<^^~F0=o-n4E&LijLw{>wY(`heaO+=>Vn~a_OiHIy?T5rFNwJT$^(Ep>&2BkpeQ4%Dt)0DwKw!7~>c-7T#T%{1PzX_N&RGfld_SD|zr-UtdmYrd0-h{+AHgKt-Fq`i{} z!yd>tG127knRt4gtAGfF$c3*<5mMU(b+Y2x_%lrjKXMxE{9#a)a|2<2z6!{Thl$nD z>kY@ct#~V~>4YnRudYHBNZ$SI$j-2}yfF7jk=(v61pvV?NEbNI`>_{i^dE+v)xKy&_ohoQeh_~{;SKQ{DSDFj-z3qsx-%beqC}a-^p|9wWQ=me{#m;7)OhAnhWuBnDM>iu za<@5UI_MnuAw@Zd9%lIxAvDMt6~@!Y8m*043fN|6W5S$+O35y)e7I7(swS=~Kkfwb z0@%FS!A;Wi?`U^if|}4EGje=HiY=Gh$d96cUQO{UcJ#`=5;j?D0v4+bYU}?057g1K zA~;$^knT{1>++>N8BSa`Hr>mv^f!C_`JCO4^An6!m&)3mRaAM{n#=^B?a%;v-&stN zZ)gBO7%GXLQh0rIw?~)WUr4Kp@^zv!_-aC>EBoPFyCc4WNkp^pzuTcmEQ-4PYo8Nz zHm%~w(5M)tP( z{@dSCpuvjuJSHS>F^qO!>)|e4*?ydwMH)<@osuMhZ`Lh}$LnK(i5*@q(wq+v9Fb0T zlZZys((j!E3aQVXR)0nINl>P@j2|h5(vEqT2CkX4`{!pqKU`{eTktSEn5269HeMmI zxAZ0*uPl12_dfB_Q)G)C^h6(>E`#!dekxXUm3}u~AA>yOKkTr~D6j_Td1g}QO zA@Dxy79b2hcqC_@ZIi_~FCVV4Yl<^_-nx-%o7PoT0Ob@SW-LK~rW&FQfLW zcvIlU7Gi(St0tx_R&lZyer7ho3Kc3LcCb>Kx{-JqwX?z?Ex4OaOhZ;?ixG{2r=K5u zRSmc|S1$#)3+w!+^>279Y^6K-Kr_%eP=w!^?fBrrhSh9`?u(ZnJ5#?)Qv+vfGnL&m z64(H#&d*&8?SIFC;9~TcBE}h)lw|yKn|osRi=wzha=fQ2_A?dOUi+Txa#cB1H{-j@ zgM1hGv)Te1SzZSwzu?n59#+xd2L!`$Pg%3l5M` zv3P#uj2)226cCuz~IU>R7x<*V9h9?wgBA-TH&|p;DXPe z1J?+uDrC$Z*4m1&BmN-|V23d5ARq_KK^ZC47&}roD8p^-t^l7`2k9`07!1jh1@*Z@ z;PXl>=s44!WXTRfJ_bbOfGI1{Z_XB93QmLnTGR)-&o^0+2HgN(%96g8in9Cc$by`E ztDp`n#X|FXJLyv_6M?1~$N_DZFVvhF-VvM;f4{sl8AAm-(`Od)!c~ued=H2(m0-;( zVQ|eB|CFUIax5EJC;<*4j`ydH^lKK~sU-&L!>TZKOvBDZi)B^Fhl)01>C|2lgWEvC zQf;2YWXyF|DU=%p-OtJkZ85|bvPj#}PoO-kURRGg!>3r@r_{8OZG5aWuRyyvmh~AJ z21_zy<;O1{fyY?!Pr!SJJYd43 z(Xl)BwP55%>%*#-+-xs_G|Onuk*>r=If*iRNIyrmI(|{EQ9r{x0}YG&lc9#j;0dkK zF!s*503%n9H1-G>fUYn-cKQ_ujbC3|_DO-Fv;$p6h{X10neoFkwA%E?h0A>U^`5C^ z?v0MQ=_A_GfHd&9o}pxoCvZd(a>h9R4j+8*i=_ow0uVi;iZ93{P$9|<-cuayD-Wda zBY>OS&9jFW;1t-DZgwEw!t9!o>xuMmfN}MNDdS?OmH`~yfF~TD>KsyXRj?tIqIaX* zY{WQ%D$&$-aV%stg?1wA#(#_wgK6nfs#Ojr2oWsmV?5wQHUS)JsF(a)Fz z1p3?E^x+Dg4bl%)W2gB=U;7euSZskna2v~*T|rWlUW^J`V= zlrw(`M~i!kI9qJVb4FWM)Cz6Dqs3eXd^SeEaoAPTD}M-{uMUv1Guo zL6`)UKB7-6PRncX^AvqovQ^BLs+6r%U=E7&Jnx%L^Kii8Od8Lv8?)_0r0D+?zo;6) z(TC)nPC;;FTZ&H8w^raoWolOhyYKc7seR6VSuM0+ zT?SSIZdBdqT_J=_t~knfi2Xq<3dqcl4qNsZ(RpAsQnj%)>*qF zDbwi|wwi8-L+;30)O;{Acsy`2(SwYRyD&x8UT6*4kIy-09F+-p7wCH0pY4W9FMgrP zA9GnaSzOl)Rf$piK~!B&D97Mo*RL?F?_^LcGI#u)F3gO8mi%BjE9|{B#D6gr=F)9f z=}Seycw}@YhMXMmU2UQ56q{S;!NND!JgD?MK`Cm7x34rg#Os^Ex?yH*sLzVWkW6j? zRQhJyIxmSim)GxeZ;2a|c!pL|yoaE`^3nA!iapGCgp|l$%d?(svt6z_;Ao>EwBnK{ z)#nj;d3u}dGM7nUi_x9=`KapuZlD&E+0?&ay=hywkACX2Mr1cz^F)NSJqR4>`CQxP zAYI7$MYUF-n|Wo(V3jh~(Rv1wD|kwXr%>!)Ov#0_>7J=v6j;S|cb~!HCxNNWp>O#k zKt{~8e{k_j`nBr6^^!mYGJ0l!R&2grUbDD*zTx;-{qDr-`NKU4P`_$4{F=AJRXY;Z zVr#zAOH!6_ySjZ%;c(BLQQXS;JpSh0zfrEb($S&W(1WhZg}drUNc+67M{yG}!jm7A zzc%`cMMhhAQu&6tgjaB%Gs=B#7tWUH9@G=HyIZrYNF z=+|G#L#E|HozL|fdJPs!=rBm-2|z7wt9kla3G|6u{&RjxFD*ZuF;w%qPeG>%w>){h zUVMPau{X5a^cCy7$^yMvPM9U12xMRLUlybv1IKB!?I*_tVJ2Br*Qr{)#^3z zJB4cXwyB=odLFqkf2#PsgEVyVAIC{9q-;J^LZz=guo!i%ipS7g6l#~t;9>v3#6~l!(C+R217~TzrZl)R2TUtQ^((PuY^d zcIF_$VM+m(P3+2`_KHw?+1^}60Cj_NT>#dF3!ul?Sq0-)Hga~C@6lrWgS7&0!J*N- z{h^>;{fv3rt#Bip(KQB1{g7T6n#~v=>8SiS3OS>RtVDSZtIOsx8+O)>(G11Sp+dd1 zp0TC_na;d`$iLnV)QaXyFnJ+O1clIKN8`?O|N1HTkiuxc1JSuYl8H%MhAbR7lJ>gt zpgX1oOq2JI&K(qIlKC%c0k_8=$zY@tgMqL z?A9pU!Txa@Yf@^cJ=uVdT@Sv-V~+y{yu!2AmKgG*9xJ7_gYvyLi1>RG5(nX8SmjLeUJ7MuN+&X+;oG|!bMy05=J41%yluFd&YNmiE9SJL< zpk;{gVP}m|$0(T)Yy2;KISMe6Z>kMhkG8mo10v7#+9Tpum)T272$RikIPIi0k5ZG} zmrwU0#O4jo9*Lkpxn7sSr@|m9Zu;;5-dP6(t;CAw=pR+D4bO1XFD;u>Kh=BDFy+Vczy{-68}4 zR(80Xn0MdH>XI&OB!0hM>(5NdvDQn`gtQL*X!5UIcNH*b`x}_HF7b2m-=74|{Pubi ziNu!mny{TQt8>)O!B!&xz`&8Cmkz!vJ`H(5;1R?w38u=Z_hakA3cj1XN7jV=F6L#B zuI%2Q3q4PfELmu@Hmzu3NLd78%bGTNx9_h*Kk#Q)qVAV+eGIer4*#g?DkF-By{mC0 zg>3xsRE+7&Z*8fY%jKON<+jy^I1NEBTxR1>8>x6@_*B`oV_gejjI_`DFG5DwEC&7z ztzUfm^%WCSsw>s{9Ln?duBt`tY;)3~{c~YJ_2N%EL_7n4IiD&FJ5s2RpAowy?K{SO z6vB3fA=r=@v}{>pV0&xN8GN-gN1%rE%lPQJv}dV!$Im%1$Oa`m&66Ks5wgUSG@NkEvZ%vQs923 zT`u%o{(r~ReZL9EXIsBF@yL4>Z&-Hhy*&nFk*?Qls?7}<)zLB9Db31uUNji4ga@G|O zr)xrDGgKNcD2D02#3pZyByk!%J(Qoat9^LMEBsZW>&0{m53ZXzKvxE89}wEV+%9=~ z6Q+Q)PJWCTk1FA*8vP&aAW;HdYdJe~#_onI8yZ6nF8~PeYs(j_-T(39X)^G}ro>_62{5;&S$}5MAtYFTR z7?Alr-vAS?AemmbF{BvIR?V)@^kg1`@!iJ;i-nF_=SUn2UD9{JtqqU{ipl*LsG&QS zyfMKC@R}7?RT+gC72S_UV~`!Ml}Fv5N9HguP2>6_<_$!AIrGH*5e>}<_Ox^pe-r!p zo^;hg<2V%~Xdg;+?_xoXrmf|Ed_cLC5VULbY#|eKh(BUvOY(wb^2H_%XDIuoY@Ch9 z7g5NpYExYx0kJNG97aullGW#3in_9MQ>C@A` zXKUj$)5T9Kl#&-LLr8lwL4f8!tm-yIPbAs+!P=+cKb?QeEoy}M3aK;fd832ALCojh z%o<7xG4u}uV!FVt^I+8jlb1XZYpL`oJ+RTR1x+YttDAS<&Sp%*2WXj0 zL!i!)?mOdRE;xm51sERn0zA)QxlrpimBJz;C>7gqgKTB3EF~6TdU@Tz#GRCndf)et zK9WS{Z+~$#!X`}o7VOOfp2eg5Y{Te+U+YiQ9I6G2RB5;R2^LxUgqG49y!rD6RY5wE zS_LS9KkRv>XdvYDG3Asg1CKr)PJd)&{oBg}w|*lN9dy0bt8G+%6;4)ibqn$MRy(XV zCK^rdEI#7Tu|~w-gBmJQVIN)aSyXC)QP-_Y6+?=JvwbmxzxlEXo@3q&4c@>-PS8iT z#_ySdtt0{hn_o6g0gyZ$+qPJ>6DvYmBMP+vw`$)0I51D34M$keOvtwpcXNL&^_E&m zcyUBvNy^^}IOl}&;E>2fVC!K$+jN8I}D`4`R)}+Nwm9kr3 zf!B9m(0{e5k(FcO@^plVP5*s8<#*ff&rmb{lpdyG(fuU~fBVqU2vwBmsNw_0-f<7) z$rjYgprExXrAe$p{&OcF37ZlTJp<_-K&;3x%P1e1;1k0&PI3UC)BdjNE0T#umQ?=s5U%{t{pNC_NA$lZ7ta=D&sL4) zFL@5OCOmsL1ieh*zJcKpcplH>)GtFdh0eTVVqPNH6uy=A&QeI!@vWP*Tq=+L9R+$| zHq-07zutSN*Xew_&o?&juOT#khJRFXUicoZ$#yq^(wh`miB~WaxLTd)=8ciVZx#*b z6?IvJaQs`D)_k~Az1}X`??-nep3!N#zx8;1-eA?}u>vuCWhwQk2Of%B|0|HxQ7~N4 zYB!!*BKM_pJ|pOpFfB>%ZRw~H{l-ia?pXj|bFX8ey75t1&j7`K@z$!0 zj=)_cd2IzYwk(7Tj%Q{Hc9rv z2bK3He+St%@I`1Y?QgCI3*>V5OFK9Fy{;+z?L4>7uu=3kBH)syt?z~{EG;*@V3e$f Y2YkhdNnTkU1(gBQiRB08|VL0D!djGG11+td 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 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid/tile_grass.png b/tiled/assets/hexgrid/tile_grass.png new file mode 100644 index 0000000000000000000000000000000000000000..a58afbbe8c3dcda419ad251c9811d935cfcabd4a GIT binary patch literal 5621 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 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid/tile_grass_3.png b/tiled/assets/hexgrid/tile_grass_3.png new file mode 100644 index 0000000000000000000000000000000000000000..5a7c76c3c2a6a80a621ac9a7912efe3c9536a669 GIT binary patch literal 5499 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 Avj6}9 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid/tile_sand.png b/tiled/assets/hexgrid/tile_sand.png new file mode 100644 index 0000000000000000000000000000000000000000..82da166c90a331e9a11ef790b1a230492eb13843 GIT binary patch literal 4104 zcmYLMc|26z8^2>WvP?|Yj4?DCBFR!Q#x#~JV@88yNs@}9Y!QRJ@4SVINC?f?XKZE3 zo)#4KW+y~sH=-lh%b&9`qe4e$fRoGBpY|wJtxS`=cGT*bYy0&%(SO!bh9q(T({i3 zb6Qz>JVW!}=`9gueF})|cf#~Xwa?_5 z8AwMJa~rr{Y)+dV<9Hf}N!z!wfJv5ZIhHoqPn1KQ5CAh?zNQf0F9@(F#54;N`antzEe_*(4W#&vKY=>QgOvK3T)cw-NYT?| zB?N(#RbEF*YaM{2a{m&+c-n*9-*5ThLdv;Z6nK^XvIQ6Z^7t5G5#Gd zz&W;mpz!~|Xn=_~+qJlY;2jSLG6(Yi4_*%B;>~s~BOu5G!{WXBot)JUk|8|u6lM>o ziQ5Z;id~?XZ_i8u3~O$#81@QEowuVM7k+)U{Z$k2{$u*Yd6}2!$5~h< z@za=GU10Yrer&F2CB>Uiaj*jv3m?EMV4Hs?&_v@T6(nO-W zV8&5;fh_!o-7qk-mb6FUVenGAY0!hBK(8P(R|Iai4`7OS-u8vt?cD`2#6Q4$KWLfd zamDmv01~28^*DvOdtwZ$KqhGd)QA$M6p?av!6{1NAF!}%5oOwCodxBAbW#@n1$ZtH zy(~N}cQ+2bZU3qB*tXFU~{RsSQ*t+N%QG&2zQM$D``qGn; z3d~OAeS#Q8!n&`v$J|wm-JpvpMy&reV>`2Rs#FLRP_?BQ?xb8lX}GI)pa}maWG&Vl zY5eh0obR{1Pq$g+kWOJ`AiO9+_ICUZ(S-6isNj$TUS8 zaf2IsIor8{O2mwniZ?f|yFU*HE~8}l--o}ej@idCT7=ZxIQzPk zFASDRxk+>@Uyh6XeR4+z!^dr2b+0>|PB21Ss*#q@DK3?a$x?(?{~9wec;MBw_Cb=B zG&VVraeBi_2+q?kNrUm{xW`>4KdUGXS4~9k)iz4S)1rE;pIX};Xwo?paR5L!og@&# z#o#=PdksY%{L1hvV29@$*$OIMYWZneV?+n(&IA*}nww{5vpkk ziEQxJJQg&peoMJl!L;k~PVXHk1pSlF-OVV}Y%b<&*(pf+X{)9zMkEtND&%n3GuV1mQVK0C(i?+>?GHJppf*R@v(jAdY2oj20Nyq ze|I!33HUlaTi%(A?HjCIvdCMxP-J>GRAplKGdQU>SKW>|7dlOqLk=*}nvhHhJ zz|>c|n@a|H<*uKNcmcT1x6^8zHmxBay}@cpDuPn9p^sF<6@5DnfY)?r#htiaA;3=3 zmo2U2oD2QUHs!wuylXU~%a2%d393$dMLNemu95TsoB`oTA zNn~)T1V!kwk^@~sm1CDL-I^)VyN@YB5{@^xkBDCnyjs6}9GBT|908V#)Dfc$#h
qC{DqQN6 zx|E|$5wd7P5hu(iCb(L~uS%-U8KH2va9VGbQ60gFgqr@L}2tZRb2c zJ&}q;pBa~T$3P))o{L8v=)Gp%hHeIMyd()pGD~5jNQkIJzcER$k+AAHSYe7c=`jU( zxBs{D9*U3(IUAd(@F2Rkd`5fi@UO|E89qxpyxq%UqWj2s8DOzcm^7g7nh9_u@Gr zp$6_ZZohfvCOt4j;>Pg6))Gjqv#ECYy}(|$}~Au9)ajrjNP!`V$U==;YnR8~)y zy@II{qa7);2Ps0cO_f}i27e#A8Vq1c%t9;J6C)$F{_{R%8FB*l`FP!Lu+b-rCuu~H zp5Jp2`uwZ07uncm4-Tx@MaUTu0$!MC61zfsRr7~NpZW8>QJL!1i{hURbugYeL7%s>vC+dUi4<%j)hOt8u?XCQl+~y+VtbE!n7a9pj4=7;q68L7%neTM z69QvzDSxj@{&NXx>DJz0uNj+2NKV@f5 zk{yR^$Tviw@^ynd zAWkkMgh|N{KCAoCgNCquINC7&1y?E)s0Otbv|4-|v!ee6jST-@^Q`S+X2|WO8!HAr_%sW9zwmA0HWPF|vB`73RKmg| zu+)~913M~)%Y$BF^WSCQtB`rv*t3!LY}DnTOEs48Zazw@rc2G3Jz?G%^|&zMog0Ah z6trXKFgcDa>{9+Qzh`?#7rxd=w&(bG{2ErD4_y4t^~jnovGYF|BD*rMG+mUQ`PCYp z>%?YuOOCdD?1mU9@U!|OYo~^eyVypP#FtIz^E%7wh{LXB3(6Jt)<%x$!MNP ztwKgE*2hKnkBXzXb8Q=w$aiac0$&kdsCRLzYnJuE}i4AC`S;qmo)g&u-9 zu1{1kcD!6RP>#m=b&4J`o^SYI+grjFsuX0jSI)I~d^~$kVm6QSt?k*CYmse3*a%cb z%^s=z;yC5GO(ze(s1vP)Ky= z9#guj)0BQ5_6E7mPRS$>DjcXrZVxsQiG zX8oE+0f8{z^kh`2XHZ^cy=&dgq$liA$rd4)8UOkW*gRkBj1@xa+sej1IBR%`DLQYH z#XfEY$$t8AaY}~r9X*rsYIt)OIG)W+CbB%Ho_=&VYupUAuP2heL zHJj}4{(5c5Q=H6KADLlr3$v7&R6yvSjPH3_4PS%BF z@hjQKojf>BjqMkv`^?=N1SN`Hl*06`^}ikLM6E_u9g0Z&URG&BZE`5_N_+VkX@Et)V1FY)l9mor83rRl;E zW7fX=+g;%IwP-77* zt37mLIY!&z$JkBnAcpsc=m)P{8&c$+4TiA`ZZRjzD&X_HN)!tX@TJ>KjCOaHamhWO zhc;`L$;lz7+R@+0Rh$K*R8LT1;R%(btY#+3@JP-#yptCBa6jG9c=L*u(Wk*+P;e9! zyz~7pPZ7?Bno+j|T~TiiPSoojRm@%pv#MMhlw9g9bN_f@N~oQ0Z2XQe+~ebwo{klB z+M~bE*CNm-vkHe*lijWxKwIgV)&YveWg~Hjp=Vg0OHvj;7Z&fYx*)UgL7MJ!w?4W? zJgR$}+LeA}%gKzIdV-C*o)4D9vx551HJc>?5cNSFX0e6l13`x2a}wGZA8G*x4Rt*CtM2NT>c zq&`(w$rIGoeY+Y?&p(Q({(dQ`;=!i?YT_`?mY@RP{>#gp2B-yw7}f&COw! uA4oGVXNu8lx-KihqYYbWIyqRUZE>~CO70yW)e-R59yn!6B$VRaqyGoGJ9R?< literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid/tile_sand_2.png b/tiled/assets/hexgrid/tile_sand_2.png new file mode 100644 index 0000000000000000000000000000000000000000..56b68caea47f95b05b81b4d47e3c89c3f73e7483 GIT binary patch literal 4194 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 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid/tile_sand_3.png b/tiled/assets/hexgrid/tile_sand_3.png new file mode 100644 index 0000000000000000000000000000000000000000..c042efb2fe015cbb256c2a99f537d82613bd43a9 GIT binary patch literal 4279 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 $aW zq=A2R>K!~A*3i%ircD8rcTD^K9cLaB3&+7eh5hEj>g@78KkMtBmoezASV}OC-fhl) z)u_=nG~dDrCwr7(i;+_;8a*!``j>$V`2qbZRHPG{g+F` zW|640`IGh4!1<~Z@Yh1VjUZ>sU^5jo~0 zrZ>?#S{PW0m2VL;WTF?G=!b$|D2s`myZ>eGaq-O$qX!g!x<>K+lB|`j$|3K(Y`;-g zj~1#kn~!rLDcijMW3lcQ}rQ^m*U=Z9a)ReaRerWU7ivaB(+pe z8I;1sYeWl{tEy-1I>IWZxy_nZ(R!<^BWvyoahy2IKsVw8$j{@BnMh%KlcJv~ys%z% z-niT+0l)t6&V37o_LI-hm4AlG_Y$^(%*(WxFOOOq5}i+d!;KmOw0%(@W`{-DP>)p4 zm4o4^9D;I5rQmfZ1j`?ctgvDIK2TVn+z`L}w_sY>sR*^sk*S(6z<~W<1Lh+}x4d)v z?Y~D9SasL^&LZ5-AZY6a*NngK`(D>t==t!czLay=QiTais&!y*R8i)naJ6OsBc%YvBhxREjmW@u1G3>K6u1q{M zYFavB@XalpWZ?iXAa7qau69leYw6n3gDP-+2EEG%1{dtw=$0=IAB@O3blYqc)sWy6 zqO`<`cO~v@GG|g;i0wWr>#4moyR3>ACpbUu*W}-W%_=RJ{{}vs*VtbF=*W8uJPrF( z>5zcX^{Fi_sq~UN>fq*paLahX=m|`TYronFER^q3%^J7)nMt(X4ybB0B!fup&&Hd` zIzM4aLzas?U&Zn%1Yo{Mc&xPSRQq>`($3qVh3B0~_17tmbRRDGZduigS^mY_R{T2W z%T=Z%y?$YrK<{$&Qm*C>NS-c1M;s}5b@wS~!y@^)oOMOl`g5nQ!OveRx0y$zzi*DF zBQY4xa$!rWPS|@a;f4fS~PEf(haUnrZ z{1j_6(M3L9k?S4GpsSZkG+nq1!^pP98q~5nwda4fd<}vtU;iA83bcBh+QMI^vNLN? ePpwFLTcW5O#!zuU%SGT%1jyXj3R8}DiTMu)H~c{W literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid/tile_stone.png b/tiled/assets/hexgrid/tile_stone.png new file mode 100644 index 0000000000000000000000000000000000000000..bc372b618e2298e420787d2fbd83d1b54eb0fd87 GIT binary patch literal 6053 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 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid/tile_stone_2.png b/tiled/assets/hexgrid/tile_stone_2.png new file mode 100644 index 0000000000000000000000000000000000000000..6f0599b7f84a234acf1417c2c46ac09fd0a0d261 GIT binary patch literal 5656 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 F{{fV>!$bf8 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid/tile_stone_3.png b/tiled/assets/hexgrid/tile_stone_3.png new file mode 100644 index 0000000000000000000000000000000000000000..e573470c1f31ed394505f2a47caf2aa5bcf499ce GIT binary patch literal 5968 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 literal 0 HcmV?d00001 diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session index b2b96f0..231354f 100644 --- a/tiled/detiled.tiled-session +++ b/tiled/detiled.tiled-session @@ -3,14 +3,26 @@ "height": 4300, "width": 2 }, - "activeFile": "", + "activeFile": "maps/grid.json", "expandedProjectPaths": [ + "tilesets", + ".", + "maps" ], "fileStates": { ":/automap-tiles.tsx": { "dynamicWrapping": false, + "scaleInDock": 1, "scaleInEditor": 1 }, + "maps/grid.json": { + "scale": 1.05, + "selectedLayer": 1, + "viewCenter": { + "x": 251.42857142857142, + "y": 288.09523809523813 + } + }, "maps/grid.json.tmj": { "scale": 2.2745, "selectedLayer": 2, @@ -21,8 +33,8 @@ }, "tilesets/grid_items.json": { "dynamicWrapping": true, - "scaleInDock": 1, - "scaleInEditor": 6.0716 + "scaleInDock": 3.0191, + "scaleInEditor": 1 }, "tilesets/grid_items.tsj": { "dynamicWrapping": true, @@ -33,7 +45,9 @@ "dynamicWrapping": true }, "tilesets/grid_tileset.json": { - "dynamicWrapping": false + "dynamicWrapping": false, + "scaleInDock": 2.4562, + "scaleInEditor": 5.2012 }, "tilesets/grid_tileset.json.tsj": { "scaleInDock": 1, @@ -43,23 +57,32 @@ "dynamicWrapping": false, "scaleInDock": 1, "scaleInEditor": 1 + }, + "tilesets/hexgrid_tiles.json": { + "dynamicWrapping": true } }, "last.exportedFilePath": "/Users/insality/code/defold/detiled/tiled/export", - "last.imagePath": "/Users/insality/code/defold/detiled/tiled/assets/grid", + "last.imagePath": "/Users/insality/code/defold/detiled/tiled/assets/hexgrid", "lastUsedTilesetExportFilter": "JSON tileset files (*.tsj *.json)", "map.lastUsedExportFilter": "Defold Collection (*.collection)", "map.lastUsedFormat": "json", - "map.tileHeight": 16, - "map.tileWidth": 16, + "map.orientation": "4", + "map.tileHeight": 182, + "map.tileWidth": 192, "openFiles": [ + "tilesets/grid_tileset.json", + "tilesets/grid_items.json", + "maps/grid.json" ], "project": "detiled.tiled-project", "property.type": "string", "recentFiles": [ + "tilesets/grid_tileset.json", + "tilesets/grid_items.json", + "maps/grid.json", ":/automap-tiles.tsx", "maps/grid.json.tmj", - "tilesets/grid_items.json", "tilesets/grid_tileset.tsx", "tilesets/grid_tileset.json.tsj", "tilesets/grid_items.tsj" diff --git a/tiled/maps/hexgrid.json b/tiled/maps/hexgrid.json new file mode 100644 index 0000000..ba73d44 --- /dev/null +++ b/tiled/maps/hexgrid.json @@ -0,0 +1,357 @@ +{ "compressionlevel":-1, + "height":20, + "hexsidelength":95, + "infinite":false, + "layers":[ + { + "data":[12, 7, 12, 3, 10, 4, 11, 7, 8, 8, 6, 10, 9, 7, 9, 9, 3, 9, 3, 1, 8, 5, 7, 8, 7, 3, 1, 4, 7, 11, + 4, 7, 10, 3, 1, 10, 6, 12, 3, 2, 5, 9, 11, 2, 6, 2, 12, 11, 11, 11, 2, 10, 7, 5, 4, 5, 6, 6, 10, 10, + 1, 1, 1, 11, 4, 9, 7, 8, 6, 8, 7, 10, 4, 8, 8, 5, 9, 6, 12, 5, 4, 8, 3, 1, 2, 10, 10, 10, 1, 11, + 7, 3, 12, 9, 11, 5, 7, 10, 11, 10, 8, 4, 7, 12, 6, 4, 5, 5, 8, 7, 8, 3, 6, 3, 5, 4, 11, 11, 9, 12, + 8, 12, 5, 6, 4, 3, 11, 6, 9, 1, 4, 6, 6, 11, 9, 2, 5, 2, 11, 11, 10, 1, 2, 5, 10, 6, 5, 3, 9, 11, + 12, 12, 12, 6, 2, 10, 4, 7, 6, 4, 8, 3, 2, 9, 12, 7, 9, 1, 1, 2, 11, 1, 8, 9, 3, 6, 5, 9, 3, 12, + 11, 11, 3, 8, 10, 5, 4, 5, 2, 12, 2, 1, 10, 10, 7, 6, 9, 3, 3, 9, 8, 10, 9, 11, 5, 5, 2, 8, 12, 11, + 3, 10, 6, 5, 4, 4, 6, 7, 3, 5, 3, 6, 7, 2, 9, 8, 4, 10, 2, 2, 8, 2, 5, 3, 3, 1, 12, 2, 6, 10, + 8, 8, 3, 5, 2, 2, 9, 12, 6, 11, 6, 9, 8, 6, 4, 3, 3, 8, 12, 10, 8, 8, 12, 8, 12, 9, 3, 5, 12, 8, + 8, 9, 12, 6, 7, 11, 3, 1, 12, 12, 2, 4, 12, 8, 5, 7, 6, 12, 12, 11, 4, 1, 4, 5, 3, 4, 3, 6, 11, 1, + 3, 6, 12, 6, 7, 4, 4, 7, 7, 7, 7, 8, 4, 5, 1, 7, 1, 10, 8, 12, 3, 8, 7, 3, 3, 10, 10, 3, 10, 1, + 10, 5, 10, 1, 10, 6, 4, 9, 1, 8, 9, 8, 12, 2, 10, 3, 6, 4, 6, 9, 12, 12, 10, 12, 9, 9, 10, 10, 5, 3, + 1, 8, 1, 7, 4, 6, 8, 4, 9, 8, 10, 8, 3, 12, 2, 1, 4, 11, 9, 7, 7, 6, 1, 8, 9, 4, 4, 8, 6, 7, + 3, 11, 1, 7, 8, 6, 4, 8, 10, 6, 11, 10, 5, 4, 2, 11, 11, 10, 10, 10, 6, 2, 3, 4, 3, 2, 1, 5, 3, 11, + 1, 5, 3, 3, 2, 4, 5, 6, 4, 4, 1, 2, 12, 9, 9, 4, 6, 1, 7, 3, 5, 5, 1, 11, 2, 1, 2, 2, 6, 9, + 12, 3, 6, 9, 6, 3, 12, 9, 7, 3, 2, 7, 2, 10, 11, 10, 6, 3, 12, 9, 12, 2, 7, 4, 10, 8, 5, 6, 7, 3, + 3, 6, 11, 7, 10, 3, 2, 4, 7, 11, 8, 3, 9, 9, 2, 10, 12, 12, 5, 6, 4, 6, 2, 1, 6, 1, 7, 5, 8, 11, + 6, 7, 5, 4, 11, 4, 1, 1, 3, 1, 6, 9, 8, 1, 5, 11, 2, 5, 7, 11, 6, 2, 2, 6, 9, 7, 5, 3, 12, 2, + 10, 9, 2, 3, 12, 11, 2, 4, 8, 7, 7, 6, 1, 2, 8, 8, 1, 6, 4, 3, 9, 11, 9, 10, 10, 11, 11, 5, 3, 8, + 7, 8, 8, 7, 4, 12, 10, 12, 5, 7, 4, 4, 8, 11, 9, 3, 12, 1, 8, 5, 8, 3, 4, 8, 4, 2, 1, 11, 3, 12], + "height":20, + "id":1, + "name":"tiles", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }, + { + "draworder":"topdown", + "id":2, + "name":"objects", + "objects":[ + { + "gid":14, + "height":221, + "id":3, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":1878.70853778214, + "y":1573.21786064769 + }, + { + "gid":14, + "height":221, + "id":4, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":1741.31894013739, + "y":1517.60778541053 + }, + { + "gid":14, + "height":221, + "id":5, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":1587.57343801112, + "y":1468.54007196598 + }, + { + "gid":14, + "height":221, + "id":6, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":2022.6404972195, + "y":1357.31992149166 + }, + { + "gid":13, + "height":264, + "id":7, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":1868.60680405626, + "y":1319.43866535819 + }, + { + "gid":13, + "height":264, + "id":8, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":1966.74223094537, + "y":1231.116781158 + }, + { + "gid":13, + "height":264, + "id":9, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":1538.2175335296, + "y":1139.5237160615 + }, + { + "gid":13, + "height":264, + "id":10, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":1433.53974484789, + "y":1234.3879620543 + }, + { + "gid":13, + "height":264, + "id":11, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":1305.96368989205, + "y":1123.16781157998 + }, + { + "gid":13, + "height":264, + "id":13, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":1122.77755969905, + "y":1254.01504743212 + }, + { + "gid":13, + "height":264, + "id":14, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":851.269545305855, + "y":1538.60778541053 + }, + { + "gid":13, + "height":264, + "id":15, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":825.100098135427, + "y":1689.0821066405 + }, + { + "gid":14, + "height":221, + "id":16, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":730.524043179588, + "y":1586.30258423291 + }, + { + "gid":14, + "height":221, + "id":17, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":1018.3879620543, + "y":1864.35296041871 + }, + { + "gid":14, + "height":221, + "id":18, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":887.540726202159, + "y":1952.67484461891 + }, + { + "gid":14, + "height":221, + "id":19, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":1296.4383382401, + "y":2001.74255806346 + }, + { + "gid":14, + "height":221, + "id":20, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":1741.31894013739, + "y":1926.50539744848 + }, + { + "gid":14, + "height":221, + "id":22, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":1852.53909061171, + "y":2027.91200523389 + }, + { + "gid":13, + "height":264, + "id":23, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":2264.419692509, + "y":1803.57343801112 + }, + { + "gid":13, + "height":264, + "id":24, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":2427.97873732417, + "y":1731.60745829244 + }, + { + "gid":13, + "height":264, + "id":25, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":2562.09715407262, + "y":1656.37029767746 + }, + { + "gid":13, + "height":264, + "id":26, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":2149.92836113837, + "y":2163.40333660451 + }, + { + "gid":13, + "height":264, + "id":27, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":2254.60614982008, + "y":2078.35263330062 + }, + { + "gid":13, + "height":264, + "id":28, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":2248.06378802748, + "y":2215.74223094537 + }], + "opacity":1, + "type":"objectgroup", + "visible":true, + "x":0, + "y":0 + }], + "nextlayerid":3, + "nextobjectid":29, + "orientation":"hexagonal", + "renderorder":"right-down", + "staggeraxis":"x", + "staggerindex":"odd", + "tiledversion":"1.11.2", + "tileheight":145, + "tilesets":[ + { + "firstgid":1, + "source":"..\/tilesets\/hexgrid_tiles.json" + }, + { + "firstgid":13, + "source":"..\/tilesets\/hexgrid_objects.json" + }], + "tilewidth":192, + "type":"map", + "version":"1.10", + "width":30 +} \ No newline at end of file diff --git a/tiled/tilesets/hexgrid_objects.json b/tiled/tilesets/hexgrid_objects.json new file mode 100644 index 0000000..334519e --- /dev/null +++ b/tiled/tilesets/hexgrid_objects.json @@ -0,0 +1,30 @@ +{ "columns":0, + "grid": + { + "height":1, + "orientation":"orthogonal", + "width":1 + }, + "margin":0, + "name":"hexgrid_objects", + "spacing":0, + "tilecount":2, + "tiledversion":"1.11.2", + "tileheight":264, + "tiles":[ + { + "id":0, + "image":"..\/assets\/hexgrid\/r_tree_round_2.png", + "imageheight":264, + "imagewidth":235 + }, + { + "id":1, + "image":"..\/assets\/hexgrid\/r_tree_round.png", + "imageheight":221, + "imagewidth":169 + }], + "tilewidth":235, + "type":"tileset", + "version":"1.10" +} \ No newline at end of file diff --git a/tiled/tilesets/hexgrid_tiles.json b/tiled/tilesets/hexgrid_tiles.json new file mode 100644 index 0000000..fcec4e0 --- /dev/null +++ b/tiled/tilesets/hexgrid_tiles.json @@ -0,0 +1,90 @@ +{ "columns":0, + "grid": + { + "height":1, + "orientation":"orthogonal", + "width":1 + }, + "margin":0, + "name":"hexgrid_tiles", + "spacing":0, + "tilecount":12, + "tiledversion":"1.11.2", + "tileheight":189, + "tiles":[ + { + "id":0, + "image":"..\/assets\/hexgrid\/tile_dirt_2.png", + "imageheight":189, + "imagewidth":192 + }, + { + "id":1, + "image":"..\/assets\/hexgrid\/tile_dirt_3.png", + "imageheight":189, + "imagewidth":192 + }, + { + "id":2, + "image":"..\/assets\/hexgrid\/tile_dirt.png", + "imageheight":189, + "imagewidth":192 + }, + { + "id":3, + "image":"..\/assets\/hexgrid\/tile_grass_2.png", + "imageheight":189, + "imagewidth":192 + }, + { + "id":4, + "image":"..\/assets\/hexgrid\/tile_grass_3.png", + "imageheight":189, + "imagewidth":192 + }, + { + "id":5, + "image":"..\/assets\/hexgrid\/tile_grass.png", + "imageheight":189, + "imagewidth":192 + }, + { + "id":6, + "image":"..\/assets\/hexgrid\/tile_sand_2.png", + "imageheight":189, + "imagewidth":192 + }, + { + "id":7, + "image":"..\/assets\/hexgrid\/tile_sand_3.png", + "imageheight":189, + "imagewidth":192 + }, + { + "id":8, + "image":"..\/assets\/hexgrid\/tile_sand.png", + "imageheight":189, + "imagewidth":192 + }, + { + "id":9, + "image":"..\/assets\/hexgrid\/tile_stone_2.png", + "imageheight":189, + "imagewidth":192 + }, + { + "id":10, + "image":"..\/assets\/hexgrid\/tile_stone_3.png", + "imageheight":189, + "imagewidth":192 + }, + { + "id":11, + "image":"..\/assets\/hexgrid\/tile_stone.png", + "imageheight":189, + "imagewidth":192 + }], + "tilewidth":192, + "type":"tileset", + "version":"1.10" +} \ No newline at end of file From e2b21691a42f0d36705626e2e944d3effd29a245 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 15:31:49 +0200 Subject: [PATCH 10/71] Update --- example/assets/hexgrid/entities.go | 84 +++++++++++++++++++ .../assets/hexgrid/entities/r_tree_round.go | 15 ++++ .../assets/hexgrid/entities/r_tree_round_2.go | 15 ++++ example/assets/hexgrid/entities/tile_dirt.go | 14 ++++ .../assets/hexgrid/entities/tile_dirt_2.go | 14 ++++ .../assets/hexgrid/entities/tile_dirt_3.go | 14 ++++ example/assets/hexgrid/entities/tile_grass.go | 14 ++++ .../assets/hexgrid/entities/tile_grass_2.go | 14 ++++ .../assets/hexgrid/entities/tile_grass_3.go | 14 ++++ example/assets/hexgrid/entities/tile_sand.go | 14 ++++ .../assets/hexgrid/entities/tile_sand_2.go | 14 ++++ .../assets/hexgrid/entities/tile_sand_3.go | 14 ++++ example/assets/hexgrid/entities/tile_stone.go | 14 ++++ .../assets/hexgrid/entities/tile_stone_2.go | 14 ++++ .../assets/hexgrid/entities/tile_stone_3.go | 14 ++++ .../example_hexgrid/examle_hexgrid.collection | 2 - .../example_hexgrid.collection | 47 +++++++++++ .../example_hexgrid/example_hexgrid.script | 71 ++++++---------- game.project | 5 +- tiled/detiled.tiled-session | 2 +- tiled/maps/hexgrid.json | 6 ++ tiled/tilesets/hexgrid_objects.json | 52 +++++++++++- 22 files changed, 415 insertions(+), 52 deletions(-) create mode 100644 example/assets/hexgrid/entities.go create mode 100644 example/assets/hexgrid/entities/r_tree_round.go create mode 100644 example/assets/hexgrid/entities/r_tree_round_2.go create mode 100644 example/assets/hexgrid/entities/tile_dirt.go create mode 100644 example/assets/hexgrid/entities/tile_dirt_2.go create mode 100644 example/assets/hexgrid/entities/tile_dirt_3.go create mode 100644 example/assets/hexgrid/entities/tile_grass.go create mode 100644 example/assets/hexgrid/entities/tile_grass_2.go create mode 100644 example/assets/hexgrid/entities/tile_grass_3.go create mode 100644 example/assets/hexgrid/entities/tile_sand.go create mode 100644 example/assets/hexgrid/entities/tile_sand_2.go create mode 100644 example/assets/hexgrid/entities/tile_sand_3.go create mode 100644 example/assets/hexgrid/entities/tile_stone.go create mode 100644 example/assets/hexgrid/entities/tile_stone_2.go create mode 100644 example/assets/hexgrid/entities/tile_stone_3.go delete mode 100644 example/example_hexgrid/examle_hexgrid.collection create mode 100644 example/example_hexgrid/example_hexgrid.collection diff --git a/example/assets/hexgrid/entities.go b/example/assets/hexgrid/entities.go new file mode 100644 index 0000000..13498ee --- /dev/null +++ b/example/assets/hexgrid/entities.go @@ -0,0 +1,84 @@ +embedded_components { + id: "tile_dirt" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile_dirt.go\"\n" + "" +} +embedded_components { + id: "tile_dirt_2" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile_dirt_2.go\"\n" + "" +} +embedded_components { + id: "tile_dirt_3" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile_dirt_3.go\"\n" + "" +} +embedded_components { + id: "tile_grass" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile_grass.go\"\n" + "" +} +embedded_components { + id: "tile_grass_2" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile_grass_2.go\"\n" + "" +} +embedded_components { + id: "tile_grass_3" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile_grass_3.go\"\n" + "" +} +embedded_components { + id: "tile_sand" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile_sand.go\"\n" + "" +} +embedded_components { + id: "tile_sand_2" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile_sand_2.go\"\n" + "" +} +embedded_components { + id: "tile_sand_3" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile_sand_3.go\"\n" + "" +} +embedded_components { + id: "tile_stone" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile_stone.go\"\n" + "" +} +embedded_components { + id: "tile_stone_2" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile_stone_2.go\"\n" + "" +} +embedded_components { + id: "tile_stone_3" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile_stone_3.go\"\n" + "" +} +embedded_components { + id: "r_tree_round" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/r_tree_round.go\"\n" + "" +} +embedded_components { + id: "r_tree_round_2" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/r_tree_round_2.go\"\n" + "" +} diff --git a/example/assets/hexgrid/entities/r_tree_round.go b/example/assets/hexgrid/entities/r_tree_round.go new file mode 100644 index 0000000..9959b78 --- /dev/null +++ b/example/assets/hexgrid/entities/r_tree_round.go @@ -0,0 +1,15 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"r_tree_round\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_resources.atlas\"\n" + "}\n" + "" + position { + x: 5.0 + y: 87.0 + } +} diff --git a/example/assets/hexgrid/entities/r_tree_round_2.go b/example/assets/hexgrid/entities/r_tree_round_2.go new file mode 100644 index 0000000..cf96f20 --- /dev/null +++ b/example/assets/hexgrid/entities/r_tree_round_2.go @@ -0,0 +1,15 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"r_tree_round_2\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_resources.atlas\"\n" + "}\n" + "" + position { + x: -6.0 + y: 107.0 + } +} diff --git a/example/assets/hexgrid/entities/tile_dirt.go b/example/assets/hexgrid/entities/tile_dirt.go new file mode 100644 index 0000000..6101db4 --- /dev/null +++ b/example/assets/hexgrid/entities/tile_dirt.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_dirt\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: -20.0 + } +} diff --git a/example/assets/hexgrid/entities/tile_dirt_2.go b/example/assets/hexgrid/entities/tile_dirt_2.go new file mode 100644 index 0000000..37c36bd --- /dev/null +++ b/example/assets/hexgrid/entities/tile_dirt_2.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_dirt_2\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: -20.0 + } +} diff --git a/example/assets/hexgrid/entities/tile_dirt_3.go b/example/assets/hexgrid/entities/tile_dirt_3.go new file mode 100644 index 0000000..104f33a --- /dev/null +++ b/example/assets/hexgrid/entities/tile_dirt_3.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_dirt_3\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: -20.0 + } +} diff --git a/example/assets/hexgrid/entities/tile_grass.go b/example/assets/hexgrid/entities/tile_grass.go new file mode 100644 index 0000000..84bb785 --- /dev/null +++ b/example/assets/hexgrid/entities/tile_grass.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_grass\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: -20.0 + } +} diff --git a/example/assets/hexgrid/entities/tile_grass_2.go b/example/assets/hexgrid/entities/tile_grass_2.go new file mode 100644 index 0000000..0c2c86a --- /dev/null +++ b/example/assets/hexgrid/entities/tile_grass_2.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_grass_2\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: -20.0 + } +} diff --git a/example/assets/hexgrid/entities/tile_grass_3.go b/example/assets/hexgrid/entities/tile_grass_3.go new file mode 100644 index 0000000..e6615f6 --- /dev/null +++ b/example/assets/hexgrid/entities/tile_grass_3.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_grass_3\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: -20.0 + } +} diff --git a/example/assets/hexgrid/entities/tile_sand.go b/example/assets/hexgrid/entities/tile_sand.go new file mode 100644 index 0000000..dc43cc2 --- /dev/null +++ b/example/assets/hexgrid/entities/tile_sand.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_sand\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: -20.0 + } +} diff --git a/example/assets/hexgrid/entities/tile_sand_2.go b/example/assets/hexgrid/entities/tile_sand_2.go new file mode 100644 index 0000000..87aa2c1 --- /dev/null +++ b/example/assets/hexgrid/entities/tile_sand_2.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_sand_2\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: -20.0 + } +} diff --git a/example/assets/hexgrid/entities/tile_sand_3.go b/example/assets/hexgrid/entities/tile_sand_3.go new file mode 100644 index 0000000..b0d1a4c --- /dev/null +++ b/example/assets/hexgrid/entities/tile_sand_3.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_sand_3\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: -20.0 + } +} diff --git a/example/assets/hexgrid/entities/tile_stone.go b/example/assets/hexgrid/entities/tile_stone.go new file mode 100644 index 0000000..58653af --- /dev/null +++ b/example/assets/hexgrid/entities/tile_stone.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_stone\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: -20.0 + } +} diff --git a/example/assets/hexgrid/entities/tile_stone_2.go b/example/assets/hexgrid/entities/tile_stone_2.go new file mode 100644 index 0000000..f40dc8f --- /dev/null +++ b/example/assets/hexgrid/entities/tile_stone_2.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_stone_2\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: -20.0 + } +} diff --git a/example/assets/hexgrid/entities/tile_stone_3.go b/example/assets/hexgrid/entities/tile_stone_3.go new file mode 100644 index 0000000..c537220 --- /dev/null +++ b/example/assets/hexgrid/entities/tile_stone_3.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_stone_3\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: -20.0 + } +} diff --git a/example/example_hexgrid/examle_hexgrid.collection b/example/example_hexgrid/examle_hexgrid.collection deleted file mode 100644 index e9916de..0000000 --- a/example/example_hexgrid/examle_hexgrid.collection +++ /dev/null @@ -1,2 +0,0 @@ -name: "examle_hexgrid" -scale_along_z: 0 diff --git a/example/example_hexgrid/example_hexgrid.collection b/example/example_hexgrid/example_hexgrid.collection new file mode 100644 index 0000000..a21e2d3 --- /dev/null +++ b/example/example_hexgrid/example_hexgrid.collection @@ -0,0 +1,47 @@ +name: "examle_hexgrid" +instances { + id: "entities" + prototype: "/example/assets/hexgrid/entities.go" +} +scale_along_z: 0 +embedded_instances { + id: "go" + data: "components {\n" + " id: \"example_hexgrid\"\n" + " component: \"/example/example_hexgrid/example_hexgrid.script\"\n" + "}\n" + "" +} +embedded_instances { + id: "camera" + data: "components {\n" + " id: \"camera_wasd_control\"\n" + " component: \"/example/assets/camera_wasd_control.script\"\n" + " properties {\n" + " id: \"movement_speed\"\n" + " value: \"600.0\"\n" + " type: PROPERTY_TYPE_NUMBER\n" + " }\n" + " properties {\n" + " id: \"zoom_speed\"\n" + " value: \"2.0\"\n" + " type: PROPERTY_TYPE_NUMBER\n" + " }\n" + "}\n" + "embedded_components {\n" + " id: \"camera\"\n" + " type: \"camera\"\n" + " data: \"aspect_ratio: 1.0\\n" + "fov: 0.7854\\n" + "near_z: -100.0\\n" + "far_z: 1000.0\\n" + "orthographic_projection: 1\\n" + "\"\n" + "}\n" + "" + position { + x: 480.0 + y: 320.0 + z: -10.0 + } +} diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index 3f95ef0..e2ae2d2 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -1,56 +1,35 @@ -function init(self) - -- Add initialization code here - -- Learn more: https://defold.com/manuals/script/ - -- Remove this function if not needed -end +local detiled = require("detiled.detiled") -function final(self) - -- Add finalization code here - -- Learn more: https://defold.com/manuals/script/ - -- Remove this function if not needed -end +local function spawn_entity(entity) + local prefab_id = entity.prefab_id + local components = entity.components + local transform = components.transform + local position_x = transform.position_x + local position_y = transform.position_y + local position_z = transform.position_z + local scale_x = transform.scale_x or 1 + local scale_y = transform.scale_y or 1 -function update(self, dt) - -- Add update code here - -- Learn more: https://defold.com/manuals/script/ - -- Remove this function if not needed -end + local factory_url = "/entities#" .. prefab_id + local position = vmath.vector3(position_x, position_y, position_z) + local scale = vmath.vector3(scale_x, scale_y, 1) + factory.create(factory_url, position, nil, nil, scale) -function late_update(self, dt) - -- This function is called at the end of update cycle but before render - -- Learn more: https://defold.com/manuals/script/ - -- Remove this function if not needed + print("Spawn entity: ", factory_url, position_x, position_y, position_z) end -function fixed_update(self, dt) - -- This function is called if 'Fixed Update Frequency' is enabled in the Engine section of game.project - -- Can be coupled with fixed updates of the physics simulation if 'Use Fixed Timestep' is enabled in - -- Physics section of game.project - -- Add update code here - -- Learn more: https://defold.com/manuals/script/ - -- Remove this function if not needed -end -function on_message(self, message_id, message, sender) - -- Add message-handling code here - -- Learn more: https://defold.com/manuals/message-passing/ - -- Remove this function if not needed +local function spawn_map(map) + local entities = map.child_instancies + for _, entity in ipairs(entities) do + spawn_entity(entity) + end end -function on_input(self, action_id, action) - -- Add input-handling code here. The game object this script is attached to - -- must have acquired input focus: - -- - -- msg.post(".", "acquire_input_focus") - -- - -- All mapped input bindings will be received. Mouse and touch input will - -- be received regardless of where on the screen it happened. - -- Learn more: https://defold.com/manuals/input/ - -- Remove this function if not needed -end -function on_reload(self) - -- Add reload-handling code here - -- Learn more: https://defold.com/manuals/hot-reload/ - -- Remove this function if not needed +function init(self) + detiled.load_tileset("/tiled/tilesets/hexgrid_tiles.json") + detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") + local map = detiled.get_entity_from_map("/tiled/maps/hexgrid.json") + spawn_map(map) end diff --git a/game.project b/game.project index 771dcd2..9edc89c 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example_grid/example_grid.collectionc +main_collection = /example/example_hexgrid/example_hexgrid.collectionc [script] shared_state = 1 @@ -29,3 +29,6 @@ game_binding = /builtins/input/all.input_bindingc default_texture_min_filter = nearest default_texture_mag_filter = nearest +[sprite] +max_count = 1024 + diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session index 231354f..34b7d1f 100644 --- a/tiled/detiled.tiled-session +++ b/tiled/detiled.tiled-session @@ -76,7 +76,7 @@ "maps/grid.json" ], "project": "detiled.tiled-project", - "property.type": "string", + "property.type": "float", "recentFiles": [ "tilesets/grid_tileset.json", "tilesets/grid_items.json", diff --git a/tiled/maps/hexgrid.json b/tiled/maps/hexgrid.json index ba73d44..90f6e78 100644 --- a/tiled/maps/hexgrid.json +++ b/tiled/maps/hexgrid.json @@ -28,6 +28,12 @@ "id":1, "name":"tiles", "opacity":1, + "properties":[ + { + "name":"position_z", + "type":"float", + "value":-1 + }], "type":"tilelayer", "visible":true, "width":30, diff --git a/tiled/tilesets/hexgrid_objects.json b/tiled/tilesets/hexgrid_objects.json index 334519e..b5527ee 100644 --- a/tiled/tilesets/hexgrid_objects.json +++ b/tiled/tilesets/hexgrid_objects.json @@ -16,13 +16,61 @@ "id":0, "image":"..\/assets\/hexgrid\/r_tree_round_2.png", "imageheight":264, - "imagewidth":235 + "imagewidth":235, + "objectgroup": + { + "draworder":"index", + "id":2, + "name":"", + "objects":[ + { + "height":0, + "id":1, + "name":"", + "point":true, + "rotation":0, + "type":"", + "visible":true, + "width":0, + "x":124.286120901539, + "y":239.072880659739 + }], + "opacity":1, + "type":"objectgroup", + "visible":true, + "x":0, + "y":0 + } }, { "id":1, "image":"..\/assets\/hexgrid\/r_tree_round.png", "imageheight":221, - "imagewidth":169 + "imagewidth":169, + "objectgroup": + { + "draworder":"index", + "id":2, + "name":"", + "objects":[ + { + "height":0, + "id":1, + "name":"", + "point":true, + "rotation":0, + "type":"", + "visible":true, + "width":0, + "x":79.245027430971, + "y":199.128530467568 + }], + "opacity":1, + "type":"objectgroup", + "visible":true, + "x":0, + "y":0 + } }], "tilewidth":235, "type":"tileset", From 4121be039946af7dbe3bf566d634f8c0fe160b69 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 15:41:29 +0200 Subject: [PATCH 11/71] Update --- .../assets/hexgrid/entities/r_tree_round_2.go | 4 +-- example/assets/hexgrid/entities/tile_dirt.go | 3 -- .../assets/hexgrid/entities/tile_dirt_2.go | 3 -- .../assets/hexgrid/entities/tile_dirt_3.go | 3 -- example/assets/hexgrid/entities/tile_grass.go | 3 -- .../assets/hexgrid/entities/tile_grass_2.go | 3 -- .../assets/hexgrid/entities/tile_grass_3.go | 3 -- example/assets/hexgrid/entities/tile_sand.go | 3 -- .../assets/hexgrid/entities/tile_sand_2.go | 3 -- .../assets/hexgrid/entities/tile_sand_3.go | 3 -- example/assets/hexgrid/entities/tile_stone.go | 3 -- .../assets/hexgrid/entities/tile_stone_2.go | 3 -- .../assets/hexgrid/entities/tile_stone_3.go | 3 -- .../example_hexgrid.collection | 31 +++++++++++++++++++ .../example_hexgrid/example_hexgrid.script | 6 +++- game.project | 2 ++ 16 files changed, 40 insertions(+), 39 deletions(-) diff --git a/example/assets/hexgrid/entities/r_tree_round_2.go b/example/assets/hexgrid/entities/r_tree_round_2.go index cf96f20..9926af9 100644 --- a/example/assets/hexgrid/entities/r_tree_round_2.go +++ b/example/assets/hexgrid/entities/r_tree_round_2.go @@ -9,7 +9,7 @@ embedded_components { "}\n" "" position { - x: -6.0 - y: 107.0 + x: -7.0 + y: 104.0 } } diff --git a/example/assets/hexgrid/entities/tile_dirt.go b/example/assets/hexgrid/entities/tile_dirt.go index 6101db4..3d667ca 100644 --- a/example/assets/hexgrid/entities/tile_dirt.go +++ b/example/assets/hexgrid/entities/tile_dirt.go @@ -8,7 +8,4 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" - position { - y: -20.0 - } } diff --git a/example/assets/hexgrid/entities/tile_dirt_2.go b/example/assets/hexgrid/entities/tile_dirt_2.go index 37c36bd..964bae3 100644 --- a/example/assets/hexgrid/entities/tile_dirt_2.go +++ b/example/assets/hexgrid/entities/tile_dirt_2.go @@ -8,7 +8,4 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" - position { - y: -20.0 - } } diff --git a/example/assets/hexgrid/entities/tile_dirt_3.go b/example/assets/hexgrid/entities/tile_dirt_3.go index 104f33a..b518e0f 100644 --- a/example/assets/hexgrid/entities/tile_dirt_3.go +++ b/example/assets/hexgrid/entities/tile_dirt_3.go @@ -8,7 +8,4 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" - position { - y: -20.0 - } } diff --git a/example/assets/hexgrid/entities/tile_grass.go b/example/assets/hexgrid/entities/tile_grass.go index 84bb785..ef89027 100644 --- a/example/assets/hexgrid/entities/tile_grass.go +++ b/example/assets/hexgrid/entities/tile_grass.go @@ -8,7 +8,4 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" - position { - y: -20.0 - } } diff --git a/example/assets/hexgrid/entities/tile_grass_2.go b/example/assets/hexgrid/entities/tile_grass_2.go index 0c2c86a..92a7403 100644 --- a/example/assets/hexgrid/entities/tile_grass_2.go +++ b/example/assets/hexgrid/entities/tile_grass_2.go @@ -8,7 +8,4 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" - position { - y: -20.0 - } } diff --git a/example/assets/hexgrid/entities/tile_grass_3.go b/example/assets/hexgrid/entities/tile_grass_3.go index e6615f6..73e414b 100644 --- a/example/assets/hexgrid/entities/tile_grass_3.go +++ b/example/assets/hexgrid/entities/tile_grass_3.go @@ -8,7 +8,4 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" - position { - y: -20.0 - } } diff --git a/example/assets/hexgrid/entities/tile_sand.go b/example/assets/hexgrid/entities/tile_sand.go index dc43cc2..9886f8c 100644 --- a/example/assets/hexgrid/entities/tile_sand.go +++ b/example/assets/hexgrid/entities/tile_sand.go @@ -8,7 +8,4 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" - position { - y: -20.0 - } } diff --git a/example/assets/hexgrid/entities/tile_sand_2.go b/example/assets/hexgrid/entities/tile_sand_2.go index 87aa2c1..dbf6acf 100644 --- a/example/assets/hexgrid/entities/tile_sand_2.go +++ b/example/assets/hexgrid/entities/tile_sand_2.go @@ -8,7 +8,4 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" - position { - y: -20.0 - } } diff --git a/example/assets/hexgrid/entities/tile_sand_3.go b/example/assets/hexgrid/entities/tile_sand_3.go index b0d1a4c..59886bd 100644 --- a/example/assets/hexgrid/entities/tile_sand_3.go +++ b/example/assets/hexgrid/entities/tile_sand_3.go @@ -8,7 +8,4 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" - position { - y: -20.0 - } } diff --git a/example/assets/hexgrid/entities/tile_stone.go b/example/assets/hexgrid/entities/tile_stone.go index 58653af..778a4f2 100644 --- a/example/assets/hexgrid/entities/tile_stone.go +++ b/example/assets/hexgrid/entities/tile_stone.go @@ -8,7 +8,4 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" - position { - y: -20.0 - } } diff --git a/example/assets/hexgrid/entities/tile_stone_2.go b/example/assets/hexgrid/entities/tile_stone_2.go index f40dc8f..c16467b 100644 --- a/example/assets/hexgrid/entities/tile_stone_2.go +++ b/example/assets/hexgrid/entities/tile_stone_2.go @@ -8,7 +8,4 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" - position { - y: -20.0 - } } diff --git a/example/assets/hexgrid/entities/tile_stone_3.go b/example/assets/hexgrid/entities/tile_stone_3.go index c537220..f50c7c1 100644 --- a/example/assets/hexgrid/entities/tile_stone_3.go +++ b/example/assets/hexgrid/entities/tile_stone_3.go @@ -8,7 +8,4 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" - position { - y: -20.0 - } } diff --git a/example/example_hexgrid/example_hexgrid.collection b/example/example_hexgrid/example_hexgrid.collection index a21e2d3..eabb3bf 100644 --- a/example/example_hexgrid/example_hexgrid.collection +++ b/example/example_hexgrid/example_hexgrid.collection @@ -45,3 +45,34 @@ embedded_instances { z: -10.0 } } +embedded_instances { + id: "background" + data: "embedded_components {\n" + " id: \"sprite\"\n" + " type: \"sprite\"\n" + " data: \"default_animation: \\\"pixel\\\"\\n" + "material: \\\"/builtins/materials/sprite.material\\\"\\n" + "slice9 {\\n" + " x: 2.0\\n" + " y: 2.0\\n" + " z: 2.0\\n" + " w: 2.0\\n" + "}\\n" + "size {\\n" + " x: 960.0\\n" + " y: 640.0\\n" + "}\\n" + "size_mode: SIZE_MODE_MANUAL\\n" + "textures {\\n" + " sampler: \\\"texture_sampler\\\"\\n" + " texture: \\\"/druid/druid.atlas\\\"\\n" + "}\\n" + "\"\n" + " position {\n" + " x: 480.0\n" + " y: 320.0\n" + " z: -1.0\n" + " }\n" + "}\n" + "" +} diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index e2ae2d2..b7f2378 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -1,12 +1,16 @@ local detiled = require("detiled.detiled") +local function get_z_position(position_x, position_y) + return -position_y / 10000 + position_x / 100000 +end + local function spawn_entity(entity) local prefab_id = entity.prefab_id local components = entity.components local transform = components.transform local position_x = transform.position_x local position_y = transform.position_y - local position_z = transform.position_z + local position_z = transform.position_z + get_z_position(position_x, position_y) local scale_x = transform.scale_x or 1 local scale_y = transform.scale_y or 1 diff --git a/game.project b/game.project index 9edc89c..4ef09bf 100644 --- a/game.project +++ b/game.project @@ -18,6 +18,8 @@ custom_resources = /tiled/maps,/tiled/tilesets dependencies#0 = https://github.com/Insality/decore/archive/refs/tags/3.zip dependencies#1 = https://github.com/britzl/deftest/archive/master.zip dependencies#2 = https://github.com/Insality/defold-event/archive/refs/tags/13.zip +dependencies#3 = https://github.com/Insality/asset-store/archive/refs/heads/main.zip +dependencies#4 = https://github.com/Insality/druid/archive/refs/tags/1.1.6.zip [library] include_dirs = detiled From b105388609c1459dc7b84bbf7680cda7d5cd73e7 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 17:38:38 +0200 Subject: [PATCH 12/71] Update --- .../set_bootstrap_collection.editor_script | 32 +++++++++++++++++++ .../set_bootstrap_collection.version | 1 + example/example_grid/example_grid.collection | 31 ++++++++++++++++++ 3 files changed, 64 insertions(+) create mode 100644 editor_scripts/set_bootstrap_collection/set_bootstrap_collection.editor_script create mode 100644 editor_scripts/set_bootstrap_collection/set_bootstrap_collection.version diff --git a/editor_scripts/set_bootstrap_collection/set_bootstrap_collection.editor_script b/editor_scripts/set_bootstrap_collection/set_bootstrap_collection.editor_script new file mode 100644 index 0000000..1e7567f --- /dev/null +++ b/editor_scripts/set_bootstrap_collection/set_bootstrap_collection.editor_script @@ -0,0 +1,32 @@ +local M = {} + +local function ends_with(str, ending) + return ending == "" or str:sub(-#ending) == ending +end + + +function M.get_commands() + return { + { + label = "Set as Bootstrap Collection", + locations = { "Assets" }, + query = { selection = { type = "resource", cardinality = "one" } }, + active = function(opts) + return ends_with(editor.get(opts.selection, "path"), ".collection") + end, + run = function(opts) + local file = opts.selection + local collection_path = editor.get(file, "path") + + editor.transact({ + editor.tx.set("/game.project", "bootstrap.main_collection", collection_path) + }) + + print("Successfully updated main_collection to " .. collection_path) + end + } + } +end + + +return M diff --git a/editor_scripts/set_bootstrap_collection/set_bootstrap_collection.version b/editor_scripts/set_bootstrap_collection/set_bootstrap_collection.version new file mode 100644 index 0000000..fd58391 --- /dev/null +++ b/editor_scripts/set_bootstrap_collection/set_bootstrap_collection.version @@ -0,0 +1 @@ +Insality:set_bootstrap_collection@1 \ No newline at end of file diff --git a/example/example_grid/example_grid.collection b/example/example_grid/example_grid.collection index a3c1838..691ec24 100644 --- a/example/example_grid/example_grid.collection +++ b/example/example_grid/example_grid.collection @@ -53,3 +53,34 @@ embedded_instances { z: -10.0 } } +embedded_instances { + id: "background" + data: "embedded_components {\n" + " id: \"sprite\"\n" + " type: \"sprite\"\n" + " data: \"default_animation: \\\"pixel\\\"\\n" + "material: \\\"/builtins/materials/sprite.material\\\"\\n" + "slice9 {\\n" + " x: 2.0\\n" + " y: 2.0\\n" + " z: 2.0\\n" + " w: 2.0\\n" + "}\\n" + "size {\\n" + " x: 960.0\\n" + " y: 640.0\\n" + "}\\n" + "size_mode: SIZE_MODE_MANUAL\\n" + "textures {\\n" + " sampler: \\\"texture_sampler\\\"\\n" + " texture: \\\"/druid/druid.atlas\\\"\\n" + "}\\n" + "\"\n" + " position {\n" + " x: 480.0\n" + " y: 320.0\n" + " z: -1.0\n" + " }\n" + "}\n" + "" +} From 9dfd9904eb81e7327d7354f4f1a9654c2d27f6f0 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 18:00:36 +0200 Subject: [PATCH 13/71] Update --- example/assets/hexgrid/entities/r_tree_round.go | 2 +- example/assets/hexgrid/entities/r_tree_round_2.go | 2 +- tiled/maps/hexgrid.json | 4 ++-- tiled/tilesets/hexgrid_objects.json | 6 +++--- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/example/assets/hexgrid/entities/r_tree_round.go b/example/assets/hexgrid/entities/r_tree_round.go index 9959b78..c1d88f6 100644 --- a/example/assets/hexgrid/entities/r_tree_round.go +++ b/example/assets/hexgrid/entities/r_tree_round.go @@ -10,6 +10,6 @@ embedded_components { "" position { x: 5.0 - y: 87.0 + y: 89.0 } } diff --git a/example/assets/hexgrid/entities/r_tree_round_2.go b/example/assets/hexgrid/entities/r_tree_round_2.go index 9926af9..210b291 100644 --- a/example/assets/hexgrid/entities/r_tree_round_2.go +++ b/example/assets/hexgrid/entities/r_tree_round_2.go @@ -10,6 +10,6 @@ embedded_components { "" position { x: -7.0 - y: 104.0 + y: 108.0 } } diff --git a/tiled/maps/hexgrid.json b/tiled/maps/hexgrid.json index 90f6e78..549ccb0 100644 --- a/tiled/maps/hexgrid.json +++ b/tiled/maps/hexgrid.json @@ -330,8 +330,8 @@ "type":"", "visible":true, "width":235, - "x":2248.06378802748, - "y":2215.74223094537 + "x":2258.36127086501, + "y":2283.24795176917 }], "opacity":1, "type":"objectgroup", diff --git a/tiled/tilesets/hexgrid_objects.json b/tiled/tilesets/hexgrid_objects.json index b5527ee..c0bbfe9 100644 --- a/tiled/tilesets/hexgrid_objects.json +++ b/tiled/tilesets/hexgrid_objects.json @@ -33,7 +33,7 @@ "visible":true, "width":0, "x":124.286120901539, - "y":239.072880659739 + "y":240.011161789195 }], "opacity":1, "type":"objectgroup", @@ -62,8 +62,8 @@ "type":"", "visible":true, "width":0, - "x":79.245027430971, - "y":199.128530467568 + "x":79.155507606688, + "y":199.992964598974 }], "opacity":1, "type":"objectgroup", From c301db73c6d02750dc8fa612a9d54c4e080f08ff Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 18:16:10 +0200 Subject: [PATCH 14/71] Isogrid example --- example/assets/isogrid/entities.go | 528 +++++++++++++++++ example/assets/isogrid/entities/beach.go | 11 + .../assets/isogrid/entities/beachCornerES.go | 11 + .../assets/isogrid/entities/beachCornerNE.go | 11 + .../assets/isogrid/entities/beachCornerNW.go | 11 + .../assets/isogrid/entities/beachCornerSW.go | 11 + example/assets/isogrid/entities/beachE.go | 11 + example/assets/isogrid/entities/beachES.go | 11 + example/assets/isogrid/entities/beachN.go | 11 + example/assets/isogrid/entities/beachNE.go | 11 + example/assets/isogrid/entities/beachNW.go | 11 + example/assets/isogrid/entities/beachS.go | 11 + example/assets/isogrid/entities/beachSW.go | 11 + example/assets/isogrid/entities/beachW.go | 11 + example/assets/isogrid/entities/bridgeEW.go | 11 + example/assets/isogrid/entities/bridgeNS.go | 11 + example/assets/isogrid/entities/crossroad.go | 11 + .../assets/isogrid/entities/crossroadESW.go | 11 + .../assets/isogrid/entities/crossroadNES.go | 11 + .../assets/isogrid/entities/crossroadNEW.go | 11 + .../assets/isogrid/entities/crossroadNSW.go | 11 + example/assets/isogrid/entities/dirt.go | 11 + example/assets/isogrid/entities/dirtDouble.go | 11 + example/assets/isogrid/entities/endE.go | 11 + example/assets/isogrid/entities/endN.go | 11 + example/assets/isogrid/entities/endS.go | 11 + example/assets/isogrid/entities/endW.go | 11 + example/assets/isogrid/entities/exitE.go | 11 + example/assets/isogrid/entities/exitN.go | 11 + example/assets/isogrid/entities/exitS.go | 11 + example/assets/isogrid/entities/exitW.go | 11 + example/assets/isogrid/entities/grass.go | 11 + example/assets/isogrid/entities/grassWhole.go | 11 + example/assets/isogrid/entities/hillE.go | 11 + example/assets/isogrid/entities/hillES.go | 11 + example/assets/isogrid/entities/hillN.go | 11 + example/assets/isogrid/entities/hillNE.go | 11 + example/assets/isogrid/entities/hillNW.go | 11 + example/assets/isogrid/entities/hillS.go | 11 + example/assets/isogrid/entities/hillSW.go | 11 + example/assets/isogrid/entities/hillW.go | 11 + example/assets/isogrid/entities/lotE.go | 11 + example/assets/isogrid/entities/lotES.go | 11 + example/assets/isogrid/entities/lotN.go | 11 + example/assets/isogrid/entities/lotNE.go | 11 + example/assets/isogrid/entities/lotNW.go | 11 + example/assets/isogrid/entities/lotS.go | 11 + example/assets/isogrid/entities/lotSW.go | 11 + example/assets/isogrid/entities/lotW.go | 11 + .../assets/isogrid/entities/riverBankedES.go | 11 + .../assets/isogrid/entities/riverBankedEW.go | 11 + .../assets/isogrid/entities/riverBankedNE.go | 11 + .../assets/isogrid/entities/riverBankedNS.go | 11 + .../assets/isogrid/entities/riverBankedNW.go | 11 + .../assets/isogrid/entities/riverBankedSW.go | 11 + example/assets/isogrid/entities/riverES.go | 11 + example/assets/isogrid/entities/riverEW.go | 11 + example/assets/isogrid/entities/riverNE.go | 11 + example/assets/isogrid/entities/riverNS.go | 11 + example/assets/isogrid/entities/riverNW.go | 11 + example/assets/isogrid/entities/riverSW.go | 11 + example/assets/isogrid/entities/road.go | 11 + example/assets/isogrid/entities/roadES.go | 11 + example/assets/isogrid/entities/roadEW.go | 11 + example/assets/isogrid/entities/roadHill2E.go | 11 + example/assets/isogrid/entities/roadHill2N.go | 11 + example/assets/isogrid/entities/roadHill2S.go | 11 + example/assets/isogrid/entities/roadHill2W.go | 11 + example/assets/isogrid/entities/roadHillE.go | 11 + example/assets/isogrid/entities/roadHillN.go | 11 + example/assets/isogrid/entities/roadHillS.go | 11 + example/assets/isogrid/entities/roadHillW.go | 11 + example/assets/isogrid/entities/roadNE.go | 11 + example/assets/isogrid/entities/roadNS.go | 11 + example/assets/isogrid/entities/roadNW.go | 11 + example/assets/isogrid/entities/roadSW.go | 11 + example/assets/isogrid/entities/water.go | 11 + .../assets/isogrid/entities/waterCornerES.go | 11 + .../assets/isogrid/entities/waterCornerNE.go | 11 + .../assets/isogrid/entities/waterCornerNW.go | 11 + .../assets/isogrid/entities/waterCornerSW.go | 11 + example/assets/isogrid/entities/waterE.go | 11 + example/assets/isogrid/entities/waterES.go | 11 + example/assets/isogrid/entities/waterN.go | 11 + example/assets/isogrid/entities/waterNE.go | 11 + example/assets/isogrid/entities/waterNW.go | 11 + example/assets/isogrid/entities/waterS.go | 11 + example/assets/isogrid/entities/waterSW.go | 11 + example/assets/isogrid/entities/waterW.go | 11 + example/assets/isogrid/isogrid_tiles.atlas | 265 +++++++++ .../example_isogrid.collection | 78 +++ .../example_isogrid/example_isogrid.script | 40 ++ game.project | 2 +- tiled/assets/isogrid/beach.png | Bin 0 -> 722 bytes tiled/assets/isogrid/beachCornerES.png | Bin 0 -> 860 bytes tiled/assets/isogrid/beachCornerNE.png | Bin 0 -> 942 bytes tiled/assets/isogrid/beachCornerNW.png | Bin 0 -> 857 bytes tiled/assets/isogrid/beachCornerSW.png | Bin 0 -> 839 bytes tiled/assets/isogrid/beachE.png | Bin 0 -> 855 bytes tiled/assets/isogrid/beachES.png | Bin 0 -> 1555 bytes tiled/assets/isogrid/beachN.png | Bin 0 -> 870 bytes tiled/assets/isogrid/beachNE.png | Bin 0 -> 1407 bytes tiled/assets/isogrid/beachNW.png | Bin 0 -> 1578 bytes tiled/assets/isogrid/beachS.png | Bin 0 -> 775 bytes tiled/assets/isogrid/beachSW.png | Bin 0 -> 1568 bytes tiled/assets/isogrid/beachW.png | Bin 0 -> 811 bytes tiled/assets/isogrid/bridgeEW.png | Bin 0 -> 1149 bytes tiled/assets/isogrid/bridgeNS.png | Bin 0 -> 1105 bytes tiled/assets/isogrid/crossroad.png | Bin 0 -> 1717 bytes tiled/assets/isogrid/crossroadESW.png | Bin 0 -> 1556 bytes tiled/assets/isogrid/crossroadNES.png | Bin 0 -> 1349 bytes tiled/assets/isogrid/crossroadNEW.png | Bin 0 -> 1397 bytes tiled/assets/isogrid/crossroadNSW.png | Bin 0 -> 1571 bytes tiled/assets/isogrid/dirt.png | Bin 0 -> 618 bytes tiled/assets/isogrid/dirtDouble.png | Bin 0 -> 642 bytes tiled/assets/isogrid/endE.png | Bin 0 -> 992 bytes tiled/assets/isogrid/endN.png | Bin 0 -> 1011 bytes tiled/assets/isogrid/endS.png | Bin 0 -> 1102 bytes tiled/assets/isogrid/endW.png | Bin 0 -> 1173 bytes tiled/assets/isogrid/exitE.png | Bin 0 -> 1160 bytes tiled/assets/isogrid/exitN.png | Bin 0 -> 1211 bytes tiled/assets/isogrid/exitS.png | Bin 0 -> 1397 bytes tiled/assets/isogrid/exitW.png | Bin 0 -> 1364 bytes tiled/assets/isogrid/grass.png | Bin 0 -> 736 bytes tiled/assets/isogrid/grassWhole.png | Bin 0 -> 686 bytes tiled/assets/isogrid/hillE.png | Bin 0 -> 778 bytes tiled/assets/isogrid/hillES.png | Bin 0 -> 1047 bytes tiled/assets/isogrid/hillN.png | Bin 0 -> 796 bytes tiled/assets/isogrid/hillNE.png | Bin 0 -> 872 bytes tiled/assets/isogrid/hillNW.png | Bin 0 -> 945 bytes tiled/assets/isogrid/hillS.png | Bin 0 -> 1034 bytes tiled/assets/isogrid/hillSW.png | Bin 0 -> 1126 bytes tiled/assets/isogrid/hillW.png | Bin 0 -> 1030 bytes tiled/assets/isogrid/lotE.png | Bin 0 -> 997 bytes tiled/assets/isogrid/lotES.png | Bin 0 -> 1129 bytes tiled/assets/isogrid/lotN.png | Bin 0 -> 1025 bytes tiled/assets/isogrid/lotNE.png | Bin 0 -> 1147 bytes tiled/assets/isogrid/lotNW.png | Bin 0 -> 1040 bytes tiled/assets/isogrid/lotS.png | Bin 0 -> 1056 bytes tiled/assets/isogrid/lotSW.png | Bin 0 -> 1000 bytes tiled/assets/isogrid/lotW.png | Bin 0 -> 1017 bytes tiled/assets/isogrid/riverBankedES.png | Bin 0 -> 1719 bytes tiled/assets/isogrid/riverBankedEW.png | Bin 0 -> 1314 bytes tiled/assets/isogrid/riverBankedNE.png | Bin 0 -> 1689 bytes tiled/assets/isogrid/riverBankedNS.png | Bin 0 -> 1214 bytes tiled/assets/isogrid/riverBankedNW.png | Bin 0 -> 1749 bytes tiled/assets/isogrid/riverBankedSW.png | Bin 0 -> 2151 bytes tiled/assets/isogrid/riverES.png | Bin 0 -> 1324 bytes tiled/assets/isogrid/riverEW.png | Bin 0 -> 990 bytes tiled/assets/isogrid/riverNE.png | Bin 0 -> 1290 bytes tiled/assets/isogrid/riverNS.png | Bin 0 -> 927 bytes tiled/assets/isogrid/riverNW.png | Bin 0 -> 1291 bytes tiled/assets/isogrid/riverSW.png | Bin 0 -> 1501 bytes tiled/assets/isogrid/road.png | Bin 0 -> 739 bytes tiled/assets/isogrid/roadES.png | Bin 0 -> 1598 bytes tiled/assets/isogrid/roadEW.png | Bin 0 -> 1232 bytes tiled/assets/isogrid/roadHill2E.png | Bin 0 -> 1521 bytes tiled/assets/isogrid/roadHill2N.png | Bin 0 -> 1412 bytes tiled/assets/isogrid/roadHill2S.png | Bin 0 -> 1481 bytes tiled/assets/isogrid/roadHill2W.png | Bin 0 -> 1585 bytes tiled/assets/isogrid/roadHillE.png | Bin 0 -> 1329 bytes tiled/assets/isogrid/roadHillN.png | Bin 0 -> 1255 bytes tiled/assets/isogrid/roadHillS.png | Bin 0 -> 1564 bytes tiled/assets/isogrid/roadHillW.png | Bin 0 -> 1665 bytes tiled/assets/isogrid/roadNE.png | Bin 0 -> 1449 bytes tiled/assets/isogrid/roadNS.png | Bin 0 -> 1178 bytes tiled/assets/isogrid/roadNW.png | Bin 0 -> 1652 bytes tiled/assets/isogrid/roadSW.png | Bin 0 -> 1699 bytes tiled/assets/isogrid/water.png | Bin 0 -> 614 bytes tiled/assets/isogrid/waterCornerES.png | Bin 0 -> 880 bytes tiled/assets/isogrid/waterCornerNE.png | Bin 0 -> 951 bytes tiled/assets/isogrid/waterCornerNW.png | Bin 0 -> 851 bytes tiled/assets/isogrid/waterCornerSW.png | Bin 0 -> 846 bytes tiled/assets/isogrid/waterE.png | Bin 0 -> 806 bytes tiled/assets/isogrid/waterES.png | Bin 0 -> 1128 bytes tiled/assets/isogrid/waterN.png | Bin 0 -> 841 bytes tiled/assets/isogrid/waterNE.png | Bin 0 -> 1294 bytes tiled/assets/isogrid/waterNW.png | Bin 0 -> 1103 bytes tiled/assets/isogrid/waterS.png | Bin 0 -> 802 bytes tiled/assets/isogrid/waterSW.png | Bin 0 -> 983 bytes tiled/assets/isogrid/waterW.png | Bin 0 -> 780 bytes tiled/detiled.tiled-session | 12 +- tiled/maps/isogrid.json | 51 ++ tiled/tilesets/isogrid_tileset.json | 546 ++++++++++++++++++ 184 files changed, 2487 insertions(+), 3 deletions(-) create mode 100644 example/assets/isogrid/entities.go create mode 100644 example/assets/isogrid/entities/beach.go create mode 100644 example/assets/isogrid/entities/beachCornerES.go create mode 100644 example/assets/isogrid/entities/beachCornerNE.go create mode 100644 example/assets/isogrid/entities/beachCornerNW.go create mode 100644 example/assets/isogrid/entities/beachCornerSW.go create mode 100644 example/assets/isogrid/entities/beachE.go create mode 100644 example/assets/isogrid/entities/beachES.go create mode 100644 example/assets/isogrid/entities/beachN.go create mode 100644 example/assets/isogrid/entities/beachNE.go create mode 100644 example/assets/isogrid/entities/beachNW.go create mode 100644 example/assets/isogrid/entities/beachS.go create mode 100644 example/assets/isogrid/entities/beachSW.go create mode 100644 example/assets/isogrid/entities/beachW.go create mode 100644 example/assets/isogrid/entities/bridgeEW.go create mode 100644 example/assets/isogrid/entities/bridgeNS.go create mode 100644 example/assets/isogrid/entities/crossroad.go create mode 100644 example/assets/isogrid/entities/crossroadESW.go create mode 100644 example/assets/isogrid/entities/crossroadNES.go create mode 100644 example/assets/isogrid/entities/crossroadNEW.go create mode 100644 example/assets/isogrid/entities/crossroadNSW.go create mode 100644 example/assets/isogrid/entities/dirt.go create mode 100644 example/assets/isogrid/entities/dirtDouble.go create mode 100644 example/assets/isogrid/entities/endE.go create mode 100644 example/assets/isogrid/entities/endN.go create mode 100644 example/assets/isogrid/entities/endS.go create mode 100644 example/assets/isogrid/entities/endW.go create mode 100644 example/assets/isogrid/entities/exitE.go create mode 100644 example/assets/isogrid/entities/exitN.go create mode 100644 example/assets/isogrid/entities/exitS.go create mode 100644 example/assets/isogrid/entities/exitW.go create mode 100644 example/assets/isogrid/entities/grass.go create mode 100644 example/assets/isogrid/entities/grassWhole.go create mode 100644 example/assets/isogrid/entities/hillE.go create mode 100644 example/assets/isogrid/entities/hillES.go create mode 100644 example/assets/isogrid/entities/hillN.go create mode 100644 example/assets/isogrid/entities/hillNE.go create mode 100644 example/assets/isogrid/entities/hillNW.go create mode 100644 example/assets/isogrid/entities/hillS.go create mode 100644 example/assets/isogrid/entities/hillSW.go create mode 100644 example/assets/isogrid/entities/hillW.go create mode 100644 example/assets/isogrid/entities/lotE.go create mode 100644 example/assets/isogrid/entities/lotES.go create mode 100644 example/assets/isogrid/entities/lotN.go create mode 100644 example/assets/isogrid/entities/lotNE.go create mode 100644 example/assets/isogrid/entities/lotNW.go create mode 100644 example/assets/isogrid/entities/lotS.go create mode 100644 example/assets/isogrid/entities/lotSW.go create mode 100644 example/assets/isogrid/entities/lotW.go create mode 100644 example/assets/isogrid/entities/riverBankedES.go create mode 100644 example/assets/isogrid/entities/riverBankedEW.go create mode 100644 example/assets/isogrid/entities/riverBankedNE.go create mode 100644 example/assets/isogrid/entities/riverBankedNS.go create mode 100644 example/assets/isogrid/entities/riverBankedNW.go create mode 100644 example/assets/isogrid/entities/riverBankedSW.go create mode 100644 example/assets/isogrid/entities/riverES.go create mode 100644 example/assets/isogrid/entities/riverEW.go create mode 100644 example/assets/isogrid/entities/riverNE.go create mode 100644 example/assets/isogrid/entities/riverNS.go create mode 100644 example/assets/isogrid/entities/riverNW.go create mode 100644 example/assets/isogrid/entities/riverSW.go create mode 100644 example/assets/isogrid/entities/road.go create mode 100644 example/assets/isogrid/entities/roadES.go create mode 100644 example/assets/isogrid/entities/roadEW.go create mode 100644 example/assets/isogrid/entities/roadHill2E.go create mode 100644 example/assets/isogrid/entities/roadHill2N.go create mode 100644 example/assets/isogrid/entities/roadHill2S.go create mode 100644 example/assets/isogrid/entities/roadHill2W.go create mode 100644 example/assets/isogrid/entities/roadHillE.go create mode 100644 example/assets/isogrid/entities/roadHillN.go create mode 100644 example/assets/isogrid/entities/roadHillS.go create mode 100644 example/assets/isogrid/entities/roadHillW.go create mode 100644 example/assets/isogrid/entities/roadNE.go create mode 100644 example/assets/isogrid/entities/roadNS.go create mode 100644 example/assets/isogrid/entities/roadNW.go create mode 100644 example/assets/isogrid/entities/roadSW.go create mode 100644 example/assets/isogrid/entities/water.go create mode 100644 example/assets/isogrid/entities/waterCornerES.go create mode 100644 example/assets/isogrid/entities/waterCornerNE.go create mode 100644 example/assets/isogrid/entities/waterCornerNW.go create mode 100644 example/assets/isogrid/entities/waterCornerSW.go create mode 100644 example/assets/isogrid/entities/waterE.go create mode 100644 example/assets/isogrid/entities/waterES.go create mode 100644 example/assets/isogrid/entities/waterN.go create mode 100644 example/assets/isogrid/entities/waterNE.go create mode 100644 example/assets/isogrid/entities/waterNW.go create mode 100644 example/assets/isogrid/entities/waterS.go create mode 100644 example/assets/isogrid/entities/waterSW.go create mode 100644 example/assets/isogrid/entities/waterW.go create mode 100644 example/assets/isogrid/isogrid_tiles.atlas create mode 100644 example/example_isogrid/example_isogrid.collection create mode 100644 example/example_isogrid/example_isogrid.script create mode 100644 tiled/assets/isogrid/beach.png create mode 100644 tiled/assets/isogrid/beachCornerES.png create mode 100644 tiled/assets/isogrid/beachCornerNE.png create mode 100644 tiled/assets/isogrid/beachCornerNW.png create mode 100644 tiled/assets/isogrid/beachCornerSW.png create mode 100644 tiled/assets/isogrid/beachE.png create mode 100644 tiled/assets/isogrid/beachES.png create mode 100644 tiled/assets/isogrid/beachN.png create mode 100644 tiled/assets/isogrid/beachNE.png create mode 100644 tiled/assets/isogrid/beachNW.png create mode 100644 tiled/assets/isogrid/beachS.png create mode 100644 tiled/assets/isogrid/beachSW.png create mode 100644 tiled/assets/isogrid/beachW.png create mode 100644 tiled/assets/isogrid/bridgeEW.png create mode 100644 tiled/assets/isogrid/bridgeNS.png create mode 100644 tiled/assets/isogrid/crossroad.png create mode 100644 tiled/assets/isogrid/crossroadESW.png create mode 100644 tiled/assets/isogrid/crossroadNES.png create mode 100644 tiled/assets/isogrid/crossroadNEW.png create mode 100644 tiled/assets/isogrid/crossroadNSW.png create mode 100644 tiled/assets/isogrid/dirt.png create mode 100644 tiled/assets/isogrid/dirtDouble.png create mode 100644 tiled/assets/isogrid/endE.png create mode 100644 tiled/assets/isogrid/endN.png create mode 100644 tiled/assets/isogrid/endS.png create mode 100644 tiled/assets/isogrid/endW.png create mode 100644 tiled/assets/isogrid/exitE.png create mode 100644 tiled/assets/isogrid/exitN.png create mode 100644 tiled/assets/isogrid/exitS.png create mode 100644 tiled/assets/isogrid/exitW.png create mode 100644 tiled/assets/isogrid/grass.png create mode 100644 tiled/assets/isogrid/grassWhole.png create mode 100644 tiled/assets/isogrid/hillE.png create mode 100644 tiled/assets/isogrid/hillES.png create mode 100644 tiled/assets/isogrid/hillN.png create mode 100644 tiled/assets/isogrid/hillNE.png create mode 100644 tiled/assets/isogrid/hillNW.png create mode 100644 tiled/assets/isogrid/hillS.png create mode 100644 tiled/assets/isogrid/hillSW.png create mode 100644 tiled/assets/isogrid/hillW.png create mode 100644 tiled/assets/isogrid/lotE.png create mode 100644 tiled/assets/isogrid/lotES.png create mode 100644 tiled/assets/isogrid/lotN.png create mode 100644 tiled/assets/isogrid/lotNE.png create mode 100644 tiled/assets/isogrid/lotNW.png create mode 100644 tiled/assets/isogrid/lotS.png create mode 100644 tiled/assets/isogrid/lotSW.png create mode 100644 tiled/assets/isogrid/lotW.png create mode 100644 tiled/assets/isogrid/riverBankedES.png create mode 100644 tiled/assets/isogrid/riverBankedEW.png create mode 100644 tiled/assets/isogrid/riverBankedNE.png create mode 100644 tiled/assets/isogrid/riverBankedNS.png create mode 100644 tiled/assets/isogrid/riverBankedNW.png create mode 100644 tiled/assets/isogrid/riverBankedSW.png create mode 100644 tiled/assets/isogrid/riverES.png create mode 100644 tiled/assets/isogrid/riverEW.png create mode 100644 tiled/assets/isogrid/riverNE.png create mode 100644 tiled/assets/isogrid/riverNS.png create mode 100644 tiled/assets/isogrid/riverNW.png create mode 100644 tiled/assets/isogrid/riverSW.png create mode 100644 tiled/assets/isogrid/road.png create mode 100644 tiled/assets/isogrid/roadES.png create mode 100644 tiled/assets/isogrid/roadEW.png create mode 100644 tiled/assets/isogrid/roadHill2E.png create mode 100644 tiled/assets/isogrid/roadHill2N.png create mode 100644 tiled/assets/isogrid/roadHill2S.png create mode 100644 tiled/assets/isogrid/roadHill2W.png create mode 100644 tiled/assets/isogrid/roadHillE.png create mode 100644 tiled/assets/isogrid/roadHillN.png create mode 100644 tiled/assets/isogrid/roadHillS.png create mode 100644 tiled/assets/isogrid/roadHillW.png create mode 100644 tiled/assets/isogrid/roadNE.png create mode 100644 tiled/assets/isogrid/roadNS.png create mode 100644 tiled/assets/isogrid/roadNW.png create mode 100644 tiled/assets/isogrid/roadSW.png create mode 100644 tiled/assets/isogrid/water.png create mode 100644 tiled/assets/isogrid/waterCornerES.png create mode 100644 tiled/assets/isogrid/waterCornerNE.png create mode 100644 tiled/assets/isogrid/waterCornerNW.png create mode 100644 tiled/assets/isogrid/waterCornerSW.png create mode 100644 tiled/assets/isogrid/waterE.png create mode 100644 tiled/assets/isogrid/waterES.png create mode 100644 tiled/assets/isogrid/waterN.png create mode 100644 tiled/assets/isogrid/waterNE.png create mode 100644 tiled/assets/isogrid/waterNW.png create mode 100644 tiled/assets/isogrid/waterS.png create mode 100644 tiled/assets/isogrid/waterSW.png create mode 100644 tiled/assets/isogrid/waterW.png create mode 100644 tiled/maps/isogrid.json create mode 100644 tiled/tilesets/isogrid_tileset.json diff --git a/example/assets/isogrid/entities.go b/example/assets/isogrid/entities.go new file mode 100644 index 0000000..1efbffc --- /dev/null +++ b/example/assets/isogrid/entities.go @@ -0,0 +1,528 @@ +embedded_components { + id: "beach" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beach.go\"\n" + "" +} +embedded_components { + id: "beachCornerES" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beachCornerES.go\"\n" + "" +} +embedded_components { + id: "beachCornerNE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beachCornerNE.go\"\n" + "" +} +embedded_components { + id: "beachCornerNW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beachCornerNW.go\"\n" + "" +} +embedded_components { + id: "beachCornerSW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beachCornerSW.go\"\n" + "" +} +embedded_components { + id: "beachE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beachE.go\"\n" + "" +} +embedded_components { + id: "beachES" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beachES.go\"\n" + "" +} +embedded_components { + id: "beachN" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beachN.go\"\n" + "" +} +embedded_components { + id: "beachNE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beachNE.go\"\n" + "" +} +embedded_components { + id: "beachNW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beachNW.go\"\n" + "" +} +embedded_components { + id: "beachS" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beachS.go\"\n" + "" +} +embedded_components { + id: "beachSW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beachSW.go\"\n" + "" +} +embedded_components { + id: "beachW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/beachW.go\"\n" + "" +} +embedded_components { + id: "bridgeEW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/bridgeEW.go\"\n" + "" +} +embedded_components { + id: "bridgeNS" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/bridgeNS.go\"\n" + "" +} +embedded_components { + id: "crossroad" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/crossroad.go\"\n" + "" +} +embedded_components { + id: "crossroadESW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/crossroadESW.go\"\n" + "" +} +embedded_components { + id: "crossroadNES" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/crossroadNES.go\"\n" + "" +} +embedded_components { + id: "crossroadNEW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/crossroadNEW.go\"\n" + "" +} +embedded_components { + id: "crossroadNSW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/crossroadNSW.go\"\n" + "" +} +embedded_components { + id: "dirt" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/dirt.go\"\n" + "" +} +embedded_components { + id: "dirtDouble" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/dirtDouble.go\"\n" + "" +} +embedded_components { + id: "endE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/endE.go\"\n" + "" +} +embedded_components { + id: "endN" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/endN.go\"\n" + "" +} +embedded_components { + id: "endS" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/endS.go\"\n" + "" +} +embedded_components { + id: "endW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/endW.go\"\n" + "" +} +embedded_components { + id: "exitE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/exitE.go\"\n" + "" +} +embedded_components { + id: "exitN" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/exitN.go\"\n" + "" +} +embedded_components { + id: "exitS" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/exitS.go\"\n" + "" +} +embedded_components { + id: "exitW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/exitW.go\"\n" + "" +} +embedded_components { + id: "grass" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/grass.go\"\n" + "" +} +embedded_components { + id: "grassWhole" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/grassWhole.go\"\n" + "" +} +embedded_components { + id: "hillE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/hillE.go\"\n" + "" +} +embedded_components { + id: "hillES" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/hillES.go\"\n" + "" +} +embedded_components { + id: "hillN" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/hillN.go\"\n" + "" +} +embedded_components { + id: "hillNE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/hillNE.go\"\n" + "" +} +embedded_components { + id: "hillNW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/hillNW.go\"\n" + "" +} +embedded_components { + id: "hillS" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/hillS.go\"\n" + "" +} +embedded_components { + id: "hillSW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/hillSW.go\"\n" + "" +} +embedded_components { + id: "hillW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/hillW.go\"\n" + "" +} +embedded_components { + id: "lotE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/lotE.go\"\n" + "" +} +embedded_components { + id: "lotES" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/lotES.go\"\n" + "" +} +embedded_components { + id: "lotN" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/lotN.go\"\n" + "" +} +embedded_components { + id: "lotNE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/lotNE.go\"\n" + "" +} +embedded_components { + id: "lotNW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/lotNW.go\"\n" + "" +} +embedded_components { + id: "lotS" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/lotS.go\"\n" + "" +} +embedded_components { + id: "lotSW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/lotSW.go\"\n" + "" +} +embedded_components { + id: "lotW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/lotW.go\"\n" + "" +} +embedded_components { + id: "riverBankedES" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/riverBankedES.go\"\n" + "" +} +embedded_components { + id: "riverBankedEW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/riverBankedEW.go\"\n" + "" +} +embedded_components { + id: "riverBankedNE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/riverBankedNE.go\"\n" + "" +} +embedded_components { + id: "riverBankedNS" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/riverBankedNS.go\"\n" + "" +} +embedded_components { + id: "riverBankedNW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/riverBankedNW.go\"\n" + "" +} +embedded_components { + id: "riverBankedSW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/riverBankedSW.go\"\n" + "" +} +embedded_components { + id: "riverES" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/riverES.go\"\n" + "" +} +embedded_components { + id: "riverEW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/riverEW.go\"\n" + "" +} +embedded_components { + id: "riverNE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/riverNE.go\"\n" + "" +} +embedded_components { + id: "riverNS" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/riverNS.go\"\n" + "" +} +embedded_components { + id: "riverNW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/riverNW.go\"\n" + "" +} +embedded_components { + id: "riverSW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/riverSW.go\"\n" + "" +} +embedded_components { + id: "road" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/road.go\"\n" + "" +} +embedded_components { + id: "roadES" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadES.go\"\n" + "" +} +embedded_components { + id: "roadEW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadEW.go\"\n" + "" +} +embedded_components { + id: "roadHill2E" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadHill2E.go\"\n" + "" +} +embedded_components { + id: "roadHill2N" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadHill2N.go\"\n" + "" +} +embedded_components { + id: "roadHill2S" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadHill2S.go\"\n" + "" +} +embedded_components { + id: "roadHill2W" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadHill2W.go\"\n" + "" +} +embedded_components { + id: "roadHillE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadHillE.go\"\n" + "" +} +embedded_components { + id: "roadHillN" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadHillN.go\"\n" + "" +} +embedded_components { + id: "roadHillS" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadHillS.go\"\n" + "" +} +embedded_components { + id: "roadHillW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadHillW.go\"\n" + "" +} +embedded_components { + id: "roadNE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadNE.go\"\n" + "" +} +embedded_components { + id: "roadNS" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadNS.go\"\n" + "" +} +embedded_components { + id: "roadNW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadNW.go\"\n" + "" +} +embedded_components { + id: "roadSW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/roadSW.go\"\n" + "" +} +embedded_components { + id: "water" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/water.go\"\n" + "" +} +embedded_components { + id: "waterCornerES" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/waterCornerES.go\"\n" + "" +} +embedded_components { + id: "waterCornerNE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/waterCornerNE.go\"\n" + "" +} +embedded_components { + id: "waterCornerNW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/waterCornerNW.go\"\n" + "" +} +embedded_components { + id: "waterCornerSW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/waterCornerSW.go\"\n" + "" +} +embedded_components { + id: "waterE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/waterE.go\"\n" + "" +} +embedded_components { + id: "waterES" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/waterES.go\"\n" + "" +} +embedded_components { + id: "waterN" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/waterN.go\"\n" + "" +} +embedded_components { + id: "waterNE" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/waterNE.go\"\n" + "" +} +embedded_components { + id: "waterNW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/waterNW.go\"\n" + "" +} +embedded_components { + id: "waterS" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/waterS.go\"\n" + "" +} +embedded_components { + id: "waterSW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/waterSW.go\"\n" + "" +} +embedded_components { + id: "waterW" + type: "factory" + data: "prototype: \"/example/assets/isogrid/entities/waterW.go\"\n" + "" +} diff --git a/example/assets/isogrid/entities/beach.go b/example/assets/isogrid/entities/beach.go new file mode 100644 index 0000000..578e225 --- /dev/null +++ b/example/assets/isogrid/entities/beach.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beach\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/beachCornerES.go b/example/assets/isogrid/entities/beachCornerES.go new file mode 100644 index 0000000..07e355b --- /dev/null +++ b/example/assets/isogrid/entities/beachCornerES.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beachCornerES\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/beachCornerNE.go b/example/assets/isogrid/entities/beachCornerNE.go new file mode 100644 index 0000000..e33f870 --- /dev/null +++ b/example/assets/isogrid/entities/beachCornerNE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beachCornerNE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/beachCornerNW.go b/example/assets/isogrid/entities/beachCornerNW.go new file mode 100644 index 0000000..0c64d8a --- /dev/null +++ b/example/assets/isogrid/entities/beachCornerNW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beachCornerNW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/beachCornerSW.go b/example/assets/isogrid/entities/beachCornerSW.go new file mode 100644 index 0000000..c44e9c4 --- /dev/null +++ b/example/assets/isogrid/entities/beachCornerSW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beachCornerSW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/beachE.go b/example/assets/isogrid/entities/beachE.go new file mode 100644 index 0000000..790524a --- /dev/null +++ b/example/assets/isogrid/entities/beachE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beachE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/beachES.go b/example/assets/isogrid/entities/beachES.go new file mode 100644 index 0000000..8586a60 --- /dev/null +++ b/example/assets/isogrid/entities/beachES.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beachES\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/beachN.go b/example/assets/isogrid/entities/beachN.go new file mode 100644 index 0000000..c75e6e6 --- /dev/null +++ b/example/assets/isogrid/entities/beachN.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beachN\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/beachNE.go b/example/assets/isogrid/entities/beachNE.go new file mode 100644 index 0000000..60de940 --- /dev/null +++ b/example/assets/isogrid/entities/beachNE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beachNE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/beachNW.go b/example/assets/isogrid/entities/beachNW.go new file mode 100644 index 0000000..9732c99 --- /dev/null +++ b/example/assets/isogrid/entities/beachNW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beachNW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/beachS.go b/example/assets/isogrid/entities/beachS.go new file mode 100644 index 0000000..c61cda0 --- /dev/null +++ b/example/assets/isogrid/entities/beachS.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beachS\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/beachSW.go b/example/assets/isogrid/entities/beachSW.go new file mode 100644 index 0000000..dcaa7d5 --- /dev/null +++ b/example/assets/isogrid/entities/beachSW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beachSW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/beachW.go b/example/assets/isogrid/entities/beachW.go new file mode 100644 index 0000000..a578a5c --- /dev/null +++ b/example/assets/isogrid/entities/beachW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"beachW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/bridgeEW.go b/example/assets/isogrid/entities/bridgeEW.go new file mode 100644 index 0000000..5612f32 --- /dev/null +++ b/example/assets/isogrid/entities/bridgeEW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"bridgeEW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/bridgeNS.go b/example/assets/isogrid/entities/bridgeNS.go new file mode 100644 index 0000000..c52cf59 --- /dev/null +++ b/example/assets/isogrid/entities/bridgeNS.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"bridgeNS\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/crossroad.go b/example/assets/isogrid/entities/crossroad.go new file mode 100644 index 0000000..1dbbcc4 --- /dev/null +++ b/example/assets/isogrid/entities/crossroad.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"crossroad\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/crossroadESW.go b/example/assets/isogrid/entities/crossroadESW.go new file mode 100644 index 0000000..1091dda --- /dev/null +++ b/example/assets/isogrid/entities/crossroadESW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"crossroadESW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/crossroadNES.go b/example/assets/isogrid/entities/crossroadNES.go new file mode 100644 index 0000000..9487a88 --- /dev/null +++ b/example/assets/isogrid/entities/crossroadNES.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"crossroadNES\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/crossroadNEW.go b/example/assets/isogrid/entities/crossroadNEW.go new file mode 100644 index 0000000..7fb86cc --- /dev/null +++ b/example/assets/isogrid/entities/crossroadNEW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"crossroadNEW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/crossroadNSW.go b/example/assets/isogrid/entities/crossroadNSW.go new file mode 100644 index 0000000..3b69b71 --- /dev/null +++ b/example/assets/isogrid/entities/crossroadNSW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"crossroadNSW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/dirt.go b/example/assets/isogrid/entities/dirt.go new file mode 100644 index 0000000..65b7227 --- /dev/null +++ b/example/assets/isogrid/entities/dirt.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"dirt\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/dirtDouble.go b/example/assets/isogrid/entities/dirtDouble.go new file mode 100644 index 0000000..085c2f8 --- /dev/null +++ b/example/assets/isogrid/entities/dirtDouble.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"dirtDouble\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/endE.go b/example/assets/isogrid/entities/endE.go new file mode 100644 index 0000000..1eb913b --- /dev/null +++ b/example/assets/isogrid/entities/endE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"endE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/endN.go b/example/assets/isogrid/entities/endN.go new file mode 100644 index 0000000..8c7b08f --- /dev/null +++ b/example/assets/isogrid/entities/endN.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"endN\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/endS.go b/example/assets/isogrid/entities/endS.go new file mode 100644 index 0000000..f45f1ed --- /dev/null +++ b/example/assets/isogrid/entities/endS.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"endS\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/endW.go b/example/assets/isogrid/entities/endW.go new file mode 100644 index 0000000..8688caf --- /dev/null +++ b/example/assets/isogrid/entities/endW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"endW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/exitE.go b/example/assets/isogrid/entities/exitE.go new file mode 100644 index 0000000..5d6f317 --- /dev/null +++ b/example/assets/isogrid/entities/exitE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"exitE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/exitN.go b/example/assets/isogrid/entities/exitN.go new file mode 100644 index 0000000..b96396b --- /dev/null +++ b/example/assets/isogrid/entities/exitN.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"exitN\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/exitS.go b/example/assets/isogrid/entities/exitS.go new file mode 100644 index 0000000..2357c9b --- /dev/null +++ b/example/assets/isogrid/entities/exitS.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"exitS\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/exitW.go b/example/assets/isogrid/entities/exitW.go new file mode 100644 index 0000000..38581ee --- /dev/null +++ b/example/assets/isogrid/entities/exitW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"exitW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/grass.go b/example/assets/isogrid/entities/grass.go new file mode 100644 index 0000000..b88d929 --- /dev/null +++ b/example/assets/isogrid/entities/grass.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"grass\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/grassWhole.go b/example/assets/isogrid/entities/grassWhole.go new file mode 100644 index 0000000..2c8e681 --- /dev/null +++ b/example/assets/isogrid/entities/grassWhole.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"grassWhole\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/hillE.go b/example/assets/isogrid/entities/hillE.go new file mode 100644 index 0000000..dde567e --- /dev/null +++ b/example/assets/isogrid/entities/hillE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"hillE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/hillES.go b/example/assets/isogrid/entities/hillES.go new file mode 100644 index 0000000..373acbf --- /dev/null +++ b/example/assets/isogrid/entities/hillES.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"hillES\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/hillN.go b/example/assets/isogrid/entities/hillN.go new file mode 100644 index 0000000..e1a69c7 --- /dev/null +++ b/example/assets/isogrid/entities/hillN.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"hillN\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/hillNE.go b/example/assets/isogrid/entities/hillNE.go new file mode 100644 index 0000000..c760221 --- /dev/null +++ b/example/assets/isogrid/entities/hillNE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"hillNE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/hillNW.go b/example/assets/isogrid/entities/hillNW.go new file mode 100644 index 0000000..c0f9d52 --- /dev/null +++ b/example/assets/isogrid/entities/hillNW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"hillNW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/hillS.go b/example/assets/isogrid/entities/hillS.go new file mode 100644 index 0000000..1895a7d --- /dev/null +++ b/example/assets/isogrid/entities/hillS.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"hillS\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/hillSW.go b/example/assets/isogrid/entities/hillSW.go new file mode 100644 index 0000000..7f16e95 --- /dev/null +++ b/example/assets/isogrid/entities/hillSW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"hillSW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/hillW.go b/example/assets/isogrid/entities/hillW.go new file mode 100644 index 0000000..8119ada --- /dev/null +++ b/example/assets/isogrid/entities/hillW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"hillW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/lotE.go b/example/assets/isogrid/entities/lotE.go new file mode 100644 index 0000000..4db8915 --- /dev/null +++ b/example/assets/isogrid/entities/lotE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"lotE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/lotES.go b/example/assets/isogrid/entities/lotES.go new file mode 100644 index 0000000..2757eff --- /dev/null +++ b/example/assets/isogrid/entities/lotES.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"lotES\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/lotN.go b/example/assets/isogrid/entities/lotN.go new file mode 100644 index 0000000..7f12bbe --- /dev/null +++ b/example/assets/isogrid/entities/lotN.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"lotN\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/lotNE.go b/example/assets/isogrid/entities/lotNE.go new file mode 100644 index 0000000..bd91d51 --- /dev/null +++ b/example/assets/isogrid/entities/lotNE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"lotNE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/lotNW.go b/example/assets/isogrid/entities/lotNW.go new file mode 100644 index 0000000..0bb228b --- /dev/null +++ b/example/assets/isogrid/entities/lotNW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"lotNW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/lotS.go b/example/assets/isogrid/entities/lotS.go new file mode 100644 index 0000000..d334c72 --- /dev/null +++ b/example/assets/isogrid/entities/lotS.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"lotS\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/lotSW.go b/example/assets/isogrid/entities/lotSW.go new file mode 100644 index 0000000..feb11d1 --- /dev/null +++ b/example/assets/isogrid/entities/lotSW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"lotSW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/lotW.go b/example/assets/isogrid/entities/lotW.go new file mode 100644 index 0000000..345922c --- /dev/null +++ b/example/assets/isogrid/entities/lotW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"lotW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/riverBankedES.go b/example/assets/isogrid/entities/riverBankedES.go new file mode 100644 index 0000000..17f0ab4 --- /dev/null +++ b/example/assets/isogrid/entities/riverBankedES.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"riverBankedES\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/riverBankedEW.go b/example/assets/isogrid/entities/riverBankedEW.go new file mode 100644 index 0000000..7730d10 --- /dev/null +++ b/example/assets/isogrid/entities/riverBankedEW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"riverBankedEW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/riverBankedNE.go b/example/assets/isogrid/entities/riverBankedNE.go new file mode 100644 index 0000000..599986e --- /dev/null +++ b/example/assets/isogrid/entities/riverBankedNE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"riverBankedNE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/riverBankedNS.go b/example/assets/isogrid/entities/riverBankedNS.go new file mode 100644 index 0000000..e3400ed --- /dev/null +++ b/example/assets/isogrid/entities/riverBankedNS.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"riverBankedNS\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/riverBankedNW.go b/example/assets/isogrid/entities/riverBankedNW.go new file mode 100644 index 0000000..ee6a642 --- /dev/null +++ b/example/assets/isogrid/entities/riverBankedNW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"riverBankedNW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/riverBankedSW.go b/example/assets/isogrid/entities/riverBankedSW.go new file mode 100644 index 0000000..d90042b --- /dev/null +++ b/example/assets/isogrid/entities/riverBankedSW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"riverBankedSW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/riverES.go b/example/assets/isogrid/entities/riverES.go new file mode 100644 index 0000000..a4a29a3 --- /dev/null +++ b/example/assets/isogrid/entities/riverES.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"riverES\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/riverEW.go b/example/assets/isogrid/entities/riverEW.go new file mode 100644 index 0000000..a58f02b --- /dev/null +++ b/example/assets/isogrid/entities/riverEW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"riverEW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/riverNE.go b/example/assets/isogrid/entities/riverNE.go new file mode 100644 index 0000000..46ad836 --- /dev/null +++ b/example/assets/isogrid/entities/riverNE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"riverNE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/riverNS.go b/example/assets/isogrid/entities/riverNS.go new file mode 100644 index 0000000..ba74805 --- /dev/null +++ b/example/assets/isogrid/entities/riverNS.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"riverNS\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/riverNW.go b/example/assets/isogrid/entities/riverNW.go new file mode 100644 index 0000000..bfe37c3 --- /dev/null +++ b/example/assets/isogrid/entities/riverNW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"riverNW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/riverSW.go b/example/assets/isogrid/entities/riverSW.go new file mode 100644 index 0000000..16356fc --- /dev/null +++ b/example/assets/isogrid/entities/riverSW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"riverSW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/road.go b/example/assets/isogrid/entities/road.go new file mode 100644 index 0000000..3b3b1bf --- /dev/null +++ b/example/assets/isogrid/entities/road.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"road\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadES.go b/example/assets/isogrid/entities/roadES.go new file mode 100644 index 0000000..32f3f3e --- /dev/null +++ b/example/assets/isogrid/entities/roadES.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadES\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadEW.go b/example/assets/isogrid/entities/roadEW.go new file mode 100644 index 0000000..65f8ded --- /dev/null +++ b/example/assets/isogrid/entities/roadEW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadEW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadHill2E.go b/example/assets/isogrid/entities/roadHill2E.go new file mode 100644 index 0000000..f41aae1 --- /dev/null +++ b/example/assets/isogrid/entities/roadHill2E.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadHill2E\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadHill2N.go b/example/assets/isogrid/entities/roadHill2N.go new file mode 100644 index 0000000..52ce77c --- /dev/null +++ b/example/assets/isogrid/entities/roadHill2N.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadHill2N\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadHill2S.go b/example/assets/isogrid/entities/roadHill2S.go new file mode 100644 index 0000000..5f79cf5 --- /dev/null +++ b/example/assets/isogrid/entities/roadHill2S.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadHill2S\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadHill2W.go b/example/assets/isogrid/entities/roadHill2W.go new file mode 100644 index 0000000..89754a8 --- /dev/null +++ b/example/assets/isogrid/entities/roadHill2W.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadHill2W\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadHillE.go b/example/assets/isogrid/entities/roadHillE.go new file mode 100644 index 0000000..86b7b49 --- /dev/null +++ b/example/assets/isogrid/entities/roadHillE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadHillE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadHillN.go b/example/assets/isogrid/entities/roadHillN.go new file mode 100644 index 0000000..de73f4f --- /dev/null +++ b/example/assets/isogrid/entities/roadHillN.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadHillN\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadHillS.go b/example/assets/isogrid/entities/roadHillS.go new file mode 100644 index 0000000..442d605 --- /dev/null +++ b/example/assets/isogrid/entities/roadHillS.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadHillS\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadHillW.go b/example/assets/isogrid/entities/roadHillW.go new file mode 100644 index 0000000..6413024 --- /dev/null +++ b/example/assets/isogrid/entities/roadHillW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadHillW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadNE.go b/example/assets/isogrid/entities/roadNE.go new file mode 100644 index 0000000..23da417 --- /dev/null +++ b/example/assets/isogrid/entities/roadNE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadNE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadNS.go b/example/assets/isogrid/entities/roadNS.go new file mode 100644 index 0000000..708a109 --- /dev/null +++ b/example/assets/isogrid/entities/roadNS.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadNS\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadNW.go b/example/assets/isogrid/entities/roadNW.go new file mode 100644 index 0000000..1ed9455 --- /dev/null +++ b/example/assets/isogrid/entities/roadNW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadNW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/roadSW.go b/example/assets/isogrid/entities/roadSW.go new file mode 100644 index 0000000..9d624fa --- /dev/null +++ b/example/assets/isogrid/entities/roadSW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"roadSW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/water.go b/example/assets/isogrid/entities/water.go new file mode 100644 index 0000000..4bc7e75 --- /dev/null +++ b/example/assets/isogrid/entities/water.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"water\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/waterCornerES.go b/example/assets/isogrid/entities/waterCornerES.go new file mode 100644 index 0000000..d795672 --- /dev/null +++ b/example/assets/isogrid/entities/waterCornerES.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"waterCornerES\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/waterCornerNE.go b/example/assets/isogrid/entities/waterCornerNE.go new file mode 100644 index 0000000..2091b53 --- /dev/null +++ b/example/assets/isogrid/entities/waterCornerNE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"waterCornerNE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/waterCornerNW.go b/example/assets/isogrid/entities/waterCornerNW.go new file mode 100644 index 0000000..191c4ac --- /dev/null +++ b/example/assets/isogrid/entities/waterCornerNW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"waterCornerNW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/waterCornerSW.go b/example/assets/isogrid/entities/waterCornerSW.go new file mode 100644 index 0000000..f8362c3 --- /dev/null +++ b/example/assets/isogrid/entities/waterCornerSW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"waterCornerSW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/waterE.go b/example/assets/isogrid/entities/waterE.go new file mode 100644 index 0000000..fc28cb5 --- /dev/null +++ b/example/assets/isogrid/entities/waterE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"waterE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/waterES.go b/example/assets/isogrid/entities/waterES.go new file mode 100644 index 0000000..3f49d23 --- /dev/null +++ b/example/assets/isogrid/entities/waterES.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"waterES\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/waterN.go b/example/assets/isogrid/entities/waterN.go new file mode 100644 index 0000000..be5f9fe --- /dev/null +++ b/example/assets/isogrid/entities/waterN.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"waterN\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/waterNE.go b/example/assets/isogrid/entities/waterNE.go new file mode 100644 index 0000000..21a7f01 --- /dev/null +++ b/example/assets/isogrid/entities/waterNE.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"waterNE\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/waterNW.go b/example/assets/isogrid/entities/waterNW.go new file mode 100644 index 0000000..fc258c2 --- /dev/null +++ b/example/assets/isogrid/entities/waterNW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"waterNW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/waterS.go b/example/assets/isogrid/entities/waterS.go new file mode 100644 index 0000000..20641e2 --- /dev/null +++ b/example/assets/isogrid/entities/waterS.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"waterS\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/waterSW.go b/example/assets/isogrid/entities/waterSW.go new file mode 100644 index 0000000..a54afdc --- /dev/null +++ b/example/assets/isogrid/entities/waterSW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"waterSW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/entities/waterW.go b/example/assets/isogrid/entities/waterW.go new file mode 100644 index 0000000..21023bc --- /dev/null +++ b/example/assets/isogrid/entities/waterW.go @@ -0,0 +1,11 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"waterW\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" + "}\n" + "" +} diff --git a/example/assets/isogrid/isogrid_tiles.atlas b/example/assets/isogrid/isogrid_tiles.atlas new file mode 100644 index 0000000..b7799aa --- /dev/null +++ b/example/assets/isogrid/isogrid_tiles.atlas @@ -0,0 +1,265 @@ +images { + image: "/tiled/assets/isogrid/beachNE.png" +} +images { + image: "/tiled/assets/isogrid/beachNW.png" +} +images { + image: "/tiled/assets/isogrid/beachS.png" +} +images { + image: "/tiled/assets/isogrid/beachSW.png" +} +images { + image: "/tiled/assets/isogrid/beachW.png" +} +images { + image: "/tiled/assets/isogrid/bridgeEW.png" +} +images { + image: "/tiled/assets/isogrid/bridgeNS.png" +} +images { + image: "/tiled/assets/isogrid/crossroad.png" +} +images { + image: "/tiled/assets/isogrid/crossroadESW.png" +} +images { + image: "/tiled/assets/isogrid/crossroadNES.png" +} +images { + image: "/tiled/assets/isogrid/crossroadNEW.png" +} +images { + image: "/tiled/assets/isogrid/crossroadNSW.png" +} +images { + image: "/tiled/assets/isogrid/dirt.png" +} +images { + image: "/tiled/assets/isogrid/dirtDouble.png" +} +images { + image: "/tiled/assets/isogrid/endE.png" +} +images { + image: "/tiled/assets/isogrid/endN.png" +} +images { + image: "/tiled/assets/isogrid/endS.png" +} +images { + image: "/tiled/assets/isogrid/endW.png" +} +images { + image: "/tiled/assets/isogrid/exitE.png" +} +images { + image: "/tiled/assets/isogrid/exitN.png" +} +images { + image: "/tiled/assets/isogrid/exitS.png" +} +images { + image: "/tiled/assets/isogrid/exitW.png" +} +images { + image: "/tiled/assets/isogrid/grass.png" +} +images { + image: "/tiled/assets/isogrid/grassWhole.png" +} +images { + image: "/tiled/assets/isogrid/hillE.png" +} +images { + image: "/tiled/assets/isogrid/hillES.png" +} +images { + image: "/tiled/assets/isogrid/hillN.png" +} +images { + image: "/tiled/assets/isogrid/hillNE.png" +} +images { + image: "/tiled/assets/isogrid/hillNW.png" +} +images { + image: "/tiled/assets/isogrid/hillS.png" +} +images { + image: "/tiled/assets/isogrid/hillSW.png" +} +images { + image: "/tiled/assets/isogrid/hillW.png" +} +images { + image: "/tiled/assets/isogrid/lotE.png" +} +images { + image: "/tiled/assets/isogrid/lotES.png" +} +images { + image: "/tiled/assets/isogrid/lotN.png" +} +images { + image: "/tiled/assets/isogrid/lotNE.png" +} +images { + image: "/tiled/assets/isogrid/lotNW.png" +} +images { + image: "/tiled/assets/isogrid/lotS.png" +} +images { + image: "/tiled/assets/isogrid/lotSW.png" +} +images { + image: "/tiled/assets/isogrid/lotW.png" +} +images { + image: "/tiled/assets/isogrid/riverBankedES.png" +} +images { + image: "/tiled/assets/isogrid/riverBankedEW.png" +} +images { + image: "/tiled/assets/isogrid/riverBankedNE.png" +} +images { + image: "/tiled/assets/isogrid/riverBankedNS.png" +} +images { + image: "/tiled/assets/isogrid/riverBankedNW.png" +} +images { + image: "/tiled/assets/isogrid/riverBankedSW.png" +} +images { + image: "/tiled/assets/isogrid/riverES.png" +} +images { + image: "/tiled/assets/isogrid/riverEW.png" +} +images { + image: "/tiled/assets/isogrid/riverNE.png" +} +images { + image: "/tiled/assets/isogrid/riverNS.png" +} +images { + image: "/tiled/assets/isogrid/riverNW.png" +} +images { + image: "/tiled/assets/isogrid/riverSW.png" +} +images { + image: "/tiled/assets/isogrid/road.png" +} +images { + image: "/tiled/assets/isogrid/roadES.png" +} +images { + image: "/tiled/assets/isogrid/roadEW.png" +} +images { + image: "/tiled/assets/isogrid/roadHill2E.png" +} +images { + image: "/tiled/assets/isogrid/roadHill2N.png" +} +images { + image: "/tiled/assets/isogrid/roadHill2S.png" +} +images { + image: "/tiled/assets/isogrid/roadHill2W.png" +} +images { + image: "/tiled/assets/isogrid/roadHillE.png" +} +images { + image: "/tiled/assets/isogrid/roadHillN.png" +} +images { + image: "/tiled/assets/isogrid/roadHillS.png" +} +images { + image: "/tiled/assets/isogrid/roadHillW.png" +} +images { + image: "/tiled/assets/isogrid/roadNE.png" +} +images { + image: "/tiled/assets/isogrid/roadNS.png" +} +images { + image: "/tiled/assets/isogrid/roadNW.png" +} +images { + image: "/tiled/assets/isogrid/roadSW.png" +} +images { + image: "/tiled/assets/isogrid/water.png" +} +images { + image: "/tiled/assets/isogrid/waterCornerES.png" +} +images { + image: "/tiled/assets/isogrid/waterCornerNE.png" +} +images { + image: "/tiled/assets/isogrid/waterCornerNW.png" +} +images { + image: "/tiled/assets/isogrid/waterCornerSW.png" +} +images { + image: "/tiled/assets/isogrid/waterE.png" +} +images { + image: "/tiled/assets/isogrid/waterES.png" +} +images { + image: "/tiled/assets/isogrid/waterN.png" +} +images { + image: "/tiled/assets/isogrid/waterNE.png" +} +images { + image: "/tiled/assets/isogrid/waterNW.png" +} +images { + image: "/tiled/assets/isogrid/waterS.png" +} +images { + image: "/tiled/assets/isogrid/waterSW.png" +} +images { + image: "/tiled/assets/isogrid/waterW.png" +} +images { + image: "/tiled/assets/isogrid/beach.png" +} +images { + image: "/tiled/assets/isogrid/beachCornerES.png" +} +images { + image: "/tiled/assets/isogrid/beachCornerNE.png" +} +images { + image: "/tiled/assets/isogrid/beachCornerNW.png" +} +images { + image: "/tiled/assets/isogrid/beachCornerSW.png" +} +images { + image: "/tiled/assets/isogrid/beachE.png" +} +images { + image: "/tiled/assets/isogrid/beachES.png" +} +images { + image: "/tiled/assets/isogrid/beachN.png" +} +extrude_borders: 2 diff --git a/example/example_isogrid/example_isogrid.collection b/example/example_isogrid/example_isogrid.collection new file mode 100644 index 0000000..df7a07e --- /dev/null +++ b/example/example_isogrid/example_isogrid.collection @@ -0,0 +1,78 @@ +name: "example_isogrid" +instances { + id: "entities" + prototype: "/example/assets/isogrid/entities.go" +} +scale_along_z: 0 +embedded_instances { + id: "go" + data: "components {\n" + " id: \"example_isogrid\"\n" + " component: \"/example/example_isogrid/example_isogrid.script\"\n" + "}\n" + "" +} +embedded_instances { + id: "background" + data: "embedded_components {\n" + " id: \"sprite\"\n" + " type: \"sprite\"\n" + " data: \"default_animation: \\\"pixel\\\"\\n" + "material: \\\"/builtins/materials/sprite.material\\\"\\n" + "slice9 {\\n" + " x: 2.0\\n" + " y: 2.0\\n" + " z: 2.0\\n" + " w: 2.0\\n" + "}\\n" + "size {\\n" + " x: 960.0\\n" + " y: 640.0\\n" + "}\\n" + "size_mode: SIZE_MODE_MANUAL\\n" + "textures {\\n" + " sampler: \\\"texture_sampler\\\"\\n" + " texture: \\\"/druid/druid.atlas\\\"\\n" + "}\\n" + "\"\n" + " position {\n" + " x: 480.0\n" + " y: 320.0\n" + " z: -1.0\n" + " }\n" + "}\n" + "" +} +embedded_instances { + id: "camera" + data: "components {\n" + " id: \"camera_wasd_control\"\n" + " component: \"/example/assets/camera_wasd_control.script\"\n" + " properties {\n" + " id: \"movement_speed\"\n" + " value: \"600.0\"\n" + " type: PROPERTY_TYPE_NUMBER\n" + " }\n" + " properties {\n" + " id: \"zoom_speed\"\n" + " value: \"2.0\"\n" + " type: PROPERTY_TYPE_NUMBER\n" + " }\n" + "}\n" + "embedded_components {\n" + " id: \"camera\"\n" + " type: \"camera\"\n" + " data: \"aspect_ratio: 1.0\\n" + "fov: 0.7854\\n" + "near_z: -100.0\\n" + "far_z: 1000.0\\n" + "orthographic_projection: 1\\n" + "\"\n" + "}\n" + "" + position { + x: 480.0 + y: 320.0 + z: -10.0 + } +} diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script new file mode 100644 index 0000000..b0c5eca --- /dev/null +++ b/example/example_isogrid/example_isogrid.script @@ -0,0 +1,40 @@ +local detiled = require("detiled.detiled") + + +local function get_z_position(position_x, position_y) + return -position_y / 10000 + position_x / 100000 +end + + +local function spawn_entity(entity) + local prefab_id = entity.prefab_id + local components = entity.components + local transform = components.transform + local position_x = transform.position_x + local position_y = transform.position_y + local position_z = transform.position_z + get_z_position(position_x, position_y) + local scale_x = transform.scale_x or 1 + local scale_y = transform.scale_y or 1 + + local factory_url = "/entities#" .. prefab_id + local position = vmath.vector3(position_x, position_y, position_z) + local scale = vmath.vector3(scale_x, scale_y, 1) + factory.create(factory_url, position, nil, nil, scale) + + print("Spawn entity: ", factory_url, position_x, position_y, position_z) +end + + +local function spawn_map(map) + local entities = map.child_instancies + for _, entity in ipairs(entities) do + spawn_entity(entity) + end +end + + +function init(self) + detiled.load_tileset("/tiled/tilesets/isogrid_tileset.json") + local map = detiled.get_entity_from_map("/tiled/maps/isogrid.json") + spawn_map(map) +end diff --git a/game.project b/game.project index 4ef09bf..36dd335 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example_hexgrid/example_hexgrid.collectionc +main_collection = /example/example_isogrid/example_isogrid.collectionc [script] shared_state = 1 diff --git a/tiled/assets/isogrid/beach.png b/tiled/assets/isogrid/beach.png new file mode 100644 index 0000000000000000000000000000000000000000..c31e1eacdb0f38a7b53cb4947148f487a4ad758a GIT binary patch literal 722 zcmV;@0xkWCP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0%u7?K~#8N?c6;} z12Gr}@cSlytwPam;@~K{xHvf!>F7|c;OgKiR)j8sg`yoQo$N=6o|5bJ+FYJoUM?^H z!owY0j<)&nkmQnFmIeO#Ufk?0KX32y$j<}+JK_HP0%AU5%W?q5EvgU#FrGpH#x4vw zBdQR9F$-f10x)_o)*t|*2IC9@F!eC4K>%hG#v6##VZ4P%4JH_f*kOW&hz%whh|po8 zg$NBM83^BDl7;XM1`w5b7!KrmJ_Zm12-g_{2qJ`S7(g_HFbx9;LlC+!fUpFi3Ihm7 z5Hc7*v;-l7nNJ7o>tndNwn?^N0N0Jz*J5_f-Y4fQo4sAKJOI;9rf`VK(-F&~00E3! zkSc@_1Tc1CL=aLCz?g-RL6AWJqX$EUPzC{v8jLDL0Wy8P`0Hh<26|OtJ@>n-a&L=z9%HYpEr{VsXEi$Q^omUzi_@%07*qoM6N<$ Ef@z5&i~s-t literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/beachCornerES.png b/tiled/assets/isogrid/beachCornerES.png new file mode 100644 index 0000000000000000000000000000000000000000..d5fc4c0854ef6fedd37716c54a657a8c32723f05 GIT binary patch literal 860 zcmV-i1Ec(jP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0`W;iK~#8N?b^+5 z(?Adh@VrSMh1ZBwK@UiX3m1gwkt2ujAtX*sX?g&u1+|s9P?C_e6srW<(g1cy948QH zUSsgu*m9D3J?k&*^+fthkzysXf8Lp0Z%QQzUhC>~iA91_$@eKRgsM8Jt*aAYvELI+ z>Z*Nf?#}L{x<}{{Da9F zL}6jF4pA7Gyg^6{lXnPdU}S^HEsX3Cxq&GfL}p=%4v`rcg0MHl{KDHPn~s#F>FE6x zI|uhzE{ubknRd7Hw2geYVIM{idVG1QZBC;2{{w zwx&aGsKCXjjmk*dg`@hdU=V^3gJ2jhGy{GbhbRaJ=Ed+GAp{`~;gqYd`mu@8LS>@w zgVMZhjSMF6!BU{00$3nPPJH1}>msqyeC>}@@Q+DVr?whU$$SS{NiP6#IWqVsOdo!$>F#+Q!|W=4h=f?+Ix5KJ@>hIKyp0Fz;TA?jJx#kdTD z3qmmAVXPIp-ZDYnx>3*8EDRn53WQ+7!E9>-F!Y86(*O1x1tA1NFyb&7@y6Zqiu>q< zV8qLkI|YstV*dF%!3e-42|+L!g&>%edIV}~kaJL>OIezwNffG3FjllK-FEbN`AqYG~qNR)=!b8Lj6LyDg zVPh!1Q}Zp0#rvK?vS2qA*wxf)IoVTgrk!2qGecD2yKnLBtG!g_#E-h=d`6 mV5nKA4B+>3PV<*#MEnK9nKpdmX4o450000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D14BtfK~#8N?b=Ij z+CUfpU~bSOX3IKyCIR4Ow*2P1_w0JEVjZsgbHetI|?Dwy_OJ-IOCt zJthtg4|{Bn9nZ`kX+*%_d3^Ja{o5{;1o)dHwMvQrUE#kAwxN_A{SuS1G_K10_lV;j zI7auWJ#DXi5NFz1kO}`BbMiV>03~nMf4cg_);gx66O4x-bG?fl zO*P4P@@|)u^^t+LG-c@M${ofo2tl#XR@zQS@#j+g3@s_YFo&5aSb|u%0tBt#x9fwi_7)BLRquGS_=2tlK5!{w&m~S{_C^ zkcH866US@F=F`j~3pG6qb|8R~*uyrOWec@D47MNyr4N@_;>eIJeDp7t9@WQo<7{kWWirG_>oAWHgg)ceWQ<82>$;XlQSFj$dk}&QlwU5!rUx^e z_ER0yXZkh%p?$fB2-X2Gf$4S#Vtc^I`!&u8kESN>R73_id z1z>WHk^lt3*Z~2UoIv(Kgn|G}Mlc}|R3HGu2!;Y876`y3goy!>2n1j#VG=-WKx)TT zrFLuv&$ej)hqJORpcD}G=N0q(MP>7Jz6vnO^DveW+s~~64CS&!lE^F}0H&Z2022a} zXGBCjaxe8#RwM|iBc{j@Qo-;9Av6rn5JJI-1i>|o$Piq?$OKVn7?~jo1p^R=)685G zOn`{W_cz-!g#ie9h)kC#8qMAD@!3IrfhLd1nR1OgC@A!uQ?K>#9Sh$t91Smz9Is5<}PFG@uG2OCZcozK7D Q8vpSq(r~m)} literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/beachCornerNW.png b/tiled/assets/isogrid/beachCornerNW.png new file mode 100644 index 0000000000000000000000000000000000000000..59d4f3427778b0e9dc19e346c2532a979a443e3e GIT binary patch literal 857 zcmV-f1E&0mP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0`5sfK~#8N?b_XL z(=ZeV@V*I;!fRBT&|ZKGE)ZNIu8^pPxL&sw0T+x(n?S6Tl`V{I>_e=y6JEE(ZLUA(*5g5JnOvZ3u+ngvlBLVM1X3Hw41`gUK6& zwlH~z&<3Vx5X!<79YPrx)gTHBqdG)kV044XEsX9EslbrVvSHH=!?rf+Hf=m|Ga58* zySW;C2%LpOi0cWlu*8}uJNfnm=-Db<(k3%DZ8~sGgIsJGFUXL&L#&2qFm*STV=jkH_~A ze@J@~e)m5|=G59pkeDD7n6LZwQfuK3?7X}SK`^9UbwIY5*}FJFkhma69avthKi{uiFajW$AVDycymdf~Ni4bx zIAUkNLYa9h!GPcb@xu(y-;F`+{*E(Jx3D^RtAhhV2*iWgeRU7Iod#m003ik9!K}Y| z2KDb55t?jbQCs`tyo+Jo}^WC>dfVdN`5NeKU< zLWB``a!L~dVR8zAFbtS1D@AHbjc00000NkvXXu0mjfHgsqR literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/beachCornerSW.png b/tiled/assets/isogrid/beachCornerSW.png new file mode 100644 index 0000000000000000000000000000000000000000..db867cdebd176a9977bceb9f36b706dd44055cc2 GIT binary patch literal 839 zcmV-N1GxN&P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0^CVNK~#8N?b^?4 z6G0RQ@cbwKTY;jz6%QUo5$Zua^bq_7>cP~e4Xp@5iw7|#u{PQ?ZcL>~x^|N^22<_7 z@!Z)aZAi1TGrKd>+1VHPl7)qZ-4Ac}&CaA!2K<)o(`zIK+)BJ}fgohaf2`xChic%z?cRRTNu+JVgr*j2yJ1K4xtSULYys#`9;}68A8w@lvNBu z@Igp}L5OG&!e9_WEJSD+gpdot41*AAA*e8`)#~}aCR!_p=j5YhzgBap(xdCJ_4YC3 z8ck|%jUW<1tOI!cDg!Hb)8K)OgD?^w`mBlM1O&mj1cES%KxRNtK@dg~3jLr~=f{7EvRl%&<1Ni71 zg4Jz6t5<`+{cSg&M=87iWjOIt^3v$;LD4yYb^DmTosBbuDwxfq4zzpU;ot8aH(y2} z7<7=6ei4SpB%k20y93{xx<8Id5VBx4e)U}l3r<}Kl3}j^1LwV$PAd;iGY|I9EVO<+ z_hMDjcb`JL@dEbumY7m0 z+ys_bl||Ss+=I23i{63|Z!Ue}2x?DtJ0GQ8uHK!}FHm$g8Q$xDSD$`aSUN_zgj zm*s_F1u?FD)fFZP1R(^=1yzh62to*kV14;dgCK-th#;6T2tp`^@Pjc0;y>BiiV>}# Ru~q;8002ovPDHLkV1i95S{VQU literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/beachE.png b/tiled/assets/isogrid/beachE.png new file mode 100644 index 0000000000000000000000000000000000000000..687e9670567009adb0462453a307a219fc7127f0 GIT binary patch literal 855 zcmV-d1E~CoP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0_;gdK~#8N?b+RG z6G0RQ@O=Xxp^xAr_!@zt0WZW0Zv?4N;Eh3xm)hD0-V}-yq>ZHsf=DPrZ7s5BNSmY) zdZ~{vI;k6Wlik@fv$MPN@ed4yu$yJ)x96OlIYHpS=kmPMoDBEdSEIcZ2X4piTbPbI zw=T~=uxJ3LM$ccPgPW5<=T962Fg1aQFc2{nqx`<;-k1#c#%Ym}^&3)INl4ciol_YM zM2w*rfYA)Y(~fFnAeC8wfrwE=`WG4Nx+4P-qlm#*;Z?9 z|1i{5cpXSyEigC3tCfv#+TIMOZ2!j@`#J2*Hx28Ue9<+XhKWOPjQ9YI;@gnQX(9-~ zsLZJ1IWiD{QJiGTX+r2}Uc;CS z;T4Qc5H`VtCoh>qsSX00AxwuEe1FS69o(mZxCCJ$%rM+$pAR48gSZS~3QQa$GeUfV zs1s&9c+dL1hqK6tMxuuJ3{f=<$2j`9mcW=t2q2O@n6mpZSr{{rH~s#sLx&-r1D%bs zul*-Wk-;%~yZ2boeRiAeZa-)3<1?TT9?YUJX&4-0XZ;S_dfd1Mi3VWknL-8T^yq0K zGU5;%V+jN>bdV^;Q(^cjJbIH#gAjrMMlVc+A%Y-*0H!z$-x8rfNPz%G4d&!{hrN4o zcUBvyBT>}j1zz+W#Xkq=%QyD=Rf~)e#|pZw)#hPqbxg&;TbTf(0K~?l#&~P3(VTCc z07gD7%@@-;Ar>1VfRTVH69O=XLI9?s8X?uIO*z=>R90nbl7;dL#$*VuQkhK{`lU{I_p h2FSWxRQz3uh`*O3kxu@+c$@$L002ovPDHLkV1g5EWlsPA literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/beachES.png b/tiled/assets/isogrid/beachES.png new file mode 100644 index 0000000000000000000000000000000000000000..3ca57c0dc15d02a8eda0c7b06a033593022c7c96 GIT binary patch literal 1555 zcmV+u2JHEXP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1*l0xK~#8N?b}^% z+f*0_@O}e6LO%i@feQrECL};ytkT5V8zv+!c@r8S1WX%>pp)2!AlcHbowTkSu#Glp z-kPN8+GYz)+q^Zl6X@0;ZrDdS_(^u+6W2aIcI*?|aivFz(=2oH%l|nq^Cl)d{*x|! zGbuHfqn%c6+T(A<+ovD;L=9h>}1;z+aIGJLIOR=|6aW`@-6>1PTekSJH|4C0? z;&h7R@z-F8(DF$XNzG7Gp@q^Bb2|Zw4c`?K0x+OOX?@@+fAMi^FsI#Pa?;k3r@DS8kJ z#-f~xtg5t=ViqS@%@f}@8U!7~I*!)(GxjJ(5P$(ysV$R~ie z?M(V|BsU8I7*`Whs4c9>A998$Ed<(QY(Sz|=tBSoS-yg?0)fYkt@6(*3=#(4Hv@DW zXJ6RTh42;3Fc1K8W9=+@CZ*-d4Afv+tOM-{o9Ng2!9Wt!0D8xsO3bhjWIB2v>QaEL z;0y!dsl?a?fyWMQ41F9(5)J4tDT|VgJxhr&N{*`%VzovFbv$9!AYaGm_-ljHOC=F+RB`Sz#vcMbdaT_g~Xu) z)r55}si3tpM_U;W2)t+YR7%PqP=he|*a!$P=BjP($>1_8;{}1!0n=Rt1jDf7xDCVh zG3M*V*U)zlPINc;c$7W}iK7kF5;Lw!h9imjV*XVG#S12!nwAri&`F6JWiUZ2jeXa& zDWj>f<-IZt!V~6DzS^*dLKY1piK;^0Qy7+8nHq!#%x>it0u)>N!g)stg0w$a~BZI6GrKClT1IH~f<=J*+dL6?GVmC~^ zzNA9Y2P!uUz68No1Bv-|?)C00%WMrhD_dIskOD&DtRlaI^kMQF(TU{u@1prD@1Rk@ z)a!R-l(->`BqV*EkjQo!UHc`3u75g(x*)iC!^~yglP{u<_p67a4YW`d{f9z80LC$p zQNSdN7Y0x;kQ!&LQSuLn1_Tv^C(NbTTc})_*F+)HBMAvlY@1N0#S{o85MD4>R!-?}V7 zC?KKJ(}~dOHaXj3z3;@V%ortxD$O-_q6`5M{%ERw{gWx>|Jo;A1migrJ0aB9wYmic zP|B5?#8^U(E4}-Wl-o6H7sJ`HNk}f}aLZx6J(dWg3yj?W15@J1dtoYyD6FFU^$OpC z-pNFG0cK_ED=G@4CEwU~eq0$PgxgvfY_n)jied_q)CkVH|Z0F7)sM5xHv|F6**1`UKx1{>LKG^2LrZVvR8Di8hx%m5tr2wrE z{|w!@`g!*sgv^%d1)b5lg7@!vEihRyQoo%=OS5N8BLJG`A$TW-1`ThMhx<$thTbTo4z{q`Rl%{Sr}Fj-%VfL3S$Hk zK-es2lo&mb0K#Sn*1=y55?X5T_>57+W5YcBbE+E{-7;ac^%Q^inpIV0f_apj}h{hW-uf z0|h>^+EfVGR!41Eb4V_C>mu<)ez|E=Q&|@(mu0TJB^T9Yv3APV?&){kJ6t@@9`RE* zp6v5Uy*_b#2pZL7_-mJ>7DlrblpmzeU z2Yn}tGX;t$Tu=%Ds`xT7B2e_NhMPFcq9uFkyBa!5;uAMa-_%t%C(gvBuq>YkIO)ZI&|H$xpthHCX`fo|xYyatU&fJ@zpux7^l9gHV zkfy|R1&6~sco?~ksdKDOtZCc8#iqE(Kk3-KQvynIi!O9Ha#V7xHQ<;i>%{GIF+OA=fJVl_AvEkEVQ=k0$cP$+#z zR^#O^0jIh-!My8UFYVUXUQ)Qn?b*R6jzFh$M6LGb`=UcwqM95N zd7F~-6gVTBnmEdH&h7 z2<}=dBXG6%(~pA9f4;^4=59GD_fbpnNaE&qI zXrd(0)@*pwRMoL!>K{c%3tn6S{z!fi_uNU296vAigh{kaXuoi4s-jC7$5n%z*x*ar zm+oAC@M;#%;w5WhC7m+9`Eo0BPx^Iq!n3j_?Km+tP8LOx%jyS@G%BPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1r$j{K~#8N?c42c z+Ey3`aPDB2&^zh0O`Fzfnp90wBUMwr?B&avNnN&SQmRa8r?rdPO{==9OGHAGc12Co zCTkK3Nem?)Kc2@nCV_wl{wCSV zF&q!JYY z=@7unQLiiS@-zuV2JM?TTa~p(b zE5_{*o`LZigll2E4&fRYzd`gZjC^ICEC1fB3%XWkNlve~pmam*2*z6dxMig>(8V4yOmU+t+IbQz@p7Rf><%*y6-Tab6YTQ`u~o`6YCc37ngG z4{&Zqh9H-_123c%!<3{5gTo4I%o4XJ-=U)+kHHGhf*_?BG}v;`z(b{&(1l|kKycw( z7`}d7P7S0rOawvI!;5P`Ve}vvLXtMnz+(Vy>L6MOA_y6#5k$ekFw3-J07HmG2n8kq zB#4$EdKhC63{yrC5X_eF1ZG*uH?8bez5v??I|w2PuTVAM7*|FdLELX>O$vZ^s%u#a zgmzjz#)KQ%mQp1cq?$)^c7zn%%X6NEndb!96}J%pqlz&|6=JA%j37ant`IHEuX7*6 z!_A*T6c%bYS`Y=MAjW{<(-6)dxE?2*7a=ZWpj1d`AQY53NJ)&qPA1eAL=EJ^^at`; zR=XJszYpQWS;*vOj;fBKdftgzU0ut#fz;SnLZOaIy`dAbS;woxun-JwQeN{cU z3S#`8+>S~G{E1&bihAJn^G~vW!|eJQ7`gdw#}HS}e*(cD2dW@Sx`ny4cmi%GzJb`& zi%oE%GKxAFC@XG2Qg{Z79P0=Y9{fcv4;w-n_QWkXl+*wU1Q}#^KLr0IhT!V*DN7(Q zh7QC^nDM2LV0!&a87G^YRaK521mpZyP$!0#W59}!Whh42m2;2dn`R!ZH%eT1j{5&| zH1L~{7nAU^u%^m7ny;o_5qc1Te*m}=<~F{EzoG+hap6NtA)10%4TEv6Jvs$yX|L z0?*G8s-&|D;rV&A-Dy~R_8WSg^YW+vkCl@;0H+~30&xmP`{`7cL(Erb06Pn5o219> zZcPe+b{dF{pB{{kpFUKdZJC|7;;gLQfwKGgy@Hq+9ykpCFfdsAZK2;``UXP#Yfrzy z^eu$nU|a*?br{z|cn!ug5N?O@EQH%&d;`(%FusN8Hy8>*_;uw?JYGoLNwk8X8x~&*m5f);oH`OVO=dUAd8gJ8^Z5PHYi0dxsOplmDPc#eD z3WP#f4Au(9GhcC7JZ`pcjs&9xp%q~}MdJ%-VH6Mw;V=a0I>svy{{xo|F7W*{+Vubc N002ovPDHLkV1jmXX?y?x literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/beachNW.png b/tiled/assets/isogrid/beachNW.png new file mode 100644 index 0000000000000000000000000000000000000000..dda3e67b911a55c9a4fc9cfc35f9f7fecd6f7148 GIT binary patch literal 1578 zcmV+_2G#kAP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1;0r|K~#8N?c3XL z+EyF~@cak+6Z$9YPuRn>Nv$-g(_SJ~YbH(FsSr~)>HrNINUH7*A31>cL2Ol4NIlcjQPNko~U{b}Oet$pvm`+WF;LoYJ zF~jpq@%7?Y=R)x71p8O$wl-ck6*mDap|K1Sk3Ww`)-N!aaj^DUkDl)|HvUB*=<$zA z6hyZ#Gni4L7-8UPS> z`_#Eb5KUhOk;DZC<0Xs}3>*%&Fo?onJW}ZhiMX9)=K$dS zptLX;n=mrQtlMOepVvcSFcdKGD%@L)NAg8vzslA5p`@@GV}jxxhKhhNXi!*UFdTeI z#C}4I0T4u2PDsDDz;Sg!Gf(i@!V)8+SY3q=16cz=2pj=I;I&(vwM02{iHX&oor~7G z@mQ@365KK1g|xD0s9)9yW&k7z++Nyyp9&@PFgOInz)OYk9zaD&%4tagv9Si`wx+33 zLI-08F$_}yrDkq$hNL$O^#0ZBzt#uPt9T7|N+lmzC=-%AJ*W`(N(Nk|#CAk>z~6p#qy z_RmRsvqbMydEye|Cj<_2tJVgE#uE*ST>uhfC4a?n+nTuRm{CEHX<3!i(h}4E&jW26 zvPwixf}c~XcoO#%WGusfTo5?SLR|tiA*Y!M`WRXOgz;2HL1om2ym;N$Tg#IGLAEe` z6l(+(WLsW%eASnf_%{3}4PqE&Pt%6rEv;gA-`EK<*_;T?jKygPx-6bdxILan}f`OO=kRZ|YjPETAL3}#@B7j8&5=00b zr6S}l)6mC&X;RB>+p)7h2|)!CbO?m9$yZH4RDi!)I{;O+e&3gL7(tkVgarbD+?7v- z)pn#0fMdYt+eZ;kL98HjLBa-sx2?9ARoW4G;D@&}@;({)i*?@24_XKfNSGlIN<}Cb zVDtg-YVgah(_t54020j|D0k?>UMk2i015J7|3k+hP9Y%3*SB5>m7XcwXFPp7Ce*dcIItcAYMU0 zj3JP)!ekp|0z?IX2&i_BzNg0U8p0GLOfc|XNk_^J5`Y8X&#U!Cs>MXVAgDmX0CUj% zbC3WdjE=ActnLu{4Pgr;s4x$?h5^Q|{CdA2MlAh?VXGPygd>n3!N67}iu)Ldia>)g zY6unNqv@IG2h(l*Y>W2!q@I;Q3|=e@Qh)&PN26qn3nCf0)J{b%%?wt1Z-xZMDaOP= zkn8V3hFPo&hROK5odd9H+>&NyOe{puVb(YfoJxC|HiZz-V_E)h2k1U|U?74916$NV zv!p30CTtA0#)(Q6yj9=QuUq8JK=$tRG8gn1$0~crWl9EF)*9B zsC;<%>C=1fnsh}Inc%Yw^U^Zce cF=0u>e^Z%gN`&aRH2?qr07*qoM6N<$f?veKNB{r; literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/beachS.png b/tiled/assets/isogrid/beachS.png new file mode 100644 index 0000000000000000000000000000000000000000..9e8f3b5686dc456aeeaa4ca95fd82d456b89eff4 GIT binary patch literal 775 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 P00000NkvXXu0mjfA&u|# literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/bridgeNS.png b/tiled/assets/isogrid/bridgeNS.png new file mode 100644 index 0000000000000000000000000000000000000000..5aabefa28bd79eb3a4a6e2772265a91235e63d1f GIT binary patch literal 1105 zcmV-X1g`suP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1LjFYK~#8N?b_W= z6G0RJVBUa7;8A>rUXWmkV$?JZH%h1iv4YP2t+s>R*F}kxZT6Kc2rUYEjW7*B5rIG$he9BX1u)fQgdPH6>HuQ} z1j1AS(+CKJ5rDA+0$~_1PJlp|B8(FudF20gW;WLQoLK0gW;}2*TLhC^G^<7@J^tAPCc77*P;}k%Re>TZ4@cql(md zZ0zuF^YYsB91XV26;EaC$Cp%ykK^!Wx)0`GL~|s@Tof{CV)uApZ1?xcMBx}_w!Xn? za#}rQ$qt1153{rNt{A&vcr|sSG!|YDgBoKJYZlBz;ZIAvaI8=Wf}tGArQe}5CVY!^!Hxjf@otM-^eOW z$-xV-wD1U&t?ja`FhfF^N*FB!!H@#^`W+JEF_`RW0~Lf0gyCm^e#v4%2!rGfATgIv zA?PRrK^SomGYBro{CyQ75xrD~QIR3qY{8|BjUxhK1hSauhS^vMCi~7;K$vC-!ien= zH1I}Ox~ab$?}C{JS4|WOv$z+5cCfeNr)AueLW`lO`s0zeSFttDgTLW-6+$sfe z1`=!USc|nE>6a;y_g*}e*#!}gv>i>}Z0jhMQ<6T1aSVjMz~wg>$3plGCKBl?l{k2( zCH?2M>=6}96Sw56o8YyKq19J%By|;p*D{9mBQo!wmWq8cAhu=%FN55cG1|tEwkIJ1 z;%ErBX3X1}Tg(!;8HlSO+y)~9;%W%Dz=(i&3c~3yW+0x1a4HN7gj8RjMK4xWYpVG^ zf_G}N`g6NaWm*sdAzOW=ML*X=I3;5Uh)83IRSGBn^Bjb&Fke2y+{ksI#*iMw^AHV% zIemD5)w4Fr1kWx_vU^fp_n6biX%IqIfib^U82VfjF9UqPG|5_33xg1{k(Qh<3nL2R zyUkiM?%e63Fgy^1;D%am0uRQw_Yrbotp98y7~HJuA8V;^)WhI?gjD#fn@nN6vPb*_ XFvn)1-S$gr00000NkvXXu0mjfPaNOU literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/crossroad.png b/tiled/assets/isogrid/crossroad.png new file mode 100644 index 0000000000000000000000000000000000000000..72458557d392f9cbbae1f8a570f141be0d51d527 GIT binary patch literal 1717 zcmV;m21@yfP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D21-dpK~#8N?c8~9 z6Gs#P@O%S4LcU3>mXwxMsv1>PIoi7F5xbGv3UCrEB?Ks@VVm`yqcj;eGk}a?2hAVWkz=&A_QV7v6UkvR9759$s!8$}hkCl*gd^_?*!ufeB9c z@#FHIJ9kP$7gp1@5IhjJ#bfZ;;9gnG&Wyo)xVY60Oj$Zn1g9ZXaqLN}Df1)||$;tJ7lFbTwNMxn0X{1XTZmMn#Fc1jgE1Scs~4RbuF=9wRCY*=1AX z4&w;1Q&hv)xhj-V%^J&}Y}HMc+Q#SO2BQkW#tvhOv6a^RaS4rR@c@=XZ~Q%}Tr7$M zj2j4yAzyZ;#Tb_5OSG=ZZUqND{^c+2Q2ui))-Y}$FlHD#S$xfPWhXAa1cj^nr3c^% zRch9JsWj-MUoAhW=@!cPn!giD{>N8f;OiHmX>fio;D#{6*TgXM8=q*`tfK@WOZ&^_ zSA@YBia-jLm?K2?{By=;f*3Fhd*S5bJ`;vtP9wW;5cP;!_5j^$>Gl|Q`4U15ecJ-P z6VD*TAUnMUVM?nf;K9FZN^?fsAiVUL`&+AU@oKIL!WpCjv$!+>>nrErpWnZ;g^4?a z4h%y4c6}1A%;#WcI&J9{@*c7SvUY70X!~Px4(@GTH+oD0;hfK6hqAl3S1K_)3yZV8 z=H?3s!OTwOA)QVqc`RoAm}u_l?(T+(bAuKLLU9B+IlIsJl*Mm2WU)Pj_J>bpp`)V% zQmIq|BS1lj&dyF~Yiom}N8Z;0$&I}LP36;X!~FOgz{AKu5G8@x9lBTu#Lxjjh%=wP z1~dKb&p>FqF!4GZn`<$8iz-OmVMGwBAbsP{L*esR4G7vSAPDpGnJz$>(&a(NA&VgR z+qev6P7pGX*{O^HF_nAMf>G5&*xpheeHY5JeNZlqSYT)lu>*;Ek5PfJ1GzMP7`_?l zhM8PP6@+aMv7q2^hA`8IpnN57z^H=M5(blgL02$!Ab5};CJ(|w{sTt{br5EbDNlV0 z!^b~1CUe~_h@p(nz6Mc`aRWgh1BX*Ef9gHk-oVZs?m%{MzRGpMhbes&zdn`8(%^o; zc!B6V&<4jd2ecq|K}Nb#t0P@cs)j1IXV~o58b$`eCqLc5)C*!N+x}#xuRUe{#;M%E zFuD+KU>XL3|J7L|!FYvGfoWKXMuO?>J!GzHlGR|`JdZ@f&J$;`igT@cn|u=*xiJb;gh zmM>vFV)LhQGufvD(ohiffMG!phAouI{uc+TTT}U&Eex?W2^ElrhNvYB4??}=a%sR) z^LJXsK{e}QF(XWYJAs4>q82cAAeez>7h{N)FX3_;cJTlfgV>%y`y!A~Lj(yU1z`$m zw62WSHL>+++*bjK6hsg(Iv`Z(QN>wsYP_58p) zu5wMDzenhP@9?|5m+vu{U8b}@!gvKi2;J-}CH+DV;aiVk3T19VR0>0)R5(5sIS4;t zmMWi^sOHbFk`WDAShJoiyrona;z1%0;TH_m{COA_gcc8oYSwl=A+kf0?i}QHjzJi9 z`4WQAa+(A}S3%I;Eex$IqjgQP9uWJXN!Q9POah@BY0dV!FsdN2o2)hCE^V#~BLhhw zq@mVpAcKkR_Xxc(`rq0PCYh}LkG0krd6?vTgjV>1YfLavnIrxOoPX}aDQoR900000 LNkvXXu0mjfLGd05 literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/crossroadESW.png b/tiled/assets/isogrid/crossroadESW.png new file mode 100644 index 0000000000000000000000000000000000000000..bc52900209614ac7eff6a0087dd0536bed0f50aa GIT binary patch literal 1556 zcmV+v2J88WP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1*u6yK~#8N?c95F z6IB!d@O}e7g5N|(sVHT}vE$(Mp~msi#LlP#BrTa~DIkMMGf<==orWf9JcpQ6}pg_bPCa4gx zg9!^n#FVd4rAI2Z-7d$-@wJAVaX4bk?9Q4nGf2s1jG zhNa78J@xN-NMCqP9|njHv#!*M!0o!#GMylk74o1M|=3DqOmjZGdnFslzNTjlufLIr!_>Z*5`X4k5FYA;d2? zX5nfz3#GZFDJt9}WCvvJ`V`Rk?dCi@*u0@fjDiqf%I@D?sh`8Muvp0$!xs>OsT6aN zOeRgeO|l^#hxtQ8Lojo0+yp@=jvyy1d-ba6R`YM!0`<{Z( zxH$6~9GmafqeT=X?l4vmq97yZpNITs`*jE!CJ==A@ys9~Ozq0JK)K3BcRm^CK%d7>_DO(F(MFlAeZM3!`Fo&C}sN_AZ#PV zgo4W%!pt24?P^Yk5d~={3|8oHwDRgr27(9qe)b?NuQ7_ImTOdkJ8-^^u4 zE0!|0REqaUST^+=#tQ_2j2%uu_0+qz(ZKE<-avM6zRV872MKu;zpl!72tNDj2TU^% z0|$EHcX!C5+F`XaR0eNCd(IhlF5$E4E-jT8rM!lIAO>=6x1ljx^mX)T(=fUZe6eTNq+%5+WdhhG-`Y4?@v$r8Z`&`8$D7 z&AMDpS*F09Ktcu44j4NS%s{iv7*_2|*iOSX4`4BfjSQzHE7TCJgmDF73To6>Mtx0e zeHxENKq3Xv3K$s>s&w)Y^xO#~(hz>aES>$($S$*GWMj#)C^^f3VD|OG*xR0RO-1wjbe>?YS4>p% z=euOAmMpAU&*tA0Dh%-;k%#aLhHCyi3=2Zd16DO_yGV%a(j>bFdEH|WhHYO$5NfAU z5V8su^S#1QUm5i^xkW(imnK;&uP_Qi_DoC8mxU1piQQ%`dEQ;8i^8~pC*5$v-ba7OZ|&HjJl7II(@C1OfXT|BmM`t4vQOKC;jvQ0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1lmbNK~#8N?c04% z(?A#i@O=Y50^dZV;tQCVECw@&N}^^g`@@7VUX}p!ExNh*iUcxbL#IZ>D8ewxc#8=! z1_KF1g+Gvwz(+WF3O8=uwY_V*t?eC2L$_YL?fLELwfEe7K9~Qc@=f)LnZ_(Eu$?><9U#cp`s#SB-%m!#1UjgsGhF_I9Ceb#*fS zVzx~aLJb6MVISDHa_>yABSSDZ*B9b{*XMS(HWm>q%PTKYX0EN|R7GOIHfV#}!@h6~ z31i{Q^Y8b3{pR|776+B~e{F3Ny<6%m!oWH_r?(Fr6OL`+t%->MFqMFy!KgcHbsMXXUEjx4 z1Hx*M&Ft?w7_UOO?o=iUgyUgEg>W2rZihfh_ZO?#n4hchE^ET8ch`)Mi=6ss0Oh! zRVc$XYbbw`RX3xdZP+dv3@Zc~JBTU7*0AOeQ)p!htLF(FqMV*vo?#yr($Igh9DBgUKoJ*{w<9@=3*!_+E$VkOc{bfB#bqf zjbAfpZu$xOFxFXIYypuld@!L<2n|2$D}lf$x*&JQPAOMeyo^n?>hy-H=BG~Ll zx5CX_5QiYCme$!+%Z~aq#q!vTS7o(=7>NdUGF^ez;%}S^g2OllLj9{V(O?`4AsS3H z+Fl&uFuHtIZ@1D%l%1M5eut?v^;*W@(O0-6brpoyG6w1qi(dwdgMB<8HO&a4402n> zkcA<#Ccy&YXb87u46a#cvtjBGxE_eBAe;^Z(`m@b15gYiGXt;FKwJ&sG#EUuiL6h< zItz%WAe;iDhQN>YKs*gmYZx977=0b;y<%#t$?|=K(N$BWw^!?`j0FTBct>CHpr7j@ zs+}=0Fbp+c z10xt=?<4raXn$)h7};6dA8W27s$t}P1XuVf*BHZirH}XzCoY^L<;xH000000NkvXX Hu0mjf6VX!{ literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/crossroadNEW.png b/tiled/assets/isogrid/crossroadNEW.png new file mode 100644 index 0000000000000000000000000000000000000000..6b2b49496918a1937a597c41bcdb9fcedb4c2aaf GIT binary patch literal 1397 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 Ef`2gba{vGU literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/dirtDouble.png b/tiled/assets/isogrid/dirtDouble.png new file mode 100644 index 0000000000000000000000000000000000000000..66d09eb9f5621cfedcd15a517dc0e992aea35a46 GIT binary patch literal 642 zcmV-|0)737P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0vAa{K~#8N?c7mH z12GT=;NHY*6^ish@Bmfo34AI(`6ATT3wQzxB1q5CqpVig)~=*UHZ!xCnSWu(LiQoM zA4xXZO-3W-$M)ssV!OI~{f(b<<+r1^_(zC&vt9iSz=*1bAplb;1YlTU(rZK)0x+a7 zbP#|kg5iSzOcsnB1Ypj>39j1QkRf3?R55GGPEA1rdP(#840c zn2)FH=4(0Y{M%GZA^nu&^Lf_1JzO=T&EsXW55NqA-$JbK$IU(tAb^nt=|TiS0K*Ft zf{20uh889UkqiQuGMH3|Y!JZY!Q?{p1_8`@n7$CjAb>fADTN>d@eV@;K@Q>#h8ltm z#5xQY1UrZ|7;XqL5bZEh5aJ-(V5A|AAdAWLeKFa!4@@epb#{3uh~@2gx1Nuuhcz1; z=P=bkbeA`IgQ*t68;lwV>o95|tihOp&<}gg^j643P@c1px#zL=2_{0faC_ c2*wJ;H?IslaX(rIUjP6A07*qoM6N<$f|Dxr0ssI2 literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/endE.png b/tiled/assets/isogrid/endE.png new file mode 100644 index 0000000000000000000000000000000000000000..6854edb326f4933a700c253545b30a2f8c7c7af7 GIT binary patch literal 992 zcmV<610Vc}P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D19eG6K~#8N?b}al z6G0RJ@O%S5g5N~YYPC6d@e(M~V?)l-D5w?fp>0r+C?1qVtp|&Ot)?JNTfG#)Vha(m z9%?^AKEl|yX10^f{+azVJM(5=VaVp+lHFh5zIijVr4sVLX19ELVSTCt4YrXV4&I;7 zA)4!DCN>ABcm5RKBSZGfgCIswx)%pa-SQm4D8!Y4@J7pvjoHE8-s;@pVUHpvE1M(` z?af)Xv-^tu`T50Zzx$hmgZ?(bq(R97f`f>U2mP(i-(Opl{AF=eL5L{3J6(47&W%p3 zRwI}on7klbj~Cf7gxjjsD#3^-x*$Xp*e*PbDG-H+F%_b4Fjye0hrtSA9gHmy=wXsT zy#0EOegCoIR@Qz6owttgc3-_GPW5x+du2%>_V-s&K^Pw~MTIa9h9FL=eXW&0LHI-D z9x((V2LUjRMxA|l*Ku-V=A+95kqlz2r`X?qlxm`kAToj&PLd^_C?kmMA;f5bnM{~k zj-2x+2=x#!wd}VTV`TXfLF5nNU5o+G-F0R6RxYr`k5eOZeqZ3PJ^5T=y>Bh)>Keio zdK}R6P(7TXYX4%dDQZ}UzYmutZ$yNh*M+r9?AGgZtaN*Mfntnv9$aP1Pp>eWVUj>Vtpzn#SnV)Ubr0(Z{+}M_5g;Dkzs%Z=%6|~v zY=glB0T^Q-w!mP72nE3kgBd~!1QQIOp_3hJ(v>6li4S@l$suAs@!K{%$H-uq3K1(p zyf_$POouoDX->~wpoQ?>Vul^Y8VKw#)>O<6>{>$QVMlSEhW1PVsS}-@P|tI0!|AW?Bwo3&cN>DD4FZCWM3l O0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1BgjPK~#8N?b}al z6G0RJ@O*=QgnSdhTK^;mFJ1ygdThu!H417(JtPJdiK3t+)q+?&STzOdw$)1!EVd94 z+e7U~=tmfRDU)oryE`+P-RZp9R~UB7?v`YJyqVeernwyQpH{D!Z>$!&(BK^T*TMVo z8{W*+0AaPr{Ec7?n*zjxUa{WjT|5e65R5^Lg9C4BXJ@7UYHdCif+8km6oA<4Z`S|x z*N^spePz(LwqLW(`ux~X6&EdVjfOH!sK38A@_YS_E=LGE5{zai%RFAGRPuLjU+->j z^#;)((+EbUXBF=Oh;q5y{eNVn;`(?M*A$wc@M9$rDs=|DHvFr!x~*>O|P4h!2t2--euOQm5xDpa}5R) z1Yn#1aRmk=L@Wqa7|ak-Aedm%&NV@bBkaxE|CSwf4wE&XBY4M09mnPn|9ld5Zu=Y~ zvrte?`k8`IijW`6Mj)-(xwY2pp(r}AMhq5+m(|i?=UQoQxH;5w37WO7TvdsK2w)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1LH|VK~#8N?b};x z6G0RJ;QSN+iQ*MoK?qWbsajA;OW#V9)?W8gkj8?LV+-Xys3@Ai>Ygl5G0T&hB8$$#tVc1nHU{_=DjPn z*`S|0Jb|PM#t%fkFAKMZ`bZG}L8|=&>(%~!<1i(2ALdh8SQ!%)#C$QgUmwd2w9g)H zq#Q;W2;+hEw81C~kv5oOaim@15Rg1|!Zj>G!AcS_ULh5URi!A;i5CNTMO4hM|C9^>udQvZq>;?{x%q-4S&A zu+}j$AP7ONzKWt>>>!jUlU2IKGxRh_GO+Kyc5xR=Fs(F=PZuJVdu)^dRE! zfYqM0T_z-UXrj(RLCrA;B97BA1XaPJy)`vE^o~XtUPq9+uX~LJOj72Ezp#DT UhhIi*9{>OV07*qoM6N<$f)+Z?kpKVy literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/endW.png b/tiled/assets/isogrid/endW.png new file mode 100644 index 0000000000000000000000000000000000000000..bffd469cd6cef956d680ba2526339c10e1de32f7 GIT binary patch literal 1173 zcmV;G1Zw+Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1S&~HK~#8N?b~fj z6j2la;Qc54lb|d~KSa=%l_j<>u_Qzwt0E|rNvtkuWp7}<3ngj0rBXSDMOdMPL`3w- zpK{tWdZ)XyGduU*x$}O6i?cerxby5e=gvLXTrS~X)y?ixm94IM9C)1Yx0BpIpFvc& zx`7`A6SAor1i{1C~8UUT3v!PufA3J3;5FdRl4APA-b5=V$k!l*#Z?UZ2u$EtAg#d^Tk2>XSWeVob~ zqYANiuoxLcDkCNh5UGGkBSa!$vH+0?m@GoX5{4j-@Aml-$*hbZS|K8Z8C^XO<8Ql! z+MjqI5vS>^?0typ`GbRHsJ)sOp0?wnrtxhW9=*>CT~}-^SKeHJ;ia>X8(HoE90)V9 z;S56%$1P%!p$bucdKz$8ASTR82aK(CS}+75hTtb67=$y(NwgqLeR~xC{M-@xROnvf zP)#jKi#uTveb$1bdAAT?+h9LAq zNP{q#g_#PJN~M-LyWeyX=JVr_np{)X*g~f{%d!tlS$u@BeVI~RzuuCqKp_72wV!n8(`6$ z^K6O3Yx?T+d#n*GH8BAD_okG^r>`cM**-8{S4 zmmNW*vNS=cft(;c87jcFqCASOSy>t({)1Et#qDb0$T3|xMG5z_uwl{+F;mVT%?;#> z*4{%S#xR+Juy0t86HKNd;sn#*-zVLni`(?oZCcxsngss0rsVT+mHKd(6UV=@a71q=^@FnptoAY5`>kg3cL!lGrpKHSvvZ@1hL^b$v4HA1$g zgb^`rAh-g}Z^m%izLZ&rAYnW~xP}_rS4I#4rZO22*69pt^)jZ zT{5a2y40qouxbqJ`LoR!PDPy}LRN!2Uo~P7hTp!#_BDC+tSKS{u~cE$zA}OkywI|z zslvE@@+l%@1vK4Yih}s=M`(I~iG3N-i17j;2+bb>FBnQqnlHHM%eleWK`0_buc)T; n>@W<3AT(WI)t6x~X@U3$GOpy^BCdcW00000NkvXXu0mjfRb~t- literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/exitE.png b/tiled/assets/isogrid/exitE.png new file mode 100644 index 0000000000000000000000000000000000000000..5b3053dc9b5f612af95429d8985a88ffd0241609 GIT binary patch literal 1160 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 Dk5h1@ literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/exitW.png b/tiled/assets/isogrid/exitW.png new file mode 100644 index 0000000000000000000000000000000000000000..3107c3a1da8526daa669eddd99b9c7c373eb0d05 GIT binary patch literal 1364 zcmV-a1*`grP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1nEgcK~#8N?c4cI z6G0pY@V^`g}zcgSq`8 z3bV6WW|U8F#-QgyLaxRb5SyEup|P}D{%dsZd6XZt`wJOs>*byx|4e=i& z*%X{eHvOSjTda?rhB1Q>0aGrB{z(0wR9k&8|EUed#W1`OrNFobLi+(HH^EqiV1aQh zgqvWZ(Srq(wb`i`-sf@hk3?G4gwAYlN$+{w;vny=N$+R9E@@4ipT!K6qhfGrP46xj zyWyDgW8Tl2`OkkI&n@52!_mXLxiQKLQO=4%5VD#1{^fPuJO-0YM9`iAz@O=*oZn_A zVCG3Lj0{E9!2{wdh;qQtAP7STWq7kOS~fc+L*i$Ic=fyw9%N#93|0_VLpTYe1tHaP zKig4|`4>Y;IUkt?85F%kl&+pCeF4Hk` zzGdk|&O9J@`&!{j#|||R;vJUXNASMy5dC^9?_+RxnQZ$bj8zbX$eiBAjeuyLhY(gV zR8Uqb$i2Zsa3k3asaOLyhVLLm!i?rtOeFKyo|4gPS#7;5pf9maLa?;GQd=3x{IxJN z2tp*zY=HjQR#_1&81!qbz|hB+5G2;K63(66C?R+e^j=>o3^`YZ5WFiUUryE{Fho=g zFNW_Y>vF@ef=CF9Qmn1a3`9a$gy3B+8-Yj&!4Rx4S`Z0gGlUro0g(_6Lm0vM1>!F` W|A4kgL}v8>0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0(D75K~#8N?cC2w z!!R5N@V<#}BB&^C2QOX*L-rCw5%i)SCPgnI9)v0Gk z9fTH|u`Qqdl3$y&Sr+&!|7vdy#;up46#IeyoN&LsgviHju~-1(*i;1p7*8PpV;P1T z5oHL#7=|$g0hpRFwjcn*gmDD{7!6EQ5P&Jc_yUnUjIR*M!Gr=4Jxr(&(ZR$55j;$+ z5W&Hu0^vPOsu1460AhI_MglpXj{(Gb2RVsa`Srdn`LnevNFZx_y6=& zHZW&<{;(sm$=!(O;o^}2}WC08xrE1qyL{1SA5~9FZ0Raph z#5BZ45WuKmY(bDf05gZN4Z#9Q8O9YvC6JV0Ttm!3@^0@t?@kx9E$V)ZSy@vM&;8DH zc-raB?%J3n4&x0(`39%dV7!G$4JH_f*kOW&hz%whh|po8g$NBM83^BDl7;XM1`vuT zG&FS{!D$V(Wy?aG-o^HCzstGkBbfFuRcR98j;NgBd6%q9>(Z0I0ub!F>7 z0KpikOv5aK0D=Kwt1DBj;?QMF@_2ArQ;jw!y|r${l$X;0g4FE#N>yQ~0Eh^^!P**J z7%B+5rivi)ZB!T?2q0=ga0h=C2p|kYP+`g-fUpdqgTY|!7(n%La*T;3B7OklfSIH~ S4f&t|0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0z*keK~#8N?c7UF z!!QsA;NFCTAXv0QqP;{9QFet5tD$lBQYKM4 zU&pbP$7G`Xv;A6JY!36czV+Xg{~W!CZy>gZMfbY_M%dH^0hmG|0FxOev?6Q>z%avb zK>#KZCKm)?h%izRfbqbL1pycfrWAK)4n_+^^)Ol?s)MNoLOo2a5b9uBfhZoP zRfytX0C9R9#sG<5j{(Hr5aJaBh%kukFo1}IV21$&4@5EyAo4(vVE`cm;e`RjI1o;l z$M>7=>2rQ^Z$O8p+ZE10Oo&~Scqg0z*x_v{LCXvVq=$Q!(NkU z>ax{&Oln2gaBLv0RSY)-TbJdkq*^N`7escD+A1bDgcyi+7%2#G5N$Bh5Ch11KU=PM z(<60Ml^S2_Ic6+~)$`?X^>Vcwp4w;~rWgqO0jJhriiKzmMh!&mFlr%cgQ*5WJ503@ z+F+W2C>^F*h|*vH;dn#CSo4_J3qrBmoz1L?uM!atmxhT=EOk3|5My;^)WlNb)k8?b zP!k*)Umb)LOlX2bZyVVC U3Ih@*)Bpeg07*qoM6N<$g6-1^!~g&Q literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/hillE.png b/tiled/assets/isogrid/hillE.png new file mode 100644 index 0000000000000000000000000000000000000000..649bb3182503aca488b215431487824b9c18c957 GIT binary patch literal 778 zcmV+l1NHogP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0-s4lK~#8N?c7aD z!$1@V@Z7{BcmqKc5kWyqrBI}o5Jkj=sJJM8wTcTt1;LH(TxeUwqx2{vQKEIsBr}sY zGw)4aVHOQZY5u>wOeSARLiE#nTc7R^nw{RDd3G^qew+^*cbD&LQ$$yX*58)H?+@37 zsxb_(tx5O{gEV}Gv4DZv@{7V}7zIq|@M{f&IsE8hsD>W}OpM`^fvH>gs9}ztmc;pM zLpjj0J*uI;T(AM=-ou(M!x+N&0$~_U7~dca z^B3miWmOzMFN^)hMX`G~FOpCob%c?_-@Kj?atjU;D~wL~s6i;h*oIF61Un35_@qEE zz_<>dB#1AV5aH*79NsT{-Q+-}LEMaiC43oVr#~x_(aDB*xN3-4VX%fjiIGB_9;}Gl z?bbI))~Lf!2ww$}V*CT443oD%#yV}XA~J|V5Q;EZ!!N4{BM?e3m_dpv!U}`}3`P(W z2(4Y#WQUKv^Tz~Y1Mv&eZFh#<_E;5u(R55lWf(xJK-_G$#-oO5-qEDwYs3|{>Q4P$z#RK8M|egAhF z++dxem=y{p1>uSS+$5^PWcM|xwtTJ#ODtO$hOi7=cQI2KU69)M5xM}X`E+5*Kp3K` zgtUAa4EGVhf$RR93PuLuiqK6IXg(Q+#}PomR{fa_CYFl$1jADw#iJkt>;M1&07*qo IM6N<$g06ErtpET3 literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/hillES.png b/tiled/assets/isogrid/hillES.png new file mode 100644 index 0000000000000000000000000000000000000000..8ce631c367eb1af73d20ecb2415a21e1a819bca9 GIT binary patch literal 1047 zcmV+y1nB#TP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1FT6zK~#8N?c95A z(=Z$d@ZN+Ya04WS0HN^^RP8#tE)1?Pf%pT2#x#VgvC-E$kOtBKfp`dk5Np!FQFatF zw|Gm^I7u)fqsE;Lk{64k6wv)C}G4!i*SU=kx)x6HAw*7Kc`@7>;-}J&;XAJ#! z%=)vF#qaucMB5yUWLuu%I~Yxi?_hGk$a>|c72m;7V2Un&sbO?3zV$Gs7T*dO8;frY zOxcRBHO%Iht7s6k&|tib`oV3~3zn#puDl~06OSuwg8As+0$Trg1r2-;z4~)6whcoM z?T%MUjRg*aLGbqY-9^;--JC&5BH_n-;VQydgYj|83Y!00)uPoc3k-&UklU>vH71mK zQ24oFc*p8ir5q*+f*(KodIJr|t3ohIu)Xl^q*cYbK)+#Zt5OCt4Idw8i=f1QGu200`YLYr$HAe48sDVDpyoM#Ych5g^dDp!?1!t z=ZY#U=(!a)3=as&mEK`X>Ih6#@p*o(>MoEOh8KkFzx{L3Iush<=_pXV3(SPc3qo>* z=T&IqzInSqDvSsS$rag?NE_ft7dTm7I$pS?jRI$2L_uuM6;&?`Jhz&z1xCBT`t-Uo z86aiM71>z*(F$6BzksBIxLk>!zFEybvcK8*eX7&Z$FePd;2mHm-w3 z(epxJkcZv#s1j_o&_Tb7pkVOD6gIAdi9)=1dL8XQXiP!K1_@(JuE>JG7&9QyFec}U zY=~44NEp*{MHK`S2o#J7xuP0^3j_*A$6SGe$OQrcqf4$pL!5%No1Wip9z{o6toK!o z%J9YCMa@@=f_S~wINHD8@J`+(7-$BAb7kk(64;W9HW118ZR!To{$5pzqAi5ZFq@yR zNnZyu20~XDS-D~?gpM#Gxnd23jxapAVl9MjFj=`$8VH?W=H*IhA#{Nux#A!wA3Rgk zJcgVC<+;UY=*Wp7vUI_EJ2SJ+@d-(whd{$P2u5Bg7#5IHwTLVq)i7xw4kATI70f&k z2a(lGBHxz{69sV)91yC8%jCMI(u|q}YR+`1Xp3KwhV{B;={{R*wm#{C) Ruo3_O002ovPDHLkV1kUO$Rhv% literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/hillN.png b/tiled/assets/isogrid/hillN.png new file mode 100644 index 0000000000000000000000000000000000000000..72cdb999f44fe720f8cda48cb93c39a149f58554 GIT binary patch literal 796 zcmV+%1LOROP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0=aUb=TCeiNWO|HS@rsxgyC^HPW(YM1a1e&jg8&0z2r~%hAPiv#;S7W!+(1}^ zFoatOV-SXbfzSqF2v`VZ5QgvrQ3}Ekej#!}7$OWr281EPLc|~pfde82IeTr2^S4bg zeBTz=AD!GaPNs_msI`-~!DWDaKR1q_*F?J15h*l8oFR)q>V$*^LK~!NNZ25pfKWuj z3IPU!6$v|pSCEiMR3PTl-lz4CC(7RB%yVY zs6t$xZit7&)<1|Wm|@D0s6)&!G9c7ol1RRDMVldI39C7?r@et^*1|9maLAi~92lK^4XaNKgoBFpwaq zAgI7VfS`uJ4&xGp6a-cn7a*h|u))}XR0;wMj0s4kAwt9GfYb^i6pRW;ts#8FpuMtI z_;ZDzRiN&bEdt?;(4ck=lLTQ14G5@HnOxVDw|F4Em>~T+^LvEFF;$|eZN@MJ(AU5e zrYr+EBP_vmVN^l*)Z_`K41^&pA#?}-JP?L(4513cV+3&E%eqgGF%pC`qAYU2?@O4f aK>Pu5W1@q(vXTM-0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0{uxuK~#8N?cD!r z6G0FM@Oy(kLf=HF7Lf`?Oj80uD*6gVDIy~6KN7SxwY2_fgo5Z_>R-Wx_$qw_A7ORX zt;sc)%fgTmpNyci&HLZ@C;P3gNGJqkGFIqr1I>L8JF-bbDF&;mF;62l3{| zePiozu=%GHCbMZ7q70%inLw%_sz4Mb5zIV@c_0dd1OtVDf+$QNj4y;Qh{6D2LLovy z6s7_u79tizVgA8jL12L_EDSaTHps%jq=HBVQd^kR5UD{NO!s?p|MjrB1e~MrYnBTl z7l?)F_M1PugUu(RU~)s`1i3g{B*0KXP=K(8p@yIYVFkklf&&OC3^xc)AX#C!LU060 z3d0?OGYBe-6bK0*Q83aVB!PIrNQICHG80BRgk+GZFngbGnsRl%HcYv?{r2yBIg{nW z;IMQDN4FpOe!O8G^;Rcp=lxYvJU+W-FpCN}2BI9G{ag;v zex4TK_VE>iS?C~`xOQ7mU`T*AP|WaBY>Pbz6gWjV6x&n~(Q9%?0cM{=-wAgPZ zm-UOi57$v=SbyB(K6WAQ`YefpgR0RoW(;}cBowh#y}5D753Lx%L{0}%wm z83qzit~MbM|3NzKtwE=KK0e!mzUMS6%N6#leqtcrZnw@)AGEeE9ts``hoJ;Pg(yF! zEft0WBq@Y+n4BP4A*90O03n5t29pwm6@(O+6dg8?EMf*VW>NUb2a zz=VL*8iE?e2V|ijs9+!<3k{JQCfiLvet!uNw@0b&l}!WDGs43P8)h6tAv_>b4P_QY zAtE5KVcc^~?w2>{^3o4Oh{sfmO@$6+Pyp9XAw0h>zA#V_h46$39m?i`C`2TLFH9AP yLLfsxVagy1kr-kgj9#oW15|bAF8*~nBYpwcyMgY3{)F-X0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D14cpR12u2O_i^Fj&o_Q&n%EK7HbVOC~3FNz>ryEjBDdA}-- z_S=GC<}<@aUSuE=;=`L2arm+`1Iadqv6~lp2#K)(5<85oyih?@g2V`8BQL5TKp?Te zn9d6bgceB1Fea}rbRcShgal(UFX}*Cg7mw+ald<>pKU>Z_jOigDlae)Up71Ehc7z4 ziyP&VNMKCl1t~=F*2R!vsPn=oM947Id0`bIG#JXfXcQs@7^=K*3c^wg>OtfLGQFG8xDi{gEX9TF^ut8Xu?7pV#lQ-z&!UsdJmmANhx-d|HY#c*q zzNd6ypdbvP2~l^tybOdPkPx~sWgrYe3;~5Hf-r<(h-EMw)|LUvo-PajP|k>dhvG67 TOuI literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/hillS.png b/tiled/assets/isogrid/hillS.png new file mode 100644 index 0000000000000000000000000000000000000000..99e8e4a243915c0958ee8ed3a786a650ed090392 GIT binary patch literal 1034 zcmV+l1oiugP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1D{DmK~#8N?c7gm z6G0rt@w@|Hf-k{$pol1lsE1x6rMB6CS1(2J&eR_c^LSvguVF! zVsAENVmX0HA6y7~&jQ=}GKf6N_$c|y*9mO5!rNRK#1cxH{F}}OSHj!N0Jc~MB9FrF zqbr2KCJ^X~hY;wBAqv$QQGD7GpO4WMH6hy&=!%*{&ou&~ zv%w|BlRA#oe1s@=WilJC$8of4_96s`VppO>2@N9Ju7nH`Raatx2)-+^LIl^9E3=ndNC6qLoTX`Q05PA^S zyE6K*a&}!))odHSUXMoFm92wo?8Ud+Y;rUJOzxsP-Cx3KM${D!!k3+|H`%+NYd|qU zq3DVL;kVnLud_FY_kd!6!Y`&U8n5I*#C>$7dFaJcUE{8lfuJkqARK0#4ZmxTSE@kJ z6(W@5i@&wTD|H~~3K7b2SN3Kbca`39k%6EqG$^NSNuEkkR6)=c8W?F;bU@G*B9ywW z=z^dtL?~5VX##?-(4drd#RLRhp@CWIiYW-XLWCl^LIHxVn4|3ey3cmL++sZ{5Ok#( zih$T0UuJwE2SHcVV2Th{LC}?Ilqv}8An3|6iVVUD2)Z(4st`^=y4V$6h%=DqpKhGY zsk>OZFmK-!f`dGHdzJOlmuu``cZIoviFMxI6ynvhJ8b`P{}ecL>f@lQd0>+oFxQ1AOj8@lwk5=dT zS6iz0ZM`aMvny>uyx;84_aF5a|KcO{490a=yn!fQC*&K9?XGwW;WLblt^@<&D-2av zf`#xA#-uCJK==rw)0Jo;e1nm7r85vd!IX8Svk<<(h^_#l;tw6#8pnt!P@P*oLnkJN z#9J4tx93LI(m(uYc?H)nfKUW?1)~DesWU?6V;iOp1Q0bkwqVLY03ka~a^I(h$%6nw z1H#tJWpQ0oXI?cK9CM|Inw~L$P&&-|D>a2t9Y2Wmf*VKZA4=Ls=)$Oi0K(8o6-EXE z2tx?n_*a1df*3*-rU(KE%Mdac#M&`H)sGX6iRFy=50BRM!baTKbpQYW07*qoM6N<$ Ef_$vbvH$=8 literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/hillSW.png b/tiled/assets/isogrid/hillSW.png new file mode 100644 index 0000000000000000000000000000000000000000..32acf02f8c9c045d89fc2521adc55c7524eeb752 GIT binary patch literal 1126 zcmV-s1eyDZP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1N%utK~#8N?cCjJ z+b|Rd@Vr4EVUN%^*cgLdtgu4!L7;5eQrPWo%Em56VP7|8Ta&DWX3!1Ft~TgpYkSEa zp^uP9=p%T@MXl?^kz`3n=g2CU2CT&P`BnK#a+*fNgP&2{dO4Z(_dK{1+Lv&YwAT*e z=8sX_Nhh z_9e&2gJdX4|8g>Wwn_8qh@Cadi#$ZJhcJ+vE#!(d-h5ujgM?hM0#eKi6_AiChDny? zg(^tM6+&5wnEs&5a0+dnI z?#UM4L=Oq`l@%a-J<1(O$d!zzYF?P{Ay>2eTCaoY0zbJc?Cwub~ElPgep0UheAv61EqWM1F`L6$2n@&X$Onp|;} z7Z^dD=Zed`zzX7Q9n5uJ;0FQ96_yvHsCBA4M78mJ=wYwS@vPoo$?_ui;bt2})p<>s z0=Z~o<#Wb^q`3*P9_1s5@mv|kojsjGK|R;SU%%=xwf=tvb6!vg^)jqVxq>|}D1#`^ zS19BKbr9)Xp^_K=fRxNvsO5!EAPehY6!XG2kXyO(>CZ-baMsNJla=zOIt0bm{xEu) zzWcS2Hr}2*NZI!B_ao9U*a|FrJ{)3qd^cs=H3)SW*#cl`SA-}9p$dbg(4zAwgAjsH zgAoTW(vd=#P{9q{PW2y0+~vcvI=@uf%n2PVhoN1N+W^8f$<07*qoM6N<$f^uU1RR910 literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/hillW.png b/tiled/assets/isogrid/hillW.png new file mode 100644 index 0000000000000000000000000000000000000000..8ec1d2a4a4c99bd85bb56a02ee3f2acc9d6b6b91 GIT binary patch literal 1030 zcmV+h1o``kP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1Di=iK~#8N?b~l^ z6G0fq@!Y^8cm!`?Q9(gLrJIC6ksQG{Rq2b;7ur`r+a!t(~ze;8z%AY?=%Kr8p0UI-JQv-_ooO0Fg3!+UZ_B1m%+a>W~97c0ET&x zRX11F3&5z3B*St#y#NfufR}B;v=@M3hT-Z3U>IN|M%nd+$sn7ogIU=>%*l`bHP!12 zlR-9FCs>&2yf-u%u)5X>3MTt}R9%B?@_W37aitf4akLk~!nodxpkUh63$J0?+zanu zT)e(88Dx`noST)&UbuF#XELzVb)0~i%zG!)9r11bMqp$w#`E4U-v*O&e`~;a#o~2Yc)jnVmj}B)ty0L`3+#Y7bK8X zFG_B1#-LZ9HQ8PmgNzr^13Vv9J>X>rWnM3gKqhhj2uD8+qo@~JAm{}RK_0|ay-)^0 zFX$L5y-)%{FX$Mmy{H61FX$LLy(k1hFX#{^y~qVYFX$Miy~qVQ{&H8G&Z70(iZR92 z1ETaI7v%8bmXHs?=t0N>m)eU`5WuK|aP>k71Tf_=oW0Nj0n9cGcQ1@U0CNdrqZcHQ zP+@HLA{XSv$J?t}mhK~jS()u#WI+z5H$-Rg@{zcB6A8fl-;6qXk$^~uSI_T@^Jjxg zkmLcFdV7(EkQiGap~KYGi#&)@kPu<&=tUWX5=ba8wtJxhp#|bIjLqu{9S9>3pI~hE z!USRiGTIx)qrGK%wx#-YTW4jqdO?ABw?9~(KOGF$cP=ghfw9pGR*3Aqq&~xN_rfZK z&oJD*s1?FD7|vca3gH6`S1+7`Xe$gyFPw&G3k*juS_R=U47C@nhHwpr(hIL3T!G1Z zIkf6~UPCkuQ#JVMp9cle6pRW;&=7UQlz{-EPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1A0kBK~#8N?b};x z6G0RJ;QWLBg!~glDQF`Id8p)qEO<#m-lP}1P#ZACmfxGO*Xrm-I<-eWOq*But|0{BCM02k;rV<%dVOi3 zwzFODRs&5S3{7Sk#}J5IE?4`%1tpdrlmKBE6UjT=2ttiQ?jsCumMM;>fj}6FMDh-? z1A#ESSvNS|2?&I70LBdngs}nR1q8xS!1w`yFdoej+C;NH7IL{f4i#YqB?L?mAcSaT zL4*h;Oc)?S0TV`uK*ERs5eOI&A;uC0AqLlB6d+%g%Lt)|@U>zjNrG%P+rLU@b&@6W zem5(o`0+F>K0gVOWHJdP5XQPv+-PN`&8aTL?2}{N=z|~(J%|%91fuY266RKV5FQVF<*x&#Ul$Lx$>FcBm?-DntQ67(ST2?+s{g-iLSVbNz4x z1Yy`22Dk1VHA)zt5@Jf z@scS76Nt#I%npPCvp6Hc#;pq@t3f??*a8s=h6f@w9fupaX(osPNI5Mv%jrXHo1%Ff z##NbL5S7`)VRb$s^?!rd5*%i1Ahf><6%A%=Aw+`-3`E#r0t*o~n9x839VWC8L4y$n zV%%Ybg%~#&gc$LEL%+^rtiE|Q+RyV9hwjXp;{TVv4)Gd>1w<$azgig$h|myT!tCa~qNAONiPQ$1{up&5goPr@B2*Cm2^c-XN3SHoquMXy%>ZR;fjM4RJv*!?k zieoT{6^0fBAs8X-wlXUagy4i=g&75c5Dr7o!e~Jd!et067zG3&Jcbwr6BdYn?*prI TXc#}Y00000NkvXXu0mjf>IRt0 literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/lotES.png b/tiled/assets/isogrid/lotES.png new file mode 100644 index 0000000000000000000000000000000000000000..417a700a216b504659db687c7065c78139b8c4ae GIT binary patch literal 1129 zcmV-v1eW`WP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1O7=wK~#8N?c8rq z(?A#i@O=Y50^h_$K@?sX6W@$1X1+1Qy)iKxNCJ!~F@r@=@ec{gK!{32H)TYnLo^08 z5Fug+_yYL|e1ykc;YQc4>s|j}`;c7P!L{k`*XOz3T|*=y_)o6X(VSgs&yzy-1^+tY zUVc_;ZITg|IzU+v#${6iF;eQtWJ~7`)ffolBF6r{)U>%-%sgFAG=#v2aTtX_>}`L} z>~5D2|NdD8Qr0$RV5*#`NmY%ah5QXunMJ67J1fn5+bemBP;ZMc78{x6@MJRCJUDPO zzp+-5qk*L$3`@&$)*%pGU0wOg7HAp2KMV-N*^pMN*Mm@^kbQ))+R6;avp^sWLql4v zVg>?XthRcc>7{QUr76=rLzC_aoI zAwmfw0z@caM1%+=Ob{Rf0TVKVEhPC z1-TkOddlK0B0iP*8G?ZHj-Q5zboVkm?u|i^VMKr!y?p_udZI@lv;+-CBnX0`0SO9> zh!71yM1?T}!TaVs8ClmG&?yIZdi$i0ps9%hsJAsKOPRhzN@YQSV2Thmkl*^4AVHV{ z@k=Um1A@%H4$QS^=9=tEP5LP-7mF|FVh4KZs?qP=ju^Kfl(Vla0JIKEAE5^^nTj4v zbw}gXmqR5V!-NV#{kpE7U_uSyCzy2l2KNdb@8c_7q2ozOj-)1r7uaj6co8upcT(_u zbq02}J{c~Xh6cjRh#?^5#WA`3{5l7_zsnk!&_Z|tqXZ!+D@zYx{o6|!1|f8EoRg_c z4ML;kO|cJ#7TRE>GJRqAuQZO|;t;Nn;O$e~h!{PPg+d?n&$d8+Wxz&YhTm&pgzc=Y zLO2Oy2trVf%dPpdG7LgEn96uSC`{;56K_OW>0=7_u7UJ6TYb`^eMmKBDI&xSh^mXIP#-em=B{dcsg-W1ET~%2o4ClQW=4neRK(irrYF*q3<;rtywd#M_BkyfjHD` z#E=Cv0)r3^-3Df1^zM9&2%DgIVOT*lOQkklZ)i@#3S$I<5H{a3MlhI~Y;JJY)9Jye vK`Zi+0#&%pg{Zw@YHRj-u-o400000NkvXXu0mjfLgCp_ literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/lotN.png b/tiled/assets/isogrid/lotN.png new file mode 100644 index 0000000000000000000000000000000000000000..cfd21c63ac2d9a8c0bc66afc9cae2f381c433859 GIT binary patch literal 1025 zcmV+c1pfPpP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1C~idK~#8N?cCjJ z6G0RJ;Jks4;KQ_5nk$18ngoeACLth#l&WCu4@J@hEh>tTnjb2NP&L>DF`L*6sTUS1 zMoQ~N?IYw7j+t#I*-Wz8+3fG^oWNl>WJ5Ol<(!$xOcDwSe#_Uwm$UWR5(%;|_}dZp z^eIHX9tLfwILh=Tao?F>XRZe^fKt2K$<@Nk2;(3w4+NVnTa8rb@UXgkda7W?*kv;b zM6sEI{euep{j;aWal6?$X@5f)D=2nAP!R3*q}?k0J8EI$&x_*}gcjvszXmIh?w2x| z48rKaxCQaz*#>kWdXY}25k`yR6@(Ur>`M>h7YONL{0bo*j3^L+hY=Mba4O80^xfYSs{D}gAo1EzNaI9gcuFsdd46GAB5vD2r(Ii?Jx*o4}@hHgm4DJGz>zx z17Qe*5Z*xO!mPc&0vn%a2i7*Rt2gL3_`dEF&g9|TL?_Gu?EM#o4vJ76;QY><*Q3MBV<0iw|;BoYaP(JZ*5 zAIeD~2vBUU+sjg(+<@(u*MWsG0wE{})6Wd65Uc4qDBhbt2cfa``WmcMrqyiW1(6-b zE(n4#1VUiGJdFc^seV`*Te2twyOpJs*$tr!(#x35o1l~zL8;~kU}zhn2NLv*aSFm1 zgqAV_^X4unAG0b9FG$c}oQB{B(X=s2;SS_hZ>x>D*$}mqxdky9$OX=;2XVNSFpnZq zugqEXyoH(+TIrLeh^{2f+#G^pA{G96TRQgD3ZhY27>*GnQSn=g^&$K7>J<5 z2n!K3n7}}Y4ii`i(O{&3@H>pO5PpL}2%Z1P@M;`mw0L0D<79@8P7KknE_k;?BWvD2 zbMfjpw_(hHNCn|lDdPc=8p3UuaUcjWrcOFl%A{{2thP;d!)QS;BP{6H1w+?0Nz-ex zaLu`%Y83_{xGuB#gC>RH9Y4_Hgd0bgzm)bq!z>Ih2trtN;)O8+K?sWwX2&slAP8YI v1TPE=f)EZv7{Op;?J|Jg%h5I_C>ik|Gjg(S$wZxy00000NkvXXu0mjfvpKjI literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/lotNE.png b/tiled/assets/isogrid/lotNE.png new file mode 100644 index 0000000000000000000000000000000000000000..c21ae1343dc78e1e1263ae97bfd97fc26c152f6f GIT binary patch literal 1147 zcmV->1cdvEP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1Q1C?K~#8N?c3{4 z6G0RJ;J%4(qEV0tCdS5KXd6@Gr6nZBC>L!4DoC)U5fp+FDz#X=pokS{3@iqt!5^S$ z3{m4R9_83s*s|U0%-*_}Lvqq-SztRK=bV{s8wz>+E4$iuBwcQOPJ)a*{&c*1`T|6@ z+y>%67>7;OAP~l-5C~&43~fe8ArQu57^@%<#w3gph&Nw)frMU`VDo3dF$z(sl;Gd) zCLd&sFbtEfbf^^&0tmvGz_0@XVGMvc0f8_SFpYpf7zG$7Aa=G^frJ!5?S3Gezf%yC zk2BEK)x`%HBa9>~8UZ1IAdCpZ4G;)Z1#u%pAYqI^Kaa!vr0| z&Wy=a=bS+FJUz-s4TOi8Z-U{)mKqE~XqPiH8ABlMzG{Zv>3s-gkb`U?Fs1b&`1@;v zYIkk*B@VNt#p$1Cf%#KehlS;o3_=^E3bXj3A3m2SVEfx^RhXbdu#_?a@pWwmmWnCJ z&nD}#LO(+eKsHv!L5T00bMU*e#%Byd(3i5^ALZ&CK7z$UZ!IhV5nu|rG$fNr*_z$y zGU4{Wmq;XFdSajsLO{_387{Q&t1M}dk|oX%VLUq01CdAs;_*1bNH&t>pM*d}qfrQl z!*J*JWhRi+KsU6^gsv-!W@<^F$BS20U;1$_s>B7R>wYw5YML1!o9g> zK3ix(f)1kuK?~A1bqq2OPV*2#)PWF~Ph&A4Fs1hcnk7qsklqHRlxaceffRC`JVY*a zz79i{A>wS|#xDX_=mV~lt%DJIh#H9BGlm924dmTyH@wUyAfJlJAXGD?4uzC60yBFP zxTQ1?Lkr?J7#0XA$lIA4FrU7n2|*7c>M>mII*blpzCxulv6 z;@)8l?mGZm6?HvwufP`vz-az5F{ImuV-U>vQj0^43)7TVHyRI>*?6b z_jSZ;?>*!K4&xdK=^NIA2IE?Ypuux5<68)?!2|}v?J$9ba2pIl zsC*QKaP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1EonsK~#8N?c4oM z(@+!uaNfX2@J%o(elQc0#bD-8Ni-P?{}DG}34&iy=AzNyf&p34MI&MqWf)~3#)O!N zLNcP_AIKx{2uE&7M^{#Q?|OTCZ+n)Uv`w0&+b`$#oZH@}CdEIwQsm&!Y^z3s>?{6r z)V+KIA~zcWbLcqbmILbkGR3ak4x$F7bYkmnDKdyK9^%qKShMBHT<6xx%JksIMj11P zmrWxOh51fcT7C+D*B15oQ<>jduY5)rHz+(H3=s2ny|SSF`?Y{Ke_9-`Aj~MsOC`8A z(5H2Ebs>x$j3|iVhgsN$s75lGL>M!QUl3*#vLAXFSs+3WBP&GcU{rw!JdCOkfrAMO zgz_+rK)n2thVMTotDSYdhR)hYSj$)IALsS4^i^4-5UZ=xN?zHyDzdT z6LpXA3t}u4+bs0NI;v}D${~l52Ew|;ENn2+LWB(_mFm`?&>3?`EL$?gVRY8U*iXCN zGc?hzhBeL$TE?vXn1%V72QbignHj@Zh@fT6@6|b2{E&y&6KOqIK%|0D9fm-B{WJ=1 zikT_~Er`?*s=;JuT4C@-3us!h27)F-l!A~QX6W5X9U}d>8B!z7P#Eu|22mP9HW&iY z|Llm4U=A9PKtad?V}&q|_X7zugx@eMAg@NdVWj_}{y>N|T=x;IeFyLJMfEW>AOxa# z`w}w(K~o+=bjIulGBth$p63!!$ed%w2pohcn0g>R`9m<8J&zDH!yfOU%nU*xvUg6w zSmrEd1PzAy99}R4Br|*%?%zC(5UdFG&UXt#AXqD=K;Eo*VDQKoR*b;kto??e1wjax zQnW*v69_`MgkUX~?LZKMGXyP+6$BwXhH!#0KoCMOgdI#!ApQd~ifD?#qAv{q0000< KMNUMnLSTY4P_|G2 literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/lotS.png b/tiled/assets/isogrid/lotS.png new file mode 100644 index 0000000000000000000000000000000000000000..6c01a66ae9b7850462f00631115c8394eb779939 GIT binary patch literal 1056 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 literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/riverBankedES.png b/tiled/assets/isogrid/riverBankedES.png new file mode 100644 index 0000000000000000000000000000000000000000..57a98e46c7043bea052ebfd73fd559f09bbf982c GIT binary patch literal 1719 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 Y|D%_(f0!QDumAu607*qoM6N<$f?MoLjQ{`u literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/riverBankedNE.png b/tiled/assets/isogrid/riverBankedNE.png new file mode 100644 index 0000000000000000000000000000000000000000..d1e42c00ca1f729e35405031c4863147f8e3a1ca GIT binary patch literal 1689 zcmV;K24?w*P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1};fNK~#8N?VH_F z+eQ?}c>^9HkB~QLreA5`qBEV|Fq7#pz3N@BXwtNyqzP?J2rw;WQVPL<(}2T=jWNbx zZ1WM9nr|#QKvK$-i(HmRIQ1VQkY&r#u4G|Z%FIr%wY%E=|Mr|c(jM2;*!*96xc-V~ zrp}9kzimDp`wqWj`uf#V2s8C0FZd4E>^n1?jl3;#<62v|E~x~e{ERxNYqROuXSlC2 ziEFz%;bbJ$PQOMQ@~om5oUX_xG_l-FXoI%)nQ4WO^gxJT-QSHT4}>Ji3&8jiUlxD? zh|$HbXl>Jx<%uIO)WfQb7UI;iG@0I ztGI*arykK#^fy{x8KIXPaD>gsY5Qp4Ax#c{O%p@6bHxS1w6K&w=7Q}smlHHP*+$9P z9!kZ%wEn_RJL%wQ+5QV9a9&oE!?YObq1g!!1)qLPfv4Zlr0@oRMahl78sED%Uo4V0GFM#0$u znh8A8jIt)j+Q=X7Bj0kYD1>77a4Z-W5XFSUci!!nG`zN!SBBDQLV1#Tts8=)!So*f zSKBWhx2TC+Y2R10#mL{jvc55uK=g|Lo>ZFXdd9;F#)wv$vC-jSto9(2=u*CI-ODVT z>}L`!xUSZT-9ac}X@MzqWWc(J3p9n$5FEmndi8wiWb(N(ft&6_%JZfriC$0SdrKc}-eb90Lnq zP-=aMX%MikU15bHVurAytP-sp_X&u5lonQ*=MT-GotD1mVD9@rq_$9k zj2zC0XzV$m9D*zRge3q1ES=45pCw~JBRwD_T|HAb=U?7r9Gt+Xc1OQ9G*pUsX*B#|0f4|+Vm6o9PxnK`bf-nn=G)S0u=tXNm zs;8AAYuyW$jWHr{;eo(n5d|)*b@2LWl*L+DqcXLLVbYj9q7&YTO-tZX*Aa~1-q@6l z0MOd3^;pQA?suss*6|tndOoGg1|tUsVc;SpP*}0b~QV21ccT$3CS zKy*I%mYzv~=z*G$gyMw7(5OxFO7!Z{X#<3tO4U7vyCFT9H zo@4Z!$SLa-JCBfFVQBqd@MNv|JAzBDU^N&PAdUiYS*}bE5J!Ws8Vu`Esg_HUuG`Kv zv3kaGxw2wFT#I0!V>TGIEDpVv;24Y0Vq_K=0C6osOKpbhM!`sVO|C^Sh_0t9FBlhu z9(4`WVFjZXNYzJ81~k{zR4*7UAT9`9a_g_81x5{s3qrrfTs76eD1o>jxa8$;qy*zW jNAPQDYD)=BwOGXeOksxU){O?&00000NkvXXu0mjf+>s5& literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/riverBankedNS.png b/tiled/assets/isogrid/riverBankedNS.png new file mode 100644 index 0000000000000000000000000000000000000000..1121147dfecccf36227d91061597a57f201b8f1b GIT binary patch literal 1214 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 literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/riverES.png b/tiled/assets/isogrid/riverES.png new file mode 100644 index 0000000000000000000000000000000000000000..ce664974bddbed4c76fd221ee01231f9fc404935 GIT binary patch literal 1324 zcmV+{1=IS8P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1i?u}K~#8N?c7aI z6G0dU@O}e7f*-+efFcNmg9o{gAR&6t#FGa^2?)l5mX;zEC|ID#OEAV51oRYW>CNTHQ1p@U`HV zBktR$5b?EoqCOOyZ1n|kuS~FaZUj+)vReB$wp!mUVO+#zfhbCggmGS^6bK39yhF$d z2rUf!Sr&gzEVm#EYRpoYbj)07;e2c5^>VKuI%ltv*0BoGnyTn7uMuXvTF)T>LxL3R zcmdJ-u9mcCD$fA4hfK&Biti9IA;=)g9mI=7^sUs9e6iM>p5&C}&C~=-*=LKjq%D0} zzfPFpluHfqA`$eS;^~`f+z{=V8ziwcPbQB~$;9#L^yKlMV0MVTga8oUDM}3i80sTX zFkVCOVstIs%_l+&5hxfxAONFlzKUs@0*K`9dO;GbK}?ew0$tHbH{zYlIobfS#lz*lEa%A^;kLHUG^J-uBgn4c<*v=NmG**1aD$shf>+8 z%x#S6Z7ti{^Tz@~)1lXoYD{Pc;ZT_P zO1OmuL;Em>X<{%!&YpaxOKE7xa(H0wSOW{?QxgkXdj z`8tgbg(gHjUQqL%zYi-gR*5JX1WRJZk9JX^=z-9&>YO=$28?xEIrq9y&#M|`4&*)j zT9x&GY#^9W2DcXs$L`V870d3lIw9@Dl_Zo+G?Tf}1|kv+CY15RL)#z#F%Y>HK9RYKGdfKdb@8VsPM_LouAl;~Pl5sDFr9)u}~XfVm0eiSI$0H=@}HTL44Sa0^Xw(NZ;Q|Y);q^66w3Hnk+Ee@;YDYox>wOnQa;c0_wn}Whac%2wC z5D8%tQ@0YM2O=Rj=1Zqxw2#x!r#N``BLX)yahNDCbqWSRWFmM+-^Hm+Cc;4s^{Glt zjGUTW0->kng<%CL`x;@_jTOcUL_*k=(ENKV7$Xn~;V=a24QAl)tX&>g+o#tihJwgM i*dAJYC!jDvf%pe0+}T)sZ=R+A0000Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D19M44K~#8N?b}al z6fqP4@cAZwlTsCn?ZJay7K-%f7g*GyB3OmW+CnS-W9zQAf_f6gUaTHUuZr}r=RyyD zjdZ7Lc4sm($xHGklSy77>@G92f8MXj%goCpNz4Cw-%N*}-IsF@!;YxouX7HOVh~7Ct1$=y$zwDQK_C+lZy;g^@eU$Z5N{!31MwYVb#R?+ z{QAIlMyISlIvwte{)KskxJ?i#Mz#e7(`JaEU_yduHB875t%8XO!WJeQEA$Fx%n-UT zvRGNe5JY|^CYzP%#7Y}R=gn1Bx~lE#<9fvOGB`g`13qTYBgFq;*RNmyIhw3?5f)lN zUMpb;qPjzaTka{PmQI-zSKS@Srk9+SuK7S3l`(02Fj{A67dun~ktte#(F$-%}= zw)f%&gTg>T2tp5HbL|=%-04g}c!R*GKnTJNBE=|xKwzps2*M6R3L=9MK?ni|0t8Y9 z!$AlF7eWgp3-e^RGhNr@y8ck-WpLF+Kj^G7yWi?~*2I%F54h?vm(;TfUiSRUr%g8e zeVkj{1{VM2!JcRMG8+nw26T?Zb+LBSPM)KDI;V`bQHPtq2vYmCQ zj<HdIS)J@1_d_1tADc z2-E4Z3WOjmA#`D?KnMaE0t!PpqUOM>-d@ZxG;2~t%+YoZ6UxwZ1|+GHnaBw2vj6}9 M07*qoM6N<$g1V-v!vFvP literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/riverNE.png b/tiled/assets/isogrid/riverNE.png new file mode 100644 index 0000000000000000000000000000000000000000..957aa44e888bdf711107f3ed61f56da36af8ea78 GIT binary patch literal 1290 zcmV+l1@-!gP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1fNMnK~#8N?c3W< z6G0dN;JyKmz?%T&C}_Np8xlge)995Z94tjDl$Z(>6ogV*DMtg5K*SP*6^t6hLlB7& zxiLg8xRgiu-M_HycH8aFbZ1Z9A^Agr>Fn8jLrT1~%$r82H-emt)`4 z7a;~W8bBHx#$Zz=2o7UW2o9q&3~7syLvR?zFsvXr3l%QdZ!*XuI|Yqb_Y^Y_53 zE8v~2Xk~D!&Zwe$uF}^%UkUz~wJ`9S9SlMUbwgXI4B95je9p)wgR4w}2#HI^Y$f;4qgWN)Wk{78Y=VTM_76 zxh*`OTveTAdFL9TcjcZU0*8?_3mS-AiNoK8e(b^6?q+6u-h@#h!Uw-|wgjcR9NS{T zfBuz34^Mrhi7~sJrMoier?0fDaw0_d@b9_VNiO90v@lw7r8+rMTq=#%oe#tte1SxD ziBctYhoJ4s@+}$A-o#lsC0&mQ2r%-46&r*a3~8=#iGUi0rgHfj#6Y}mZS>>NNa*J` zTXsz}-PzQyV;KLkc(L0>w$Xy*XH^(25V=m^$$Jlk_TFil?a(C1sIuXMeHi^T1Ve8c znJl1X!LWvq;{-Qb;Mr~r@QyMnX?h%I;`=&`Y~5vokn09c!Qk3~p39}ugNrzm`#YA$ z!Ipps*wRV5AgyJ@)lAoe`6|FL5(ZBmaqwdCqVeMOxT|UF#4dJhXF}JOkhSSTx~wd$ zWTrsOf)P&;`(y;dgkWOy?&7eOj(=T-ryu+>_gjh6zEfC*}f#7y6#zu=v1Q8=Ih?QVSF4XE})F4z_hzP=AGBL)QY-rmxb0TJ1GL z4EwLcbZ65Ah!`A(9z|=55FrpF3xvavgRq9k3<PVf2C^0^u-e7`-8=K%5L?6huKF zPJ%HSA`LRw-1>H~`9wO~B7I$qvofr41gAOYgabJ^s z7e~>~nl$8`=&f2|I0R9e=?fJKL)sF=a<+Sppid>+chJI+f^Z0pPNXnuARIy?1nqN- z5(tN23_%Jb2jLJpL#V;Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D12joQK~#8N?b=Oi z6fqbF@cAbFCZd&!?ZJzn3q=TCX0tQN^E59znf@2TE^Icm&yOd`JV}-%{>neCEDR2ohqB4fiT^w4{`m?bKUfjf z2AIgEO%Q--DFk2w!%#CqhX9Oc7+(;8@c^?iUg|&oxIDF3+cJRrJr;ik)V+6$_t!@k z#l!KE01P8=p}Hy%i2|5VQD%&*g8+sRybxWRKmZdW+JrG}Ab=qR(PtMb2w;3h-7ppx z1TcYMb|-%pb|xpo-N}jA`ubjMjIR~DEN;Vg*%7D;Au*~AFpk0H{M-Zq7)~S|`*I)v z;}~qy&s`t@qeZq_edQMBd_tUg7*iSC1``tE%)xNZBXpRU5S@qNK-3-ny!!F2c#fEN zOMbiT0-?h^|FS7w|Nc35lq4T8eL?_c`brY#6tkT6W0Vdxmb6lQs0%`**nj|xVwEpWJgbLh|!Cy0x-0452qwU1(6WXHm`{N+r9rFssV0llVua}Fp z3b^fkYEiE)@TSjL{4GG=e~G;}d9g@yTXvMM_7C&bV=4xAWd;lfh@G|G@&2t|zr0%l z82+?W9#i{-(C<+Jh5-{20x&Iw=sJw5z79Tb@h@S-%m~{J($uFiy$sF*X%j^18Pjwg zK>}$rL~1a$gCQeGN)T;_u|cTAqFRuYA=(B*g{TGT5=2{IILD;2Z;>HghL|@D2Siq1 zx1Zc(*O_EpYNo_t+n%=V`&ip$3J9kRt``N9hlrgqCJ;av(lk`Y)PVqkF<<(Ise%B4 z0TF5{lOTX_fbb2Y?lo~w=sLGpdo(GAI_*>j2;UOgcw87N2r|MEjtXM~0fZw2ca3QR z0fc7=Dop2}tOLi@d3b#)Qy|C)=g_(hpkTTJ@fVn&%jQ{I$MygK002ovPDHLkV1j$4 Be%Js2 literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/riverNW.png b/tiled/assets/isogrid/riverNW.png new file mode 100644 index 0000000000000000000000000000000000000000..30b26ab7c67c25d3a98184cb4af376daace4f952 GIT binary patch literal 1291 zcmV+m1@!ufP)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1fWSoK~#8N?c3W< z6G0dN;J$&6;F}n*$SFoINK6w#@JbS|yg-GBKxol&#&Qq=se*tQ4$47hnZ*T+*~(l&REC>TzI>gF~S1W*)=n~~&ntsaEJ zw9b~0r|-*ED&sWH=-V_+7WGjCv+oK9J(PS-Y?{2+K znDs)fqOm&J0lFP3>)^y%ED zpkcHSfT2B{z`*>4_e9d_egy?%2Vn*iTe^#m7Lh1??$SGWR&A}9 z5PF!-PjO2W(e=a(i1nY?Fs9i3h%=a*+8c<3(854{X`Z=m3gc&#xY}CALKyxFR?2Jr zg3zLj?ClY=6eenZf^D~RMvP+!&AUEc9PD41L+I0rsOO^xM+TJGy!eg_gJXc<0YQK8 z;LoHKAONpNffZuR0Qq%J7KZ1pTw-fT8W4&?mtSNk?6%!ldL1skhDSoYcI7(KtF0aD z{ZfGd%JA-wOp%W*NSdZu`9LsbL|V+S(0vn55_>j#Egh~DT8GVw5S3PKMIj1@?9@lhZ#ctHS$ z0R#hM1|kc_@b0p(G{qaj7Q_xl4|-CIwC{OfO;Wfp5ZkF z6Nnb3eKJB4+Z(>ui_t$vWMF&P^QaI7;RuAnEWPa|$=?UQp+K$Z*{JapLo~!WNLO|3 zW>@vGw%fu!77YXGsqf3Zf`k~Wj~q`th}34c!c!8%z)s||Z_!{t=-=HS6HK5XWP(u; zHlG*pBVxKgCp`PWr(ea|P$O7Bqv2=700?G3hGnU|U?BW}(So>zDOd=RFlHdEFoA&( z0b>V}3ns7-Ucz8N^e_s-qD$b>m9ctL?p>4Ht}EB|ZeV7| z>d-rwPCx<$!84U%b}(5$0u3P=#x6xE2#;p|b`fI+q9Ae=7R~E!YK$3-7DPcXKzNnP z==+)i(>1vmbJV47BSt}>hMD~&r!d(013fSA<`L{e$@dCY7%Yf_aOs4F$pxYyTtcuG ze=86L!5IPzqX$tC9z*1UQN>y?fYpzqHKtG^;y>YV(o@qWJTCwM002ovPDHLkV1fPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1#(G5K~#8N?cCi{ z6IT=f@cbwKCt?5FO?EL>l}=%5jH5JbVO!N@%7gxn^<+4U}S@MOi4Ac3`%)>DZvcyL6(`hERALBOCG z(F7S;=_D{D2n>!DEoDsl zgz_IX8Ve`?!h?VQ6N<{)8eq&ER^fJS4szdpO{1leYp%Gke`tG%wq$8Dgn=LmRt9_z zWCmjg!3|;rg9pcE#}3l6b&w%rTh}1}JP)(Kti!zzAA|;56i2^5Le2fYLmod1qZ^;q zksN{`iXMg+LKuX>WYq^ihD)Z#%vYJ`WydAR-}9ZhNqCrS++)TV)6X z(QYlr%3%Bw6Dt>J4de}cC+q}dlw?8SRmt}Z;6bq3Xa4;gDDIaD&X>(*u0^5cs!_7^ zAUK;K0+OyIA#pG}0BiGozzZV+l3BY7`Mt@=A(#PG{@f@1jNm-^gd+n4A?}P{hNa>D zItU9M7(0+uwFkzZjl>4Q3TNuYXgxa|W{4I7F;0Q-z*vE_1B4!^^!hQG4*HxnbKa6= z1Yrqc1)~QUS-lFgKd(Ew9CcgY!*qWNv(*Zt?;%zYTp&g;3_ls9P@?vQB3j${0!_ zCs%{V@?gA#2onqr8V;T;2>o$f!}tji2AG+{veXsKmVdp`SSl_2SQ5{aAR&T;K@gtx z7?BLpPlF4Agb5-D7%hlf7_;>VE|4%o_z7bKA_`--Fk}f5B?v!YtU&Bw>>$|sgds?j zA-sg)0nx+oLKuR?3Bn5)5fBC=vNDJJ(hP|+giM&t>NV~aOeY{X`&zmEmGC?h&P$z| z;t>3wE`jgv=AA#!3Z@8%$TYZqQZVumGBbt;#;Rl~2#dV*Dr1a56of#5lntW=Q4j(U zUX?NgQ4lU5WW%t(YZ6_di(RvpXhIL=w3I0b*%G?riNf%LsElw4#|vWzq99yCi1rvW z5CtI_f)^(C@2ou@SJ#Kvmof&TGQ#!Hx;p@ai3`O4hfE_c#L-sP00000NkvXXu0mjf DQ#X@P literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/road.png b/tiled/assets/isogrid/road.png new file mode 100644 index 0000000000000000000000000000000000000000..e6666ab1d7c174880021172a840aff0da2c3e136 GIT binary patch literal 739 zcmV<90v!E`P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0(eP8K~#8N?c7Ul z!Y~j9U~bSO^h_*}AgIc!5V5XWbyanZy6vVCy+=7rkI*Byv8Y2Da6FUPjvqggMWiGU z{4vhhPBNQC{@U$!w^dbr$|9E||2gp<{${he`9lyjL{k9c*;GQ*0599^_NNWeT?UL} z7%Bu{0)+sKWtgE6(btU0b!f_%P_7^lF@Zt=#sK3hBG8mY0+D^hgc1?iM@%db$wy4A z5Xr%$0ueoo8htg5HJRG*(ANjw!Bh~TSETLZ3l1h%h~SzsK%D1bCY_G~#B~Vo5d#Ps zgmV}`41=%^0|+}1qhSEy27(O(2tN=;7(h$|p@k{SQq;p7|E_Ja-J8YdnbGU9KT#Bg zn5|YTAq!y4mFD7)r6A_>xsas+0gPXeE`$~YFm7RV5JnKd*o84ckU;=54u%TB1_2BY zh6~Yv+?S^;i(8PDT?ZNpAwh~oon;;0?!^1^S^$O@0o@dMEW~TI5QnGb2}BjZ@KJ0* zNQ?^*z|cW#L-c|GMi1i(f&>DXGmL8p7D&!8z90sH3weF3aXFj$`I9!9aBHtH})}Scu$UqJc;qCR&KpV3L7|9VS_b*kH1O2puL{ zh|pjFp?NUCRQ(t=1utldK>)#kaFs5r>zcC3nnu()Y1gq40|-(z^EVm_L+wAP?V{^P z@T=199$XkI2p~o}QDICVfEWqEJ^AZE0AU$|3eyDvgkuO33{KXb0d!xd&M~P(#4mo^ VoiHS?26zAf002ovPDHLkV1iVADkA^@ literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/roadES.png b/tiled/assets/isogrid/roadES.png new file mode 100644 index 0000000000000000000000000000000000000000..598e62478534e1c328e3fa8dbd3218660d5fa7a2 GIT binary patch literal 1598 zcmV-E2EqA>P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1=C4HK~#8N?c3{a z8$}cc@Vo(!z?*=8a!HVoEL0RyAQGU&$_Hpwx2~mJCQFnyEf5NANuAKf zxl~mn1TBqlxs(s3kB~<=@OK%ryWW|d+3SqGl~%E%ZR_2i&p9(^X8ZaK|5K_DJUX-5 zU&VpfhF^}kAD=;#RtLy>v~U{x9x?aI4Ey9f2pdZM*}W6>fvFTGLR=XLXS95EJ->J7 z&gH55_Zw-%gk|FgqOvhcKmW2!f8E_~9e*}A_U<*eQkWnpejrX=9i*LGXWI}A#QO7I zbF=#Q@0)4ym&Ne|F}s$bm7CK-2rJ61ojScUd8|4%HkQKhVEjO!X4JOcqTSugQW$`k zJ6WWEA=*ban@wS?D1IRj71w_%`-ZTh;C0W#_=P}JplHiP#pcyzdVhM#77rTc)e$4n8WSZ1Fwh|674fgnpH8f1s76=h5fe28OI5tN z2KrD3558>#2u6JvaA0^IdUrW42v*45TITqj?x_k9gfGn5$|=IUsN*`CTeE={%Ho7z z(ed4l3D@}sqC+)h#C<-#Fs=~)Et2_OC`$r@f$+Mwy4Mb1@FLs!dtBq^>!aRl{z*bG z5Z=5)=X5nWQINvGk}?J?ZksV|+n02JU>}nAEmLiw$C<8BGi0K}iQ%?=sRi@y^3zmY z>9@%_Pmb$7@4`MhF|BP4LB~J_1S^}O`#AIcb2R?Nlhij+dx~)A0K=Pq;9D5yw_fG{ z!pO?2m;(&ghOV^}rFf;k1(92LtaY?Obb#TtOVH6(xk+)Ki#j5M0vL=WfdYuBFZa=r z&mKZ>L6U^w4SR7Rakkj~fXbr$vAa$e>&H7FJVBCxLE+=&~I) zTr1PXT7fEOMr~0c6(I~HZWz%rtkXlDruyv|KVKnx8HQ6`h2$zyLQ zffVMRpuWb(uTpLPMbZt%x>?$plXXO~LI6Vr1Q4IR_X1V&gAYO2p%aW~T?9b7wBy|% zWI>M3KTgFDpKn31!v>-o3?@>d9VbcF6cL0M$kJlA1+iFo$%fGpA=YToC6#%hAX?(w z@E`-h1G#YKFr6=rP^Iv42ZS&}bc2yW!7ww*$)gH{6XcunAv!nnrVv62M2A!+gMt(m zcHhen1OpjAJWRC@Ugt)GwRZRdNg4))UNrh*qcIfxpp(cT5JUSjbUeFX3F3c{(t+Xi z(t!ugG$r#siBTCg(5>y1q*~s7HeV+Nv6vftP&qm{+)Zu9K)mXU zHW1E7%uIq&d5Q`^ZZO(Hm<%KPL=}q~z~pj=+AR)Ngk^sQsSzEiN%m=2cAhB_!=A+T zN@J}1iawJp06Q;H2vZ{lBQduYKGq|)*XG;JJ{1tHAWVh9yah|b)`cPKnuH99))1z_ zur=#yHS5{}7l9ZBp*sw=(^xkTU@^!V8SJ$ih|v(b!LWTz*7a$;mI3K12wh;D5bV7O zq^lv4hEV}Q_jO_XHDA4^!1D;zc}Lji$2E_U0Re<+_mwsMjE9IjVniS^3qx+LaQv?8 zAmV~?1Hqbgx%i6I!jKcB>mj0sv4XJ818!^9yh!NU)TCO2!m2RV!Z literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/roadEW.png b/tiled/assets/isogrid/roadEW.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec9351e2bba2cdea9dcdc1dd5aa8d7b498efc05 GIT binary patch literal 1232 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 literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/roadHill2W.png b/tiled/assets/isogrid/roadHill2W.png new file mode 100644 index 0000000000000000000000000000000000000000..6c29b2a316e9e18c8b3463245f310548a9ab9b72 GIT binary patch literal 1585 zcmV-12G043P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1;$B4K~#8N?c04% z97P-laNa>*LSKUKz(iZC@P{!zBp@*u#h98H5}`-hK+sCam5V@Zp)KV}X-yxl9=3N< zd)3p5El`>!;sf$RGO-%{@x3jZ$ zq`JA7b$g`)Ay~)G=IU&<`t)c_e_Hz9 z7H_y42L1i<@sZi??rsAU)_)P~jfpYbp@{#t_Jb3@SE+iM+}Ovb>dMxpb<3*^c2 zedzD+voQ#Yfl(;pl@~P5z0yr41dU=~0>X&q#mv-%5Qb?nK0*BEg|jt?d~Gs@gQOxa zL?BF8CeT_`=Y@e0xan?}gqarxMgk_vyf84D=7oV_!03<{2Ic@px4cL#jP7|M19Nd= z3~=47VON*qnqSD=WYKGH-I%Le`rp}F8Eu$)Orz$769^YBeo5&dC`&?KAPg?) z<7zT*`G4!*CHUj#>59b2KblLEm=`>Zjr9tYZVf_yu17DBq~`?-=Fhbv6z0#=FizzZdH{hKnt)`>$B(2jFDgG?aA3p?f)E$(y*se}_oB5W$Lny`yG4hYQC>&p z7u?Tc=LKmM^f`tML5SgE%fRKIKHU3n;~{tS;Z^UB@`ii87i)gO&x@Er2t>B{>fX)Y z&u}5|1BuqVEu46F8rLXAdXMI52WuTNi;a^NWBG zg}3cN5Z+517$FSadmBa+!sLZN468*rAXozKCUVYzP}64_28(weFgD5MgEv7lbOPk$q(b!bMC)i;)2#mCn?+2wn>c0#g_} zX|FERWn{a{Vw9X^KoZq8@gP)oWw^Rbmi-YXC`hUyl)+GiGQS`O!lN1a?#gN~h3Sv& zn!j_G46DmB5EA{FUl>yJCz~-?p>7}~AXIf_2t#jQBKw-OUE&CEk7D^zzb%IBD>D!w zvH67&UF;**g}&$)(*23;*UG|(f*6Q^q@pl95CahqLN@%}Kn#Rp2vHa(h=B+hf(K*5 jI${8~w<8&olos(n^`|BzAr?eK00000NkvXXu0mjf_Wa_2 literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/roadHillE.png b/tiled/assets/isogrid/roadHillE.png new file mode 100644 index 0000000000000000000000000000000000000000..c6808e8fe01b8e4634da729f18b0d85a6a4ee733 GIT binary patch literal 1329 zcmV-11Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1jb23K~#8N?cD25 z6G0RJVBWw-@DY3i6C*Lks8O*5LJ0oA7&XR3NE@ORDp(N$)K)>mr658yT#6wC=z?3*jX!F z7&n72$B^8HK&=Woj5a&Ud=cws=C2Xt=T-dxI@Zw*(MS%DN1j9T!urUd)Ds~uDe zWvoHG24g1pYA{p_Wp;sx2*Wb?a+LL7V=%wo1*zo-ykEGdzUFT?2(K_s1%F`SzG{6C zZ^p>kzT^~$n=m{CU$1JO-B;!`h}|$E1fRrdo4gJ$Mz26*_#!+`7DJI+AS_@+4}NXe zS&%o^L1?<} z$e|{W!51P!FbJ+L|5*A+wH_m4@P!0HF!F^muLNHaq^bWxW|M=wp%p`NfeK&7<#)1+ zVSO1rhthM8O@#B-{EhVW_*nT+leT}i`?$KqIVh6aDq-+V3CLl11VOKf+>Al9eTmoL zleh??z40pah00DqaO-({4H^cDGjEz_5Hg#|ePtp9Ukw6bGldhFcV{8?z$|T zAxd4W-Q5Yx$0suaL#TpeGp6GfNc};OCR%e~+&qVf4x$C24}!Zg1k?Knr19nqj1Q7u z?$FB~8VGt2;v6G&KZKUZgUnjGolR|&C0d3UfiMU152v%P0&Z8?hax(N8HoQNtrb=2 z)`~-Nv_*T_E*McktUz?vmL2v5%c`>9&6GHT5e2v-np!0-aXHH4EeZi5H~;RK9ZAVNdf3F9<~ry%TraSFuK5G-L*vAfyo zGP#t?s<>EC5G-L(bs3la5sX!kf`(uQLoAe;1@R#?e(KM3t?U>k)q5wq<}Y8yRazwS zAq@QHqFETc=8rdHU>Lp41M;v_00000NkvXXu0mjfomNw% literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/roadHillN.png b/tiled/assets/isogrid/roadHillN.png new file mode 100644 index 0000000000000000000000000000000000000000..ac597c656719a4d7a1f26d45c1931814613032e6 GIT binary patch literal 1255 zcmVPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1bj(EK~#8N?c3{4 z6G0RJVBUa7;1PTSFEQ~CiLo&#icly9;inW^(F&}RmncCL!@2qg$n zkb=qP6Ns+h>65`6geM4|kPyVs+$Hc#oy}n|1rY_pXryfRBP8D4FMwc{A!dMJfwZ^t z71mQxScu<)$jq(0tiTvlGsNr=T9J0MX-Izpg;K*GV%1LofwF{fPa&jZw8qtJRQ{AeewCHHOr1@atwoDhGlp2<}V3EX;Wd*`KVo$$lq>dG8l;j)(#DXqC&4X9f9yiRrz|~7 zmY!>AE_b+R9gB4oErIh0(*5ilR3#rbLVWx(@B|}8B}GEVX{3h-P%}uH8TfmiKoG=} zzKam?*8c;+gJ&2uBz&$(+Mh<>^9j>#tpM0Z4l|cRsf-xAtJ)?3^EtG4bO*fDnbx}h_ICL2;y@) zAwK9TnGMptLlX$kFg$@=uXBLEy^aXtKgdXf^Yciu-Nx@+%2|^V@e*9fjm`Z>!g%BOaNDxCIM1?T|q@oa_!LS733PKbZ79dV!6$lFz%|; z%Y{(`u_07LO*TOd#Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1+hs)K~#8N?cDor z6Gs#W;Jg8kkVohnlvY(MRj8K;QH4@);vfotQDW*el|uwHfi!|35#!ha+rp%3Nu|(A zpisxQxI_^Vz0sDY2}vFyk1)+K8fUWE-I>{)UC-EyLx!wg?e&0S50oQ81y{1ko+Bb zjbXQC-sP^ZKi~KA<-%~~(HFK5EDm7h>%IHUyGsME7$7!Qmxo`iENyMBEtA#%o{-ta zOlz33>m~Fv%oT;e8ymlNuCFea0Kx8@(!js~f#ch;QS#!q1{dYUKM%<5N2mEHm@8r`RtO3LuR}u_viSHu z7X@=g>{+|Ea)V$|;QXh#87>M8Wtb}-U}PXznBvVFM0KvjdJ^dsf<*};S8}!9H#~f= z%>64WAcD@7sd`_++$St}<*FgV$Q8j`Gpkw95SS~1--j?EFjrhq+695RVnNXX0&`^> zMMsEO<_cYXg~=IA(yZT3o!&=!z5?}#^|fac)+KOQ&d>?LdM&Eg!Jz2X*7=IHFl1Mg zfQ3J}ah+jQuY=`l$qB(9o@$!Wn)SVJ2=UIOa;en%oRz9gOa4a;i;3Mef<3KX6e14Rb}oC^dfXAh+5ESPRc@ z2%%uE_(U11yhBE3KOj>Jy%BF1dF9Fc$@L#Tmu-e1!#}=a?(@d%}X7f-Eg1I7=D*$on?#CpZf2)NN7zpNyGs@b(Psz{om-j#f+C%8@ zh4qyk7=T!;mB?J>Yf`-R`L13;F#_!&Y&ONYzOwRHgESsYk{`=owvM)g#4%U;`}@h{ zL}nKRMR5iBru<&BrXI!-hq^sLBoYbI)zwALebpxgGI;%M(owx~lvJ_@NmwvZ%@q~` zFl0ag;_Af@NpYb2H3&Vzgo#S7*g=Sbq_g|U*rfwa2zu-S2^+@b{a|hoJdpDA$tJ|~ z;3vB<_Vf_8w}ds6nU*Ue5KbVow^C$g`~)cu9^M1t+C##IF(FrEAgmyF3unlk%g0?I zq(H(N%5=;XFAx+YlS+`vXwtDau-V}WBn%i`a>WnCr-!=8`ICpFAa+2;k0gE>KeA~Z zrbONc^{cF%xza9(>9gIN#dP=1fALY(3?}Sc(FVf0Pe?bIpmRlA2%TYq$d!?i^Q|Qg z8p5KlellXu(8S$2XKA2Ik5QE?boCY1nM46-yS75;*kk7(3*9*e9CqS+zrGi2%TW;as{^2u$u><7{vArdTs||G=wfN zG*{@pCbm8e=OQ4Hg3txV3PInyfkYaj-7qpBu=<+I9P_l++-L_uN~){@Vi+guce z2Z9jXM=jTY2NT-i2nhi=RCl)FGXDd O0000P literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/roadHillW.png b/tiled/assets/isogrid/roadHillW.png new file mode 100644 index 0000000000000000000000000000000000000000..9185bf3fbdff8167da069078f9981a4c4fe32e1a GIT binary patch literal 1665 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 D|I~eg literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/roadNS.png b/tiled/assets/isogrid/roadNS.png new file mode 100644 index 0000000000000000000000000000000000000000..f507e68b3a60a2d6b05e30ca283a73f3a9a216a5 GIT binary patch literal 1178 zcmV;L1ZDe)P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D1TRTMK~#8N?b_>3 z6G0RJ;JyKmz?*1Pynu;GV=!1$5;djaAE8{D0QDAaZM+~M5RewFnjppt6cZ_z#DrfM zOiEPvfjk0_aP%yhvfXZXX1bT|<&aFeWv30CFK1?U&V)i9|H%~Enp4ZIIc#|C@qfp= ze}1ai(xf0Pw}HA5jKih~@wm{IOcl-_YB31LL5%(VV$=5a=j6+kZbJyl7@JWLVz;!O z{8L&z+}qgzY@1uJAiLUKF;p343*Mul%p}y`Uu(^~rL`PG(0e5qlR*~wcu!AH^PSP5 z+}376$p(=|Fd~ta?1K=oSScrBbXjh}0ukAA+$E29MC_9Uj0^DZw~cC}ZcEcr|H)aj1fMZ~iQ#7h8o73=oVx zFsUyWVEFZE2#w^=05*a-E*?^>XL>IkAH z2*KD3^ZVxt%r7RYAh;j|V=W9qeE&8LAM**w&URO1g;0ht5P~rWv-4vaR+pZ`hq?Z8 zvjl`-0{1k+WPp(6L z;xZ77Tn1>D#%c(}kO4u6r}r;GcCh0Jgf)VZN6~{21sRw)3F$`{6$sWUKnO-0#0Y{1 zGB*=bAZ8L*Dln=tM4c@(l=0^X7Wi7P+Bsxlwh!KBqL58ot%5Mj5Q3@35XlHF3 zc9;@*@5fbHqabGD9S7Ngj;`_<#A3i_YWhO{8Qhp-z)4Z;o&=+&%iWrA;qCfPa3syPNh*l`+ykX6v>Zx)7~ zYvN@<;D;tzt9oGwLN?Np{bgZ9K>{~fOU9ksT@;1~LJ-_g%XQ$v1ok;XE{xXqt_4Gr swe_)<`bI4bJx54|&%VwK#xHZkKlLU!aHswbQ2+n{07*qoM6N<$f}aiiBme*a literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/roadNW.png b/tiled/assets/isogrid/roadNW.png new file mode 100644 index 0000000000000000000000000000000000000000..086ae189e8115c323cac6396cfd1eb55b0be25bd GIT binary patch literal 1652 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 AUjP6A literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/waterCornerES.png b/tiled/assets/isogrid/waterCornerES.png new file mode 100644 index 0000000000000000000000000000000000000000..d0f444dcf0f9402f73cbc0b5940eadade4da31a9 GIT binary patch literal 880 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 T!nBzL00000NkvXXu0mjfJ>X-~ literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/waterNE.png b/tiled/assets/isogrid/waterNE.png new file mode 100644 index 0000000000000000000000000000000000000000..3c107ca8d7d15c65ad086427b52e9597a60ee732 GIT binary patch literal 1294 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 g5Og~dV_caLzqYVq_HwzOV literal 0 HcmV?d00001 diff --git a/tiled/assets/isogrid/waterSW.png b/tiled/assets/isogrid/waterSW.png new file mode 100644 index 0000000000000000000000000000000000000000..571fb4bfce6abacea23b190d71613a78a639a296 GIT binary patch literal 983 zcmV;|11S87P)Px#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D18hk|K~#8N?b}aJ z6G0RJ@cjmS1ip!hiXuID;nIW6R)-R__F>w9ni;dur4Yj*#P!YIJ50q<7Ap(tgDI;9E4yjQ^+6)#u5k?f?y26B!wUtO)$D42qq?sX$XQ*glYWxJJLMt z%{LBzAB#b=@tzKsPodI=pp3~VgtIVN%LrLH%ycQMwo9XxorzX;r^NcN|KBUN2rq9C zNi!x%tfVmwE*voUsIF2aZzQ#1$}jB2c6 z!C)31gn{YB_V}yS&$X4b4qs(GLHFnN{WmRM#>H63-b>4V5(shSwYQV((WeDg-{0G9bDZ^WA2JQ}?8i?A+h`i$TrYlojoo>1iFtRoE;AT5Vfcn{pe&R& z8(9#V8K)4l>lYXdA0$l}*ih&@E4w%S-ea=FLGXD7z&dsH157We2oRAVX~T#+1;K)# zK_7w=0)fN~$iB6`I(ztWuD={i&`iu51tA5=8jOkH*j%OzLK%c$&aO_x0aS%RgAfc3 z1`FYX+<$(xf0TtCX&jZs`Gwm4PFx58nOnQayw1`z+j=s|2nLq{B6L!S<%R2P^LF_J zgb#wjqv(PFi~$gWQ3uftF%*PgqG3!yD1i`6;D%hpnKeH;8ukj!n)e7E_^8)&JtWvq z!lqs9F{U#@gh7G0lrgp;&PrBwYUX`)>PVIyu4GJF5F4}Qqs?388UJ2-$8ngjk)xyUEZgSqG@ zUUM2avzGoJLCQ1OhQWY11(8-MQvq=r!ZwVq`w_V>P1wq4s+5I+P(~nhbi)Ke2m%3N zs+95PnpAIPx#1ZP1_K>z@;j|==^1poj532;bRa{vGi!vFvd!vV){sAK>D0-;GnK~#8N?b$&~ zBQX>Q@O~4&iQtN2J$TtmL8RbkkX;tmi|(O1tSBPt)@_&dn#~bD;;n zMl_?Nv#~RInMpE9`Y$|YhE5B~kN5IOYPA492fc?e9svx+?;&u6c5l!<=nWW;=X=0d zR}~==5WrZbkU;>(5{N1UU<|>Og#e5u7~K$nDF|a40x(1v+Yo@sfTkwYSM5nW3t+RSJI-6zj_34?oMAUqPa2h5J!7-~rB_M#&4^rp^Qv?A_#V}bQfT;*Z1_Bt%FjNr0Sc3WXYdY?- zR0Ca^exUZ>>u&Ax`vN=M`N#mHe}c)o6gU6a&mR%%d~UE9BniM+MoB?%jCUY_u>>*% zA{PWOhG23aNFadG1VeyO0s%}x7zKzzAb=sl6o7aGiRPOZ(R@GMZBg&hl?gy4Algff ze&r!HqZ7ao%Mw4HHVFY3MG-iL#jyvQuB* zOIZT3v^&mtD1o>H;d{o25K15}L-+=h1wjJw3Bq+48AL9K&k(M`P$7nbgaqLVOfu2b zYrLq33{f=<6@tI_WqX2cuP??2LaOm@i$m6)y7s-Tc9{agAvRX$lo2?Z_Yk%-CJzJ< zIcaJtV}^kMLZM#jhDn0}LIJ{5DN7b>tPv$J(mySmF@Vqnp(|rXu6;E$|CxWQnlV(6 z;M!MLVPqhH&@3m*m@E)LXojG!F(L>c3`59Z5)eRGhRA{m1>zA~&3|U5j8ty`0000< KMNUMnLSTX$JUprZ literal 0 HcmV?d00001 diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session index 34b7d1f..ad98a72 100644 --- a/tiled/detiled.tiled-session +++ b/tiled/detiled.tiled-session @@ -31,6 +31,14 @@ "y": 176.08265552868764 } }, + "maps/hexgrid.json": { + "scale": 0.6611, + "selectedLayer": 1, + "viewCenter": { + "x": 2432.3097867191045, + "y": 2227.3483587959463 + } + }, "tilesets/grid_items.json": { "dynamicWrapping": true, "scaleInDock": 3.0191, @@ -63,11 +71,11 @@ } }, "last.exportedFilePath": "/Users/insality/code/defold/detiled/tiled/export", - "last.imagePath": "/Users/insality/code/defold/detiled/tiled/assets/hexgrid", + "last.imagePath": "/Users/insality/code/defold/detiled/tiled/assets/isogrid", "lastUsedTilesetExportFilter": "JSON tileset files (*.tsj *.json)", "map.lastUsedExportFilter": "Defold Collection (*.collection)", "map.lastUsedFormat": "json", - "map.orientation": "4", + "map.orientation": "2", "map.tileHeight": 182, "map.tileWidth": 192, "openFiles": [ diff --git a/tiled/maps/isogrid.json b/tiled/maps/isogrid.json new file mode 100644 index 0000000..03d3efc --- /dev/null +++ b/tiled/maps/isogrid.json @@ -0,0 +1,51 @@ +{ "compressionlevel":-1, + "height":20, + "infinite":false, + "layers":[ + { + "data":[76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 22, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 31, 37, 39, 76, 76, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 86, 31, 31, 31, 31, 76, 76, 76, 63, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 86, 31, 31, 31, 31, 31, 75, 2147483710, 63, 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 86, 84, 82, 31, 31, 25, 19, 17, 72, 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 78, 77, 81, 81, 81, 62, 72, 31, 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 31, 31, 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 31, 12, 6, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 6, 6, 3, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76], + "height":20, + "id":1, + "name":"tiles", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }], + "nextlayerid":2, + "nextobjectid":1, + "orientation":"isometric", + "renderorder":"right-down", + "tiledversion":"1.11.2", + "tileheight":48, + "tilesets":[ + { + "firstgid":1, + "source":"..\/tilesets\/isogrid_tileset.json" + }], + "tilewidth":96, + "type":"map", + "version":"1.10", + "width":30 +} \ No newline at end of file diff --git a/tiled/tilesets/isogrid_tileset.json b/tiled/tilesets/isogrid_tileset.json new file mode 100644 index 0000000..6658c37 --- /dev/null +++ b/tiled/tilesets/isogrid_tileset.json @@ -0,0 +1,546 @@ +{ "columns":0, + "grid": + { + "height":1, + "orientation":"orthogonal", + "width":1 + }, + "margin":0, + "name":"isogrid_tileset", + "spacing":0, + "tilecount":88, + "tiledversion":"1.11.2", + "tileheight":80, + "tiles":[ + { + "id":0, + "image":"..\/assets\/isogrid\/beach.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":1, + "image":"..\/assets\/isogrid\/beachCornerES.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":2, + "image":"..\/assets\/isogrid\/beachCornerNE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":3, + "image":"..\/assets\/isogrid\/beachCornerNW.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":4, + "image":"..\/assets\/isogrid\/beachCornerSW.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":5, + "image":"..\/assets\/isogrid\/beachE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":6, + "image":"..\/assets\/isogrid\/beachES.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":7, + "image":"..\/assets\/isogrid\/beachN.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":8, + "image":"..\/assets\/isogrid\/beachNE.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":9, + "image":"..\/assets\/isogrid\/beachNW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":10, + "image":"..\/assets\/isogrid\/beachS.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":11, + "image":"..\/assets\/isogrid\/beachSW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":12, + "image":"..\/assets\/isogrid\/beachW.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":13, + "image":"..\/assets\/isogrid\/bridgeEW.png", + "imageheight":62, + "imagewidth":100 + }, + { + "id":14, + "image":"..\/assets\/isogrid\/bridgeNS.png", + "imageheight":62, + "imagewidth":100 + }, + { + "id":15, + "image":"..\/assets\/isogrid\/crossroad.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":16, + "image":"..\/assets\/isogrid\/crossroadESW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":17, + "image":"..\/assets\/isogrid\/crossroadNES.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":18, + "image":"..\/assets\/isogrid\/crossroadNEW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":19, + "image":"..\/assets\/isogrid\/crossroadNSW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":20, + "image":"..\/assets\/isogrid\/dirt.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":21, + "image":"..\/assets\/isogrid\/dirtDouble.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":22, + "image":"..\/assets\/isogrid\/endE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":23, + "image":"..\/assets\/isogrid\/endN.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":24, + "image":"..\/assets\/isogrid\/endS.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":25, + "image":"..\/assets\/isogrid\/endW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":26, + "image":"..\/assets\/isogrid\/exitE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":27, + "image":"..\/assets\/isogrid\/exitN.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":28, + "image":"..\/assets\/isogrid\/exitS.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":29, + "image":"..\/assets\/isogrid\/exitW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":30, + "image":"..\/assets\/isogrid\/grass.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":31, + "image":"..\/assets\/isogrid\/grassWhole.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":32, + "image":"..\/assets\/isogrid\/hillE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":33, + "image":"..\/assets\/isogrid\/hillES.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":34, + "image":"..\/assets\/isogrid\/hillN.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":35, + "image":"..\/assets\/isogrid\/hillNE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":36, + "image":"..\/assets\/isogrid\/hillNW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":37, + "image":"..\/assets\/isogrid\/hillS.png", + "imageheight":80, + "imagewidth":100 + }, + { + "id":38, + "image":"..\/assets\/isogrid\/hillSW.png", + "imageheight":80, + "imagewidth":100 + }, + { + "id":39, + "image":"..\/assets\/isogrid\/hillW.png", + "imageheight":80, + "imagewidth":100 + }, + { + "id":40, + "image":"..\/assets\/isogrid\/lotE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":41, + "image":"..\/assets\/isogrid\/lotES.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":42, + "image":"..\/assets\/isogrid\/lotN.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":43, + "image":"..\/assets\/isogrid\/lotNE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":44, + "image":"..\/assets\/isogrid\/lotNW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":45, + "image":"..\/assets\/isogrid\/lotS.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":46, + "image":"..\/assets\/isogrid\/lotSW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":47, + "image":"..\/assets\/isogrid\/lotW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":48, + "image":"..\/assets\/isogrid\/riverBankedES.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":49, + "image":"..\/assets\/isogrid\/riverBankedEW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":50, + "image":"..\/assets\/isogrid\/riverBankedNE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":51, + "image":"..\/assets\/isogrid\/riverBankedNS.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":52, + "image":"..\/assets\/isogrid\/riverBankedNW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":53, + "image":"..\/assets\/isogrid\/riverBankedSW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":54, + "image":"..\/assets\/isogrid\/riverES.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":55, + "image":"..\/assets\/isogrid\/riverEW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":56, + "image":"..\/assets\/isogrid\/riverNE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":57, + "image":"..\/assets\/isogrid\/riverNS.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":58, + "image":"..\/assets\/isogrid\/riverNW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":59, + "image":"..\/assets\/isogrid\/riverSW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":60, + "image":"..\/assets\/isogrid\/road.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":61, + "image":"..\/assets\/isogrid\/roadES.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":62, + "image":"..\/assets\/isogrid\/roadEW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":63, + "image":"..\/assets\/isogrid\/roadHill2E.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":64, + "image":"..\/assets\/isogrid\/roadHill2N.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":65, + "image":"..\/assets\/isogrid\/roadHill2S.png", + "imageheight":77, + "imagewidth":100 + }, + { + "id":66, + "image":"..\/assets\/isogrid\/roadHill2W.png", + "imageheight":77, + "imagewidth":100 + }, + { + "id":67, + "image":"..\/assets\/isogrid\/roadHillE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":68, + "image":"..\/assets\/isogrid\/roadHillN.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":69, + "image":"..\/assets\/isogrid\/roadHillS.png", + "imageheight":80, + "imagewidth":100 + }, + { + "id":70, + "image":"..\/assets\/isogrid\/roadHillW.png", + "imageheight":80, + "imagewidth":100 + }, + { + "id":71, + "image":"..\/assets\/isogrid\/roadNE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":72, + "image":"..\/assets\/isogrid\/roadNS.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":73, + "image":"..\/assets\/isogrid\/roadNW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":74, + "image":"..\/assets\/isogrid\/roadSW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":75, + "image":"..\/assets\/isogrid\/water.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":76, + "image":"..\/assets\/isogrid\/waterCornerES.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":77, + "image":"..\/assets\/isogrid\/waterCornerNE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":78, + "image":"..\/assets\/isogrid\/waterCornerNW.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":79, + "image":"..\/assets\/isogrid\/waterCornerSW.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":80, + "image":"..\/assets\/isogrid\/waterE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":81, + "image":"..\/assets\/isogrid\/waterES.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":82, + "image":"..\/assets\/isogrid\/waterN.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":83, + "image":"..\/assets\/isogrid\/waterNE.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":84, + "image":"..\/assets\/isogrid\/waterNW.png", + "imageheight":65, + "imagewidth":100 + }, + { + "id":85, + "image":"..\/assets\/isogrid\/waterS.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":86, + "image":"..\/assets\/isogrid\/waterSW.png", + "imageheight":58, + "imagewidth":100 + }, + { + "id":87, + "image":"..\/assets\/isogrid\/waterW.png", + "imageheight":58, + "imagewidth":100 + }], + "tilewidth":100, + "type":"tileset", + "version":"1.10" +} \ No newline at end of file From c3e8c7c0e884ddd0a5f0251f8044fa79b06019c1 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 18:34:20 +0200 Subject: [PATCH 15/71] Add isometric module --- detiled/internal/detiled_decore.lua | 3 ++ detiled/internal/grid/isometric.lua | 81 +++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+) create mode 100644 detiled/internal/grid/isometric.lua diff --git a/detiled/internal/detiled_decore.lua b/detiled/internal/detiled_decore.lua index 1e6af37..9c56b85 100644 --- a/detiled/internal/detiled_decore.lua +++ b/detiled/internal/detiled_decore.lua @@ -4,6 +4,7 @@ local base64 = require("detiled.internal.base64") local grid = require("detiled.internal.grid.grid") local isogrid = require("detiled.internal.grid.isogrid") +local isometric = require("detiled.internal.grid.isometric") local hexgrid = require("detiled.internal.grid.hexgrid") local M = {} @@ -16,6 +17,8 @@ local function get_grid_module(map) return hexgrid elseif map.orientation == "staggered" then return isogrid + elseif map.orientation == "isometric" then + return isometric else return grid end diff --git a/detiled/internal/grid/isometric.lua b/detiled/internal/grid/isometric.lua new file mode 100644 index 0000000..55d4bbf --- /dev/null +++ b/detiled/internal/grid/isometric.lua @@ -0,0 +1,81 @@ +local M = {} + + +local function get_scene_size(map_params) + local data = map_params + local w = data.scene.tiles_x + local h = data.scene.tiles_y + local tw = data.tile.width + local th = data.tile.height + local size_x = (w + h) * (tw / 2) + local size_y = (w + h - 1) * (th / 2) + return size_x, size_y +end + + +---@param tiled_data detiled.map +---@return table +function M.get_map_params_from_tiled(tiled_data) + local map_params = {} + map_params.tile = { + width = tiled_data.tilewidth, + height = tiled_data.tileheight, + } + map_params.scene = { + invert_y = true, + tiles_x = tiled_data.width, + tiles_y = tiled_data.height, + size_x = 0, + size_y = 0, + } + + local size_x, size_y = get_scene_size(map_params) + map_params.scene.size_x = size_x + map_params.scene.size_y = size_y + + return map_params +end + + +---@param i number +---@param j number +---@param map_params table +---@return number, number +function M.cell_to_pos(i, j, map_params) + local data = map_params + local h = data.scene.tiles_y + local tw = data.tile.width + local th = data.tile.height + + local x = (i - j + h) * (tw / 2) + local y = (i + j) * (th / 2) + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + x = x + tw / 2 + y = y + (data.scene.invert_y and -th / 2 or th / 2) + + return x, y +end + + +---@param i number +---@param j number +---@param z_layer number|nil +---@param map_params table +---@return number, number, number +function M.get_tile_pos(i, j, z_layer, map_params) + z_layer = z_layer or 0 + local x, y = M.cell_to_pos(i, j, map_params) + + local y_value = (y - z_layer * 100000) + y_value = map_params.scene.size_y - y_value + local z_pos = y_value / 100000 + + return x, y, z_pos +end + + +return M From aeac30458ed4d8bd41008b4db011eff19177f100 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 21:06:48 +0200 Subject: [PATCH 16/71] Update --- example/assets/isogrid/entities/beach.go | 3 ++ .../assets/isogrid/entities/beachCornerES.go | 3 ++ .../assets/isogrid/entities/beachCornerNE.go | 3 ++ .../assets/isogrid/entities/beachCornerNW.go | 3 ++ .../assets/isogrid/entities/beachCornerSW.go | 3 ++ example/assets/isogrid/entities/beachE.go | 3 ++ example/assets/isogrid/entities/beachES.go | 3 ++ example/assets/isogrid/entities/beachN.go | 3 ++ example/assets/isogrid/entities/beachNE.go | 3 ++ example/assets/isogrid/entities/beachNW.go | 3 ++ example/assets/isogrid/entities/beachS.go | 3 ++ example/assets/isogrid/entities/beachSW.go | 3 ++ example/assets/isogrid/entities/beachW.go | 3 ++ example/assets/isogrid/entities/bridgeEW.go | 3 ++ example/assets/isogrid/entities/bridgeNS.go | 3 ++ example/assets/isogrid/entities/crossroad.go | 3 ++ .../assets/isogrid/entities/crossroadESW.go | 3 ++ .../assets/isogrid/entities/crossroadNES.go | 3 ++ .../assets/isogrid/entities/crossroadNEW.go | 3 ++ .../assets/isogrid/entities/crossroadNSW.go | 3 ++ example/assets/isogrid/entities/dirt.go | 3 ++ example/assets/isogrid/entities/dirtDouble.go | 3 ++ example/assets/isogrid/entities/endE.go | 3 ++ example/assets/isogrid/entities/endN.go | 3 ++ example/assets/isogrid/entities/endS.go | 3 ++ example/assets/isogrid/entities/endW.go | 3 ++ example/assets/isogrid/entities/exitE.go | 3 ++ example/assets/isogrid/entities/exitN.go | 3 ++ example/assets/isogrid/entities/exitS.go | 3 ++ example/assets/isogrid/entities/exitW.go | 3 ++ example/assets/isogrid/entities/grass.go | 3 ++ example/assets/isogrid/entities/grassWhole.go | 3 ++ example/assets/isogrid/entities/hillE.go | 3 ++ example/assets/isogrid/entities/hillES.go | 3 ++ example/assets/isogrid/entities/hillN.go | 3 ++ example/assets/isogrid/entities/hillNE.go | 3 ++ example/assets/isogrid/entities/hillNW.go | 3 ++ example/assets/isogrid/entities/hillS.go | 3 ++ example/assets/isogrid/entities/hillSW.go | 3 ++ example/assets/isogrid/entities/hillW.go | 3 ++ example/assets/isogrid/entities/lotE.go | 3 ++ example/assets/isogrid/entities/lotES.go | 3 ++ example/assets/isogrid/entities/lotN.go | 3 ++ example/assets/isogrid/entities/lotNE.go | 3 ++ example/assets/isogrid/entities/lotNW.go | 3 ++ example/assets/isogrid/entities/lotS.go | 3 ++ example/assets/isogrid/entities/lotSW.go | 3 ++ example/assets/isogrid/entities/lotW.go | 3 ++ .../assets/isogrid/entities/riverBankedES.go | 3 ++ .../assets/isogrid/entities/riverBankedEW.go | 3 ++ .../assets/isogrid/entities/riverBankedNE.go | 3 ++ .../assets/isogrid/entities/riverBankedNS.go | 3 ++ .../assets/isogrid/entities/riverBankedNW.go | 3 ++ .../assets/isogrid/entities/riverBankedSW.go | 3 ++ example/assets/isogrid/entities/riverES.go | 3 ++ example/assets/isogrid/entities/riverEW.go | 3 ++ example/assets/isogrid/entities/riverNE.go | 3 ++ example/assets/isogrid/entities/riverNS.go | 3 ++ example/assets/isogrid/entities/riverNW.go | 3 ++ example/assets/isogrid/entities/riverSW.go | 3 ++ example/assets/isogrid/entities/road.go | 3 ++ example/assets/isogrid/entities/roadES.go | 3 ++ example/assets/isogrid/entities/roadEW.go | 3 ++ example/assets/isogrid/entities/roadHill2E.go | 3 ++ example/assets/isogrid/entities/roadHill2N.go | 3 ++ example/assets/isogrid/entities/roadHill2S.go | 3 ++ example/assets/isogrid/entities/roadHill2W.go | 3 ++ example/assets/isogrid/entities/roadHillE.go | 3 ++ example/assets/isogrid/entities/roadHillN.go | 3 ++ example/assets/isogrid/entities/roadHillS.go | 3 ++ example/assets/isogrid/entities/roadHillW.go | 3 ++ example/assets/isogrid/entities/roadNE.go | 3 ++ example/assets/isogrid/entities/roadNS.go | 3 ++ example/assets/isogrid/entities/roadNW.go | 3 ++ example/assets/isogrid/entities/roadSW.go | 3 ++ example/assets/isogrid/entities/water.go | 3 ++ .../assets/isogrid/entities/waterCornerES.go | 3 ++ .../assets/isogrid/entities/waterCornerNE.go | 3 ++ .../assets/isogrid/entities/waterCornerNW.go | 3 ++ .../assets/isogrid/entities/waterCornerSW.go | 3 ++ example/assets/isogrid/entities/waterE.go | 3 ++ example/assets/isogrid/entities/waterES.go | 3 ++ example/assets/isogrid/entities/waterN.go | 3 ++ example/assets/isogrid/entities/waterNE.go | 3 ++ example/assets/isogrid/entities/waterNW.go | 3 ++ example/assets/isogrid/entities/waterS.go | 3 ++ example/assets/isogrid/entities/waterSW.go | 3 ++ example/assets/isogrid/entities/waterW.go | 3 ++ tiled/detiled.tiled-session | 48 +++++++++++++++---- 89 files changed, 303 insertions(+), 9 deletions(-) diff --git a/example/assets/isogrid/entities/beach.go b/example/assets/isogrid/entities/beach.go index 578e225..3de4eba 100644 --- a/example/assets/isogrid/entities/beach.go +++ b/example/assets/isogrid/entities/beach.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/beachCornerES.go b/example/assets/isogrid/entities/beachCornerES.go index 07e355b..64293a6 100644 --- a/example/assets/isogrid/entities/beachCornerES.go +++ b/example/assets/isogrid/entities/beachCornerES.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/beachCornerNE.go b/example/assets/isogrid/entities/beachCornerNE.go index e33f870..91ba459 100644 --- a/example/assets/isogrid/entities/beachCornerNE.go +++ b/example/assets/isogrid/entities/beachCornerNE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/beachCornerNW.go b/example/assets/isogrid/entities/beachCornerNW.go index 0c64d8a..8dbb952 100644 --- a/example/assets/isogrid/entities/beachCornerNW.go +++ b/example/assets/isogrid/entities/beachCornerNW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/beachCornerSW.go b/example/assets/isogrid/entities/beachCornerSW.go index c44e9c4..205337a 100644 --- a/example/assets/isogrid/entities/beachCornerSW.go +++ b/example/assets/isogrid/entities/beachCornerSW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/beachE.go b/example/assets/isogrid/entities/beachE.go index 790524a..be679e1 100644 --- a/example/assets/isogrid/entities/beachE.go +++ b/example/assets/isogrid/entities/beachE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/beachES.go b/example/assets/isogrid/entities/beachES.go index 8586a60..a3835b3 100644 --- a/example/assets/isogrid/entities/beachES.go +++ b/example/assets/isogrid/entities/beachES.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/beachN.go b/example/assets/isogrid/entities/beachN.go index c75e6e6..ece1593 100644 --- a/example/assets/isogrid/entities/beachN.go +++ b/example/assets/isogrid/entities/beachN.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/beachNE.go b/example/assets/isogrid/entities/beachNE.go index 60de940..46affd2 100644 --- a/example/assets/isogrid/entities/beachNE.go +++ b/example/assets/isogrid/entities/beachNE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/beachNW.go b/example/assets/isogrid/entities/beachNW.go index 9732c99..ee0bda1 100644 --- a/example/assets/isogrid/entities/beachNW.go +++ b/example/assets/isogrid/entities/beachNW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/beachS.go b/example/assets/isogrid/entities/beachS.go index c61cda0..1c5fc0b 100644 --- a/example/assets/isogrid/entities/beachS.go +++ b/example/assets/isogrid/entities/beachS.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/beachSW.go b/example/assets/isogrid/entities/beachSW.go index dcaa7d5..b408914 100644 --- a/example/assets/isogrid/entities/beachSW.go +++ b/example/assets/isogrid/entities/beachSW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/beachW.go b/example/assets/isogrid/entities/beachW.go index a578a5c..6988f15 100644 --- a/example/assets/isogrid/entities/beachW.go +++ b/example/assets/isogrid/entities/beachW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/bridgeEW.go b/example/assets/isogrid/entities/bridgeEW.go index 5612f32..f192ed5 100644 --- a/example/assets/isogrid/entities/bridgeEW.go +++ b/example/assets/isogrid/entities/bridgeEW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 6.0 + } } diff --git a/example/assets/isogrid/entities/bridgeNS.go b/example/assets/isogrid/entities/bridgeNS.go index c52cf59..d93afbe 100644 --- a/example/assets/isogrid/entities/bridgeNS.go +++ b/example/assets/isogrid/entities/bridgeNS.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 6.0 + } } diff --git a/example/assets/isogrid/entities/crossroad.go b/example/assets/isogrid/entities/crossroad.go index 1dbbcc4..b050fb8 100644 --- a/example/assets/isogrid/entities/crossroad.go +++ b/example/assets/isogrid/entities/crossroad.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/crossroadESW.go b/example/assets/isogrid/entities/crossroadESW.go index 1091dda..d603bad 100644 --- a/example/assets/isogrid/entities/crossroadESW.go +++ b/example/assets/isogrid/entities/crossroadESW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/crossroadNES.go b/example/assets/isogrid/entities/crossroadNES.go index 9487a88..514c084 100644 --- a/example/assets/isogrid/entities/crossroadNES.go +++ b/example/assets/isogrid/entities/crossroadNES.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/crossroadNEW.go b/example/assets/isogrid/entities/crossroadNEW.go index 7fb86cc..818a331 100644 --- a/example/assets/isogrid/entities/crossroadNEW.go +++ b/example/assets/isogrid/entities/crossroadNEW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/crossroadNSW.go b/example/assets/isogrid/entities/crossroadNSW.go index 3b69b71..4a7c5d6 100644 --- a/example/assets/isogrid/entities/crossroadNSW.go +++ b/example/assets/isogrid/entities/crossroadNSW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/dirt.go b/example/assets/isogrid/entities/dirt.go index 65b7227..bbddc25 100644 --- a/example/assets/isogrid/entities/dirt.go +++ b/example/assets/isogrid/entities/dirt.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/dirtDouble.go b/example/assets/isogrid/entities/dirtDouble.go index 085c2f8..e8ab2fe 100644 --- a/example/assets/isogrid/entities/dirtDouble.go +++ b/example/assets/isogrid/entities/dirtDouble.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/endE.go b/example/assets/isogrid/entities/endE.go index 1eb913b..41d63d8 100644 --- a/example/assets/isogrid/entities/endE.go +++ b/example/assets/isogrid/entities/endE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/endN.go b/example/assets/isogrid/entities/endN.go index 8c7b08f..f4ebff6 100644 --- a/example/assets/isogrid/entities/endN.go +++ b/example/assets/isogrid/entities/endN.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/endS.go b/example/assets/isogrid/entities/endS.go index f45f1ed..69ffb0a 100644 --- a/example/assets/isogrid/entities/endS.go +++ b/example/assets/isogrid/entities/endS.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/endW.go b/example/assets/isogrid/entities/endW.go index 8688caf..833fb57 100644 --- a/example/assets/isogrid/entities/endW.go +++ b/example/assets/isogrid/entities/endW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/exitE.go b/example/assets/isogrid/entities/exitE.go index 5d6f317..c83f609 100644 --- a/example/assets/isogrid/entities/exitE.go +++ b/example/assets/isogrid/entities/exitE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/exitN.go b/example/assets/isogrid/entities/exitN.go index b96396b..fa525f1 100644 --- a/example/assets/isogrid/entities/exitN.go +++ b/example/assets/isogrid/entities/exitN.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/exitS.go b/example/assets/isogrid/entities/exitS.go index 2357c9b..0673a08 100644 --- a/example/assets/isogrid/entities/exitS.go +++ b/example/assets/isogrid/entities/exitS.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/exitW.go b/example/assets/isogrid/entities/exitW.go index 38581ee..b120875 100644 --- a/example/assets/isogrid/entities/exitW.go +++ b/example/assets/isogrid/entities/exitW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/grass.go b/example/assets/isogrid/entities/grass.go index b88d929..9ab9366 100644 --- a/example/assets/isogrid/entities/grass.go +++ b/example/assets/isogrid/entities/grass.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/grassWhole.go b/example/assets/isogrid/entities/grassWhole.go index 2c8e681..a099776 100644 --- a/example/assets/isogrid/entities/grassWhole.go +++ b/example/assets/isogrid/entities/grassWhole.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/hillE.go b/example/assets/isogrid/entities/hillE.go index dde567e..2efce04 100644 --- a/example/assets/isogrid/entities/hillE.go +++ b/example/assets/isogrid/entities/hillE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/hillES.go b/example/assets/isogrid/entities/hillES.go index 373acbf..3096571 100644 --- a/example/assets/isogrid/entities/hillES.go +++ b/example/assets/isogrid/entities/hillES.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/hillN.go b/example/assets/isogrid/entities/hillN.go index e1a69c7..248ffa9 100644 --- a/example/assets/isogrid/entities/hillN.go +++ b/example/assets/isogrid/entities/hillN.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/hillNE.go b/example/assets/isogrid/entities/hillNE.go index c760221..2d4c1bb 100644 --- a/example/assets/isogrid/entities/hillNE.go +++ b/example/assets/isogrid/entities/hillNE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/hillNW.go b/example/assets/isogrid/entities/hillNW.go index c0f9d52..8f310aa 100644 --- a/example/assets/isogrid/entities/hillNW.go +++ b/example/assets/isogrid/entities/hillNW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/hillS.go b/example/assets/isogrid/entities/hillS.go index 1895a7d..82e949f 100644 --- a/example/assets/isogrid/entities/hillS.go +++ b/example/assets/isogrid/entities/hillS.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 16.0 + } } diff --git a/example/assets/isogrid/entities/hillSW.go b/example/assets/isogrid/entities/hillSW.go index 7f16e95..72b4a9c 100644 --- a/example/assets/isogrid/entities/hillSW.go +++ b/example/assets/isogrid/entities/hillSW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 16.0 + } } diff --git a/example/assets/isogrid/entities/hillW.go b/example/assets/isogrid/entities/hillW.go index 8119ada..a3386a1 100644 --- a/example/assets/isogrid/entities/hillW.go +++ b/example/assets/isogrid/entities/hillW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 16.0 + } } diff --git a/example/assets/isogrid/entities/lotE.go b/example/assets/isogrid/entities/lotE.go index 4db8915..dc5673e 100644 --- a/example/assets/isogrid/entities/lotE.go +++ b/example/assets/isogrid/entities/lotE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/lotES.go b/example/assets/isogrid/entities/lotES.go index 2757eff..f524403 100644 --- a/example/assets/isogrid/entities/lotES.go +++ b/example/assets/isogrid/entities/lotES.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/lotN.go b/example/assets/isogrid/entities/lotN.go index 7f12bbe..957c8e9 100644 --- a/example/assets/isogrid/entities/lotN.go +++ b/example/assets/isogrid/entities/lotN.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/lotNE.go b/example/assets/isogrid/entities/lotNE.go index bd91d51..29e1d63 100644 --- a/example/assets/isogrid/entities/lotNE.go +++ b/example/assets/isogrid/entities/lotNE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/lotNW.go b/example/assets/isogrid/entities/lotNW.go index 0bb228b..911a882 100644 --- a/example/assets/isogrid/entities/lotNW.go +++ b/example/assets/isogrid/entities/lotNW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/lotS.go b/example/assets/isogrid/entities/lotS.go index d334c72..c7bb856 100644 --- a/example/assets/isogrid/entities/lotS.go +++ b/example/assets/isogrid/entities/lotS.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/lotSW.go b/example/assets/isogrid/entities/lotSW.go index feb11d1..bba0aa9 100644 --- a/example/assets/isogrid/entities/lotSW.go +++ b/example/assets/isogrid/entities/lotSW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/lotW.go b/example/assets/isogrid/entities/lotW.go index 345922c..f466400 100644 --- a/example/assets/isogrid/entities/lotW.go +++ b/example/assets/isogrid/entities/lotW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/riverBankedES.go b/example/assets/isogrid/entities/riverBankedES.go index 17f0ab4..8102418 100644 --- a/example/assets/isogrid/entities/riverBankedES.go +++ b/example/assets/isogrid/entities/riverBankedES.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/riverBankedEW.go b/example/assets/isogrid/entities/riverBankedEW.go index 7730d10..557fcf9 100644 --- a/example/assets/isogrid/entities/riverBankedEW.go +++ b/example/assets/isogrid/entities/riverBankedEW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/riverBankedNE.go b/example/assets/isogrid/entities/riverBankedNE.go index 599986e..f56735d 100644 --- a/example/assets/isogrid/entities/riverBankedNE.go +++ b/example/assets/isogrid/entities/riverBankedNE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/riverBankedNS.go b/example/assets/isogrid/entities/riverBankedNS.go index e3400ed..8267c40 100644 --- a/example/assets/isogrid/entities/riverBankedNS.go +++ b/example/assets/isogrid/entities/riverBankedNS.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/riverBankedNW.go b/example/assets/isogrid/entities/riverBankedNW.go index ee6a642..f6dc0a6 100644 --- a/example/assets/isogrid/entities/riverBankedNW.go +++ b/example/assets/isogrid/entities/riverBankedNW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/riverBankedSW.go b/example/assets/isogrid/entities/riverBankedSW.go index d90042b..d310880 100644 --- a/example/assets/isogrid/entities/riverBankedSW.go +++ b/example/assets/isogrid/entities/riverBankedSW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/riverES.go b/example/assets/isogrid/entities/riverES.go index a4a29a3..777f7d5 100644 --- a/example/assets/isogrid/entities/riverES.go +++ b/example/assets/isogrid/entities/riverES.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/riverEW.go b/example/assets/isogrid/entities/riverEW.go index a58f02b..4b0f76c 100644 --- a/example/assets/isogrid/entities/riverEW.go +++ b/example/assets/isogrid/entities/riverEW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/riverNE.go b/example/assets/isogrid/entities/riverNE.go index 46ad836..539f968 100644 --- a/example/assets/isogrid/entities/riverNE.go +++ b/example/assets/isogrid/entities/riverNE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/riverNS.go b/example/assets/isogrid/entities/riverNS.go index ba74805..4208acc 100644 --- a/example/assets/isogrid/entities/riverNS.go +++ b/example/assets/isogrid/entities/riverNS.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/riverNW.go b/example/assets/isogrid/entities/riverNW.go index bfe37c3..dfb737b 100644 --- a/example/assets/isogrid/entities/riverNW.go +++ b/example/assets/isogrid/entities/riverNW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/riverSW.go b/example/assets/isogrid/entities/riverSW.go index 16356fc..933aacb 100644 --- a/example/assets/isogrid/entities/riverSW.go +++ b/example/assets/isogrid/entities/riverSW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/road.go b/example/assets/isogrid/entities/road.go index 3b3b1bf..c01e704 100644 --- a/example/assets/isogrid/entities/road.go +++ b/example/assets/isogrid/entities/road.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/roadES.go b/example/assets/isogrid/entities/roadES.go index 32f3f3e..03f18b9 100644 --- a/example/assets/isogrid/entities/roadES.go +++ b/example/assets/isogrid/entities/roadES.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/roadEW.go b/example/assets/isogrid/entities/roadEW.go index 65f8ded..8bbe8dc 100644 --- a/example/assets/isogrid/entities/roadEW.go +++ b/example/assets/isogrid/entities/roadEW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/roadHill2E.go b/example/assets/isogrid/entities/roadHill2E.go index f41aae1..61153c3 100644 --- a/example/assets/isogrid/entities/roadHill2E.go +++ b/example/assets/isogrid/entities/roadHill2E.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/roadHill2N.go b/example/assets/isogrid/entities/roadHill2N.go index 52ce77c..2ddabe2 100644 --- a/example/assets/isogrid/entities/roadHill2N.go +++ b/example/assets/isogrid/entities/roadHill2N.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/roadHill2S.go b/example/assets/isogrid/entities/roadHill2S.go index 5f79cf5..0661f42 100644 --- a/example/assets/isogrid/entities/roadHill2S.go +++ b/example/assets/isogrid/entities/roadHill2S.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/roadHill2W.go b/example/assets/isogrid/entities/roadHill2W.go index 89754a8..ba2ad2b 100644 --- a/example/assets/isogrid/entities/roadHill2W.go +++ b/example/assets/isogrid/entities/roadHill2W.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/roadHillE.go b/example/assets/isogrid/entities/roadHillE.go index 86b7b49..f69892c 100644 --- a/example/assets/isogrid/entities/roadHillE.go +++ b/example/assets/isogrid/entities/roadHillE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/roadHillN.go b/example/assets/isogrid/entities/roadHillN.go index de73f4f..772394c 100644 --- a/example/assets/isogrid/entities/roadHillN.go +++ b/example/assets/isogrid/entities/roadHillN.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/roadHillS.go b/example/assets/isogrid/entities/roadHillS.go index 442d605..af3d97e 100644 --- a/example/assets/isogrid/entities/roadHillS.go +++ b/example/assets/isogrid/entities/roadHillS.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 16.0 + } } diff --git a/example/assets/isogrid/entities/roadHillW.go b/example/assets/isogrid/entities/roadHillW.go index 6413024..10110ab 100644 --- a/example/assets/isogrid/entities/roadHillW.go +++ b/example/assets/isogrid/entities/roadHillW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 16.0 + } } diff --git a/example/assets/isogrid/entities/roadNE.go b/example/assets/isogrid/entities/roadNE.go index 23da417..379e1d7 100644 --- a/example/assets/isogrid/entities/roadNE.go +++ b/example/assets/isogrid/entities/roadNE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/roadNS.go b/example/assets/isogrid/entities/roadNS.go index 708a109..91582ce 100644 --- a/example/assets/isogrid/entities/roadNS.go +++ b/example/assets/isogrid/entities/roadNS.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/roadNW.go b/example/assets/isogrid/entities/roadNW.go index 1ed9455..2f0b32b 100644 --- a/example/assets/isogrid/entities/roadNW.go +++ b/example/assets/isogrid/entities/roadNW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/roadSW.go b/example/assets/isogrid/entities/roadSW.go index 9d624fa..9aefe75 100644 --- a/example/assets/isogrid/entities/roadSW.go +++ b/example/assets/isogrid/entities/roadSW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/water.go b/example/assets/isogrid/entities/water.go index 4bc7e75..fc5114e 100644 --- a/example/assets/isogrid/entities/water.go +++ b/example/assets/isogrid/entities/water.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/waterCornerES.go b/example/assets/isogrid/entities/waterCornerES.go index d795672..35e41e6 100644 --- a/example/assets/isogrid/entities/waterCornerES.go +++ b/example/assets/isogrid/entities/waterCornerES.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/waterCornerNE.go b/example/assets/isogrid/entities/waterCornerNE.go index 2091b53..2175d3e 100644 --- a/example/assets/isogrid/entities/waterCornerNE.go +++ b/example/assets/isogrid/entities/waterCornerNE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/waterCornerNW.go b/example/assets/isogrid/entities/waterCornerNW.go index 191c4ac..e05066a 100644 --- a/example/assets/isogrid/entities/waterCornerNW.go +++ b/example/assets/isogrid/entities/waterCornerNW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/waterCornerSW.go b/example/assets/isogrid/entities/waterCornerSW.go index f8362c3..71da067 100644 --- a/example/assets/isogrid/entities/waterCornerSW.go +++ b/example/assets/isogrid/entities/waterCornerSW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/waterE.go b/example/assets/isogrid/entities/waterE.go index fc28cb5..890c2b1 100644 --- a/example/assets/isogrid/entities/waterE.go +++ b/example/assets/isogrid/entities/waterE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/waterES.go b/example/assets/isogrid/entities/waterES.go index 3f49d23..54c2cc5 100644 --- a/example/assets/isogrid/entities/waterES.go +++ b/example/assets/isogrid/entities/waterES.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/waterN.go b/example/assets/isogrid/entities/waterN.go index be5f9fe..7eed559 100644 --- a/example/assets/isogrid/entities/waterN.go +++ b/example/assets/isogrid/entities/waterN.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/waterNE.go b/example/assets/isogrid/entities/waterNE.go index 21a7f01..d2d6bb5 100644 --- a/example/assets/isogrid/entities/waterNE.go +++ b/example/assets/isogrid/entities/waterNE.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/waterNW.go b/example/assets/isogrid/entities/waterNW.go index fc258c2..271baf6 100644 --- a/example/assets/isogrid/entities/waterNW.go +++ b/example/assets/isogrid/entities/waterNW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 8.0 + } } diff --git a/example/assets/isogrid/entities/waterS.go b/example/assets/isogrid/entities/waterS.go index 20641e2..1b71af0 100644 --- a/example/assets/isogrid/entities/waterS.go +++ b/example/assets/isogrid/entities/waterS.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/waterSW.go b/example/assets/isogrid/entities/waterSW.go index a54afdc..70a70fa 100644 --- a/example/assets/isogrid/entities/waterSW.go +++ b/example/assets/isogrid/entities/waterSW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/example/assets/isogrid/entities/waterW.go b/example/assets/isogrid/entities/waterW.go index 21023bc..8ca5e9c 100644 --- a/example/assets/isogrid/entities/waterW.go +++ b/example/assets/isogrid/entities/waterW.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/isogrid/isogrid_tiles.atlas\"\n" "}\n" "" + position { + y: 4.0 + } } diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session index ad98a72..36481c4 100644 --- a/tiled/detiled.tiled-session +++ b/tiled/detiled.tiled-session @@ -3,11 +3,11 @@ "height": 4300, "width": 2 }, - "activeFile": "maps/grid.json", + "activeFile": "maps/isogrid.json", "expandedProjectPaths": [ "tilesets", - ".", - "maps" + "maps", + "." ], "fileStates": { ":/automap-tiles.tsx": { @@ -32,6 +32,9 @@ } }, "maps/hexgrid.json": { + "expandedObjectLayers": [ + 2 + ], "scale": 0.6611, "selectedLayer": 1, "viewCenter": { @@ -39,10 +42,18 @@ "y": 2227.3483587959463 } }, + "maps/isogrid.json": { + "scale": 2.7295, + "selectedLayer": 0, + "viewCenter": { + "x": 1114.1234658362337, + "y": 674.6656896867559 + } + }, "tilesets/grid_items.json": { "dynamicWrapping": true, "scaleInDock": 3.0191, - "scaleInEditor": 1 + "scaleInEditor": 0.73 }, "tilesets/grid_items.tsj": { "dynamicWrapping": true, @@ -55,7 +66,7 @@ "tilesets/grid_tileset.json": { "dynamicWrapping": false, "scaleInDock": 2.4562, - "scaleInEditor": 5.2012 + "scaleInEditor": 0.73 }, "tilesets/grid_tileset.json.tsj": { "scaleInDock": 1, @@ -66,8 +77,18 @@ "scaleInDock": 1, "scaleInEditor": 1 }, + "tilesets/hexgrid_objects.json": { + "scaleInDock": 1, + "scaleInEditor": 0.73 + }, "tilesets/hexgrid_tiles.json": { - "dynamicWrapping": true + "dynamicWrapping": true, + "scaleInDock": 0.3806, + "scaleInEditor": 0.73 + }, + "tilesets/isogrid_tileset.json": { + "scaleInDock": 0.5024, + "scaleInEditor": 0.73 } }, "last.exportedFilePath": "/Users/insality/code/defold/detiled/tiled/export", @@ -81,7 +102,12 @@ "openFiles": [ "tilesets/grid_tileset.json", "tilesets/grid_items.json", - "maps/grid.json" + "maps/grid.json", + "maps/hexgrid.json", + "tilesets/hexgrid_tiles.json", + "tilesets/hexgrid_objects.json", + "maps/isogrid.json", + "tilesets/isogrid_tileset.json" ], "project": "detiled.tiled-project", "property.type": "float", @@ -89,11 +115,15 @@ "tilesets/grid_tileset.json", "tilesets/grid_items.json", "maps/grid.json", + "maps/hexgrid.json", + "tilesets/hexgrid_tiles.json", + "tilesets/hexgrid_objects.json", + "tilesets/isogrid_tileset.json", + "maps/isogrid.json", ":/automap-tiles.tsx", "maps/grid.json.tmj", "tilesets/grid_tileset.tsx", - "tilesets/grid_tileset.json.tsj", - "tilesets/grid_items.tsj" + "tilesets/grid_tileset.json.tsj" ], "tileset.lastUsedFormat": "json", "tileset.tileSize": { From ffe4bd3b45db1d28f9619bec2493509fcccfa3ef Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 21:13:17 +0200 Subject: [PATCH 17/71] Update --- detiled/internal/detiled_decore.lua | 30 ++++++++++++++----- detiled/internal/detiled_internal.lua | 17 +++++++++++ .../example_isogrid/example_isogrid.script | 4 ++- game.project | 2 +- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/detiled/internal/detiled_decore.lua b/detiled/internal/detiled_decore.lua index 9c56b85..cdd1c4a 100644 --- a/detiled/internal/detiled_decore.lua +++ b/detiled/internal/detiled_decore.lua @@ -49,7 +49,7 @@ local function get_entities_from_tile_layer(layer, map) for i = 1, #inflated_data, 4 do local b1, b2, b3, b4 = inflated_data:byte(i, i+3) local gid = b1 + b2*256 + b3*65536 + b4*16777216 - table.insert(tiles, bit.band(gid, 0x1FFFFFFF)) + table.insert(tiles, gid) end layer_data = tiles @@ -58,7 +58,8 @@ local function get_entities_from_tile_layer(layer, map) for tile_index = 1, #layer_data do local tile_gid = layer_data[tile_index] - local tile, tileset = detiled_internal.get_tile_by_gid(map, tile_gid) + local cleared_gid, flip_h, flip_v, flip_d = detiled_internal.parse_gid_flags(tile_gid) + local tile, tileset = detiled_internal.get_tile_by_gid(map, cleared_gid) if tile and tileset then local tile_i = ((tile_index - 1) % map.width) local tile_j = (math.floor((tile_index - 1) / map.width)) @@ -73,17 +74,25 @@ local function get_entities_from_tile_layer(layer, map) end end + local scale_x = flip_h and -1 or 1 + local scale_y = flip_v and -1 or 1 + local rotation = flip_d and -90 or 0 + local transform = { + position_x = pos_x, + position_y = pos_y, + position_z = position_z, + } + if scale_x ~= 1 then transform.scale_x = scale_x end + if scale_y ~= 1 then transform.scale_y = scale_y end + if rotation ~= 0 then transform.rotation = rotation end + ---@type decore.entities_pack_data.instance local entity = {} entity.prefab_id = prefab_id entity.components = { prefab_id = prefab_id, tiled_layer_id = layer.name, - transform = { - position_x = pos_x, - position_y = pos_y, - position_z = position_z, - } + transform = transform, } table.insert(entities, entity) @@ -114,13 +123,18 @@ local function get_entities_from_object_layer(layer, map) local object_gid = object.gid if object_gid then -- If object has a tileset, spawn from tileset - local tile, tileset = detiled_internal.get_tile_by_gid(map, object_gid) + local cleared_gid, flip_h, flip_v, flip_d = detiled_internal.parse_gid_flags(object_gid) + local tile, tileset = detiled_internal.get_tile_by_gid(map, cleared_gid) if tile and tileset then local entity = {} local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, tile, map_width, map_height, map_params) position_x = position_x + (layer.offsetx or 0) position_y = position_y - (layer.offsety or 0) + if flip_h then scale_x = -scale_x end + if flip_v then scale_y = -scale_y end + if flip_d then rotation = rotation - 90 end + local prefab_id = tile.class or tile.type if not prefab_id or prefab_id == "" then diff --git a/detiled/internal/detiled_internal.lua b/detiled/internal/detiled_internal.lua index 06ad754..5680cbb 100644 --- a/detiled/internal/detiled_internal.lua +++ b/detiled/internal/detiled_internal.lua @@ -125,6 +125,23 @@ function M.load_tileset(tileset) end +local GID_FLIP_H = 0x80000000 +local GID_FLIP_V = 0x40000000 +local GID_FLIP_D = 0x20000000 +local GID_MASK = 0x0FFFFFFF + +---Parse Tiled global tile ID into cleared id and flip flags (see https://doc.mapeditor.org/en/stable/reference/global-tile-ids/) +---@param gid number +---@return number cleared_gid, boolean flip_h, boolean flip_v, boolean flip_d +function M.parse_gid_flags(gid) + local flip_h = (bit.band(gid, GID_FLIP_H) ~= 0) + local flip_v = (bit.band(gid, GID_FLIP_V) ~= 0) + local flip_d = (bit.band(gid, GID_FLIP_D) ~= 0) + local cleared = bit.band(gid, GID_MASK) + return cleared, flip_h, flip_v, flip_d +end + + ---@param map detiled.map ---@param tile_global_id number ---@return detiled.tileset.tile|nil, detiled.tileset|nil diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index b0c5eca..d5d97f3 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -15,11 +15,13 @@ local function spawn_entity(entity) local position_z = transform.position_z + get_z_position(position_x, position_y) local scale_x = transform.scale_x or 1 local scale_y = transform.scale_y or 1 + local rotation = transform.rotation or 0 local factory_url = "/entities#" .. prefab_id local position = vmath.vector3(position_x, position_y, position_z) local scale = vmath.vector3(scale_x, scale_y, 1) - factory.create(factory_url, position, nil, nil, scale) + local rot = vmath.quat_rotation_z(math.rad(rotation)) + factory.create(factory_url, position, rot, nil, scale) print("Spawn entity: ", factory_url, position_x, position_y, position_z) end diff --git a/game.project b/game.project index 36dd335..4ef09bf 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example_isogrid/example_isogrid.collectionc +main_collection = /example/example_hexgrid/example_hexgrid.collectionc [script] shared_state = 1 From b614920dd942eeb2f979e2b3a1eb5a56c1830ca0 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 22:06:28 +0200 Subject: [PATCH 18/71] Update --- detiled/internal/detiled_logger.lua | 10 +-- example/assets/isogrid/entities.go | 12 +++ .../example_hexgrid/example_hexgrid.script | 2 - .../example_isogrid/example_isogrid.script | 1 + game.project | 2 +- tiled/detiled.tiled-session | 10 ++- tiled/maps/isogrid.json | 83 +++++++++++++++++-- 7 files changed, 101 insertions(+), 19 deletions(-) diff --git a/detiled/internal/detiled_logger.lua b/detiled/internal/detiled_logger.lua index 16ba001..eeb2812 100644 --- a/detiled/internal/detiled_logger.lua +++ b/detiled/internal/detiled_logger.lua @@ -19,11 +19,11 @@ local empty_logger = { ---@type detiled.logger local default_logger = { - trace = function(_, msg, data) print("TRACE: " .. msg, data) end, - debug = function(_, msg, data) print("DEBUG: " .. msg, data) end, - info = function(_, msg, data) print("INFO: " .. msg, data) end, - warn = function(_, msg, data) print("WARN: " .. msg, data) end, - error = function(_, msg, data) print("ERROR: " .. msg, data) end + trace = function(_, msg, data) pprint("TRACE: " .. msg, data) end, + debug = function(_, msg, data) pprint("DEBUG: " .. msg, data) end, + info = function(_, msg, data) pprint("INFO: " .. msg, data) end, + warn = function(_, msg, data) pprint("WARN: " .. msg, data) end, + error = function(_, msg, data) pprint("ERROR: " .. msg, data) end } local METATABLE = { __index = default_logger } diff --git a/example/assets/isogrid/entities.go b/example/assets/isogrid/entities.go index 1efbffc..2c4431f 100644 --- a/example/assets/isogrid/entities.go +++ b/example/assets/isogrid/entities.go @@ -526,3 +526,15 @@ embedded_components { data: "prototype: \"/example/assets/isogrid/entities/waterW.go\"\n" "" } +embedded_components { + id: "r_tree_round" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/r_tree_round.go\"\n" + "" +} +embedded_components { + id: "r_tree_round_2" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/r_tree_round_2.go\"\n" + "" +} diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index b7f2378..5e40355 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -18,8 +18,6 @@ local function spawn_entity(entity) local position = vmath.vector3(position_x, position_y, position_z) local scale = vmath.vector3(scale_x, scale_y, 1) factory.create(factory_url, position, nil, nil, scale) - - print("Spawn entity: ", factory_url, position_x, position_y, position_z) end diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index d5d97f3..8eb1a9a 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -36,6 +36,7 @@ end function init(self) + detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") detiled.load_tileset("/tiled/tilesets/isogrid_tileset.json") local map = detiled.get_entity_from_map("/tiled/maps/isogrid.json") spawn_map(map) diff --git a/game.project b/game.project index 4ef09bf..36dd335 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example_hexgrid/example_hexgrid.collectionc +main_collection = /example/example_isogrid/example_isogrid.collectionc [script] shared_state = 1 diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session index 36481c4..4dd08dc 100644 --- a/tiled/detiled.tiled-session +++ b/tiled/detiled.tiled-session @@ -19,8 +19,8 @@ "scale": 1.05, "selectedLayer": 1, "viewCenter": { - "x": 251.42857142857142, - "y": 288.09523809523813 + "x": 240.00000000000003, + "y": 159.52380952380958 } }, "maps/grid.json.tmj": { @@ -38,8 +38,8 @@ "scale": 0.6611, "selectedLayer": 1, "viewCenter": { - "x": 2432.3097867191045, - "y": 2227.3483587959463 + "x": 2169.1120859174102, + "y": 1475.5710180003025 } }, "maps/isogrid.json": { @@ -78,6 +78,7 @@ "scaleInEditor": 1 }, "tilesets/hexgrid_objects.json": { + "dynamicWrapping": true, "scaleInDock": 1, "scaleInEditor": 0.73 }, @@ -87,6 +88,7 @@ "scaleInEditor": 0.73 }, "tilesets/isogrid_tileset.json": { + "dynamicWrapping": true, "scaleInDock": 0.5024, "scaleInEditor": 0.73 } diff --git a/tiled/maps/isogrid.json b/tiled/maps/isogrid.json index 03d3efc..d4fde9b 100644 --- a/tiled/maps/isogrid.json +++ b/tiled/maps/isogrid.json @@ -11,14 +11,14 @@ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 22, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 15, 15, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 31, 37, 39, 76, 76, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 86, 31, 31, 31, 31, 76, 76, 76, 63, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 86, 31, 31, 31, 31, 31, 75, 2147483710, 63, 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 86, 84, 82, 31, 31, 25, 19, 17, 72, 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 78, 77, 81, 81, 81, 62, 72, 31, 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 31, 31, 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 31, 12, 6, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 86, 84, 82, 31, 31, 25, 19, 17, 72, 31, 54, 53, 32, 32, 32, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 77, 78, 77, 81, 81, 81, 62, 72, 31, 31, 50, 49, 52, 52, 52, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 31, 31, 31, 49, 52, 53, 32, 32, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 31, 12, 6, 6, 10, 50, 12, 6, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 6, 6, 3, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, @@ -32,9 +32,74 @@ "width":30, "x":0, "y":0 + }, + { + "draworder":"topdown", + "id":2, + "name":"objects", + "objects":[ + { + "gid":89, + "height":264, + "id":1, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":813.090322178859, + "y":194.910342107448 + }, + { + "gid":89, + "height":264, + "id":2, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":933.492215394835, + "y":692.294714772067 + }, + { + "gid":89, + "height":264, + "id":3, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":562.737420078054, + "y":533.281179938554 + }, + { + "gid":2147483737, + "height":75.0247666261791, + "id":4, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":66.7834096861822, + "x":522.013819439409, + "y":613.694351433714 + }], + "opacity":1, + "properties":[ + { + "name":"position_z", + "type":"float", + "value":1 + }], + "type":"objectgroup", + "visible":true, + "x":0, + "y":0 }], - "nextlayerid":2, - "nextobjectid":1, + "nextlayerid":3, + "nextobjectid":5, "orientation":"isometric", "renderorder":"right-down", "tiledversion":"1.11.2", @@ -43,6 +108,10 @@ { "firstgid":1, "source":"..\/tilesets\/isogrid_tileset.json" + }, + { + "firstgid":89, + "source":"..\/tilesets\/hexgrid_objects.json" }], "tilewidth":96, "type":"map", From 8f235ab0ea5128321d70c058030a4d151c97be3c Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 23:17:29 +0200 Subject: [PATCH 19/71] Update --- example/example_grid/example_grid.collection | 8 ++++---- .../example_hexgrid/example_hexgrid.collection | 10 +++++----- .../example_isogrid/example_isogrid.collection | 8 ++++---- game.project | 2 +- tiled/detiled.tiled-session | 16 ++++++++-------- 5 files changed, 22 insertions(+), 22 deletions(-) diff --git a/example/example_grid/example_grid.collection b/example/example_grid/example_grid.collection index 691ec24..1145a25 100644 --- a/example/example_grid/example_grid.collection +++ b/example/example_grid/example_grid.collection @@ -67,8 +67,8 @@ embedded_instances { " w: 2.0\\n" "}\\n" "size {\\n" - " x: 960.0\\n" - " y: 640.0\\n" + " x: 480.0\\n" + " y: 320.0\\n" "}\\n" "size_mode: SIZE_MODE_MANUAL\\n" "textures {\\n" @@ -77,8 +77,8 @@ embedded_instances { "}\\n" "\"\n" " position {\n" - " x: 480.0\n" - " y: 320.0\n" + " x: 240.0\n" + " y: 160.0\n" " z: -1.0\n" " }\n" "}\n" diff --git a/example/example_hexgrid/example_hexgrid.collection b/example/example_hexgrid/example_hexgrid.collection index eabb3bf..7bb3c1b 100644 --- a/example/example_hexgrid/example_hexgrid.collection +++ b/example/example_hexgrid/example_hexgrid.collection @@ -59,8 +59,8 @@ embedded_instances { " w: 2.0\\n" "}\\n" "size {\\n" - " x: 960.0\\n" - " y: 640.0\\n" + " x: 4338.0\\n" + " y: 2952.0\\n" "}\\n" "size_mode: SIZE_MODE_MANUAL\\n" "textures {\\n" @@ -69,9 +69,9 @@ embedded_instances { "}\\n" "\"\n" " position {\n" - " x: 480.0\n" - " y: 320.0\n" - " z: -1.0\n" + " x: 2169.0\n" + " y: 1476.0\n" + " z: -4.0\n" " }\n" "}\n" "" diff --git a/example/example_isogrid/example_isogrid.collection b/example/example_isogrid/example_isogrid.collection index df7a07e..0aed19a 100644 --- a/example/example_isogrid/example_isogrid.collection +++ b/example/example_isogrid/example_isogrid.collection @@ -26,8 +26,8 @@ embedded_instances { " w: 2.0\\n" "}\\n" "size {\\n" - " x: 960.0\\n" - " y: 640.0\\n" + " x: 2400.0\\n" + " y: 1200.0\\n" "}\\n" "size_mode: SIZE_MODE_MANUAL\\n" "textures {\\n" @@ -36,8 +36,8 @@ embedded_instances { "}\\n" "\"\n" " position {\n" - " x: 480.0\n" - " y: 320.0\n" + " x: 1200.0\n" + " y: 600.0\n" " z: -1.0\n" " }\n" "}\n" diff --git a/game.project b/game.project index 36dd335..4ef09bf 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example_isogrid/example_isogrid.collectionc +main_collection = /example/example_hexgrid/example_hexgrid.collectionc [script] shared_state = 1 diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session index 4dd08dc..329ca33 100644 --- a/tiled/detiled.tiled-session +++ b/tiled/detiled.tiled-session @@ -16,11 +16,11 @@ "scaleInEditor": 1 }, "maps/grid.json": { - "scale": 1.05, - "selectedLayer": 1, + "scale": 9.05, + "selectedLayer": 3, "viewCenter": { - "x": 240.00000000000003, - "y": 159.52380952380958 + "x": 453.09392265193367, + "y": 316.7403314917127 } }, "maps/grid.json.tmj": { @@ -43,11 +43,11 @@ } }, "maps/isogrid.json": { - "scale": 2.7295, - "selectedLayer": 0, + "scale": 0.4068, + "selectedLayer": 1, "viewCenter": { - "x": 1114.1234658362337, - "y": 674.6656896867559 + "x": 888.6430678466078, + "y": 669.8623402163225 } }, "tilesets/grid_items.json": { From 3437d889df2d273b3662b60f5399f65bcb6a578d Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 23:17:34 +0200 Subject: [PATCH 20/71] Remove detiled_system --- detiled/detiled_system.lua | 23 ----------------------- 1 file changed, 23 deletions(-) delete mode 100644 detiled/detiled_system.lua diff --git a/detiled/detiled_system.lua b/detiled/detiled_system.lua deleted file mode 100644 index 62a52ea..0000000 --- a/detiled/detiled_system.lua +++ /dev/null @@ -1,23 +0,0 @@ -local decore = require("decore.decore") - ----@class entity ----@field name string|nil ----@field tiled_id string|nil ----@field tiled_layer_id string|nil - -decore.register_component("name", "") -decore.register_component("tiled_id", false) -decore.register_component("tiled_layer_id", false) - - ----@class system.detiled: system -local M = {} - - ----@return system.detiled -function M.create() - return decore.system(M, "detiled") -end - - -return M From a8b8c0834d364047c2b2e258a6f03e13b14a987e Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 23:19:04 +0200 Subject: [PATCH 21/71] Rename detiled_decore -> detiled_parser --- detiled/detiled.lua | 4 ++-- detiled/internal/{detiled_decore.lua => detiled_parser.lua} | 0 2 files changed, 2 insertions(+), 2 deletions(-) rename detiled/internal/{detiled_decore.lua => detiled_parser.lua} (100%) diff --git a/detiled/detiled.lua b/detiled/detiled.lua index afc114a..67d2a81 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -1,6 +1,6 @@ local logger = require("detiled.internal.detiled_logger") local detiled_internal = require("detiled.internal.detiled_internal") -local detiled_decore = require("detiled.internal.detiled_decore") +local detiled_parser = require("detiled.internal.detiled_parser") ---@class detiled local M = {} @@ -28,7 +28,7 @@ function M.get_entity_from_map(map_or_path) end ---@cast map detiled.map - local entities = detiled_decore.get_entities(map) + local entities = detiled_parser.get_entities(map) return { child_instancies = entities, } diff --git a/detiled/internal/detiled_decore.lua b/detiled/internal/detiled_parser.lua similarity index 100% rename from detiled/internal/detiled_decore.lua rename to detiled/internal/detiled_parser.lua From c2dbb58e56b383bcd36f8384017c403effe16872 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 23:22:16 +0200 Subject: [PATCH 22/71] Update --- detiled/detiled.lua | 7 +- detiled/internal/detiled_annotations.lua | 4 + detiled/internal/detiled_parser.lua | 112 +++++------------------ 3 files changed, 27 insertions(+), 96 deletions(-) diff --git a/detiled/detiled.lua b/detiled/detiled.lua index 67d2a81..b790f91 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -16,7 +16,7 @@ end ---Load a tiled map as a Decore entity ---You can add this entity with `world:addEntity(entity)` ---@param map_or_path detiled.map|string ----@return entity +---@return detiled.entity[] function M.get_entity_from_map(map_or_path) local map = map_or_path if type(map_or_path) == "string" then @@ -28,10 +28,7 @@ function M.get_entity_from_map(map_or_path) end ---@cast map detiled.map - local entities = detiled_parser.get_entities(map) - return { - child_instancies = entities, - } + return detiled_parser.get_entities(map) end diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 5cbe7f1..3785f9d 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -123,3 +123,7 @@ ---@class detiled.map.tileset ---@field firstgid number ---@field source string + +---@class detiled.entity +---@field prefab_id string +---@field components table diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index cdd1c4a..662f42a 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -2,37 +2,24 @@ local detiled_internal = require("detiled.internal.detiled_internal") local logger = require("detiled.internal.detiled_logger") local base64 = require("detiled.internal.base64") -local grid = require("detiled.internal.grid.grid") -local isogrid = require("detiled.internal.grid.isogrid") -local isometric = require("detiled.internal.grid.isometric") -local hexgrid = require("detiled.internal.grid.hexgrid") - local M = {} - ----@param map detiled.map ----@return table -local function get_grid_module(map) - if map.orientation == "hexagonal" then - return hexgrid - elseif map.orientation == "staggered" then - return isogrid - elseif map.orientation == "isometric" then - return isometric - else - return grid - end -end +local GRID_MODULES = { + ["orthogonal"] = require("detiled.internal.grid.grid"), -- orthogonal + ["isometric"] = require("detiled.internal.grid.isometric"), -- isometric + ["staggered"] = require("detiled.internal.grid.isogrid"), -- isometric staggered + ["hexagonal"] = require("detiled.internal.grid.hexgrid"), -- hexagonal +} ---@param layer detiled.map.layer ---@param map detiled.map ----@return decore.entities_pack_data.instance[] +---@return detiled.entity[] local function get_entities_from_tile_layer(layer, map) - ---@type decore.entities_pack_data.instance[] + ---@type detiled.entity[] local entities = {} - local grid_module = get_grid_module(map) + local grid_module = GRID_MODULES[map.orientation] local map_params = grid_module.get_map_params_from_tiled(map) local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 @@ -86,13 +73,14 @@ local function get_entities_from_tile_layer(layer, map) if scale_y ~= 1 then transform.scale_y = scale_y end if rotation ~= 0 then transform.rotation = rotation end - ---@type decore.entities_pack_data.instance - local entity = {} - entity.prefab_id = prefab_id - entity.components = { + ---@type detiled.entity + local entity = { prefab_id = prefab_id, - tiled_layer_id = layer.name, - transform = transform, + components = { + prefab_id = prefab_id, + tiled_layer_id = layer.name, + transform = transform, + } } table.insert(entities, entity) @@ -105,12 +93,12 @@ end ---@param layer detiled.map.layer ---@param map detiled.map ----@return decore.entities_pack_data.instance[] +---@return detiled.entity[] local function get_entities_from_object_layer(layer, map) - ---@type decore.entities_pack_data.instance[] + ---@type detiled.entity[] local entities = {} - local grid_module = get_grid_module(map) + local grid_module = GRID_MODULES[map.orientation] local map_params = grid_module.get_map_params_from_tiled(map) local map_width = map_params.scene.size_x @@ -286,9 +274,9 @@ end ---@param tiled_map detiled.map ----@return decore.entities_pack_data.instance[] +---@return detiled.entity[] function M.get_entities(tiled_map) - ---@type decore.entities_pack_data.instance[] + ---@type detiled.entity[] local entities = {} for layer_index = 1, #tiled_map.layers do @@ -399,64 +387,6 @@ function M.get_defold_position_from_tiled_object(object, tile, map_width, map_he end - ----@param tiled_map detiled.map ----@return decore.world.instance -function M.create_world_from_tiled_map(tiled_map) - return { entities = M.get_entities(tiled_map) } -end - - ----Split each layer to separate world, return as map of worlds ----@param world_id string ----@param tiled_map detiled.map ----@return table -function M.create_worlds_from_tiled_map(world_id, tiled_map) - local entities = M.get_entities(tiled_map) - local worlds = {} - local world_ids = {} - - for index = 1, #entities do - local entity = entities[index] - local layer_id = entity.components.layer_id - local subworld_id = world_id .. "." .. layer_id - - local world = worlds[subworld_id] or { - entities = {}, - included_worlds = {}, - } - worlds[subworld_id] = world - table.insert(world.entities, entity) - - if not M.is_layer_excluded(tiled_map, layer_id) then - world_ids[subworld_id] = true - end - end - - local main_world = worlds[world_id] or { - entities = {}, - included_worlds = {}, - } - worlds[world_id] = main_world - - for subworld_id in pairs(world_ids) do - table.insert(main_world.included_worlds, { - world_id = subworld_id, - }) - end - - return worlds -end - - ----@param tiled_tileset_path string ----@return table -function M.create_entities_from_tiled_tileset(tiled_tileset_path) - local tileset = M.load_tileset(tiled_tileset_path) - return M.get_decore_entities(tileset) -end - - ---@param tileset_path string ---@return detiled.tileset function M.load_tileset(tileset_path) From 8a3a82db69a5c6811355c11918e4bd424517bca6 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 23:50:29 +0200 Subject: [PATCH 23/71] Update --- detiled/internal/grid/hexgrid.lua | 52 ++++++- .../internal/grid/hexgrid_convertations.lua | 40 +++--- detiled/internal/grid/isogrid.lua | 5 - example/assets/appmanifest.appmanifest | 111 ++++++++++++++ example/assets/hexgrid/entities/tile_dirt.go | 3 + .../assets/hexgrid/entities/tile_dirt_2.go | 3 + .../assets/hexgrid/entities/tile_dirt_3.go | 3 + example/assets/hexgrid/entities/tile_grass.go | 3 + .../assets/hexgrid/entities/tile_grass_2.go | 3 + .../assets/hexgrid/entities/tile_grass_3.go | 3 + example/assets/hexgrid/entities/tile_sand.go | 3 + .../assets/hexgrid/entities/tile_sand_2.go | 3 + .../assets/hexgrid/entities/tile_sand_3.go | 3 + example/assets/hexgrid/entities/tile_stone.go | 3 + .../assets/hexgrid/entities/tile_stone_2.go | 3 + .../assets/hexgrid/entities/tile_stone_3.go | 3 + example/example_grid/example_grid.script | 3 +- .../example_hexgrid.collection | 2 +- .../example_hexgrid/example_hexgrid.script | 3 +- .../example_isogrid/example_isogrid.script | 3 +- game.project | 3 + tiled/detiled.tiled-session | 31 ++-- tiled/maps/hexgrid.json | 135 +++++++++++++++++- 23 files changed, 372 insertions(+), 52 deletions(-) create mode 100644 example/assets/appmanifest.appmanifest diff --git a/detiled/internal/grid/hexgrid.lua b/detiled/internal/grid/hexgrid.lua index 8816125..1d1545a 100644 --- a/detiled/internal/grid/hexgrid.lua +++ b/detiled/internal/grid/hexgrid.lua @@ -8,17 +8,59 @@ local HEXMAP_TYPE = { } -local function get_scene_size(map_params) - local data = map_params - +local function get_scene_size_pointytop(data) local double_size = data.tile.height + data.tile.side + local part_size = data.tile.height - data.tile.side - local width = (data.scene.tiles_x+0.5) * data.tile.width - local height = (data.scene.tiles_y/2 * double_size) + (data.tile.height-data.tile.side)/2 + local width = (data.scene.tiles_x + 0.5) * data.tile.width + local height = (data.scene.tiles_y / 2 * double_size) + 2 * part_size return width, height end +local function get_scene_size_flattop(data) + --[[ + width - 192 + height - 145 + side - 95 + + so two angles - 192 - 95 = 97 + one angle - 97 / 2 = 48.5 + width = (tile count * side) + (tile count * one angle) + one_angle + tile_count - 30 + width = (30 * 95) + (31 * 48.5) + (30 * 95) + (31 * 48.5) = 4353.5 + --]] + local tile_width = data.tile.width + local tile_height = data.tile.height + local tile_side = data.tile.side + local tile_angle = tile_width - tile_side - 1 + local tile_angle_half = tile_angle / 2 + + local tile_count_x = data.scene.tiles_x + local tile_count_y = data.scene.tiles_y + + local width = (tile_count_x * tile_side) + ((tile_count_x + 1) * tile_angle_half) + local height = (tile_count_y * tile_height) + tile_height/2 + + pprint(data) + pprint("get_scene_size_flattop", width, height) + + return width, height +end + + +local function get_scene_size(map_params) + local data = map_params + + if data.scene.hexmap_type == HEXMAP_TYPE.FLATTOP then + return get_scene_size_flattop(data) + else + return get_scene_size_pointytop(data) + end +end + + ---@param tiled_data detiled.map ---@return table function M.get_map_params_from_tiled(tiled_data) diff --git a/detiled/internal/grid/hexgrid_convertations.lua b/detiled/internal/grid/hexgrid_convertations.lua index c2fabb7..4fe7cb5 100644 --- a/detiled/internal/grid/hexgrid_convertations.lua +++ b/detiled/internal/grid/hexgrid_convertations.lua @@ -7,8 +7,8 @@ end function M.cell_to_pos_flattop(i, j, data) - local part_size = data.tile.width - data.tile.side - local two_hex_width = data.tile.width + data.tile.side + local part_size = data.tile.width - data.tile.side - 1 + local two_hex_width = data.tile.side * 2 + part_size local x = two_hex_width / 2 * i local y = data.tile.height * (j + 0.5 * (bit.band(i, 1))) @@ -24,41 +24,41 @@ function M.cell_to_pos_flattop(i, j, data) end -function M.cell_to_pos_pointytop(i, j, data) - local part_size = data.tile.height - data.tile.side - local two_hex_height = data.tile.height + data.tile.side +function M.pos_to_cell_flattop(x, y, map_params) + local data = map_params - local x = data.tile.width * (i + 0.5 * (bit.band(j, 1))) - local y = two_hex_height / 2 * j + local part_size = data.tile.width - data.tile.side - 1 + local two_hex_width = data.tile.side * 2 + part_size + + x = x - part_size + y = y - (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) if data.scene.invert_y then y = data.scene.size_y - y end - x = x + data.tile.width/2 - y = y + (data.scene.invert_y and -part_size or part_size) + local i = round(2 * x / two_hex_width) + local j = round(y / data.tile.height - 0.5 * bit.band(i, 1)) - return x, y + return i, j end -function M.pos_to_cell_flattop(x, y, map_params) - local data = map_params - - local part_size = data.tile.width - data.tile.side - local two_hex_width = data.tile.width + data.tile.side +function M.cell_to_pos_pointytop(i, j, data) + local part_size = data.tile.height - data.tile.side + local two_hex_height = data.tile.height + data.tile.side - x = x - part_size - y = y - (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) + local x = data.tile.width * (i + 0.5 * (bit.band(j, 1))) + local y = two_hex_height / 2 * j if data.scene.invert_y then y = data.scene.size_y - y end - local i = round(2 * x / two_hex_width) - local j = round(y / data.tile.height - 0.5 * bit.band(i, 1)) + x = x + data.tile.width/2 + y = y + (data.scene.invert_y and -part_size or part_size) - return i, j + return x, y end diff --git a/detiled/internal/grid/isogrid.lua b/detiled/internal/grid/isogrid.lua index 1000dbd..6df5394 100644 --- a/detiled/internal/grid/isogrid.lua +++ b/detiled/internal/grid/isogrid.lua @@ -1,11 +1,6 @@ local M = {} -local function round(x) - return math.floor(x + 0.5) -end - - local function get_scene_size(map_params) local data = map_params diff --git a/example/assets/appmanifest.appmanifest b/example/assets/appmanifest.appmanifest new file mode 100644 index 0000000..bab1337 --- /dev/null +++ b/example/assets/appmanifest.appmanifest @@ -0,0 +1,111 @@ +platforms: + armv7-ios: + context: + excludeLibs: [physics, box2d_defold, script_box2d_defold, gamesys_model, gamesys_rig, rig] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt] + symbols: [] + libs: [physics_3d, gamesys_rig_null, gamesys_model_null, rig_null] + frameworks: [] + linkFlags: [] + arm64-ios: + context: + excludeLibs: [physics, box2d_defold, script_box2d_defold, gamesys_model, gamesys_rig, rig] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt] + symbols: [] + libs: [physics_3d, gamesys_rig_null, gamesys_model_null, rig_null] + frameworks: [] + linkFlags: [] + x86_64-ios: + context: + excludeLibs: [physics, box2d_defold, script_box2d_defold, gamesys_model, gamesys_rig, rig] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt] + symbols: [] + libs: [physics_3d, gamesys_rig_null, gamesys_model_null, rig_null] + frameworks: [] + linkFlags: [] + armv7-android: + context: + excludeLibs: [physics, box2d_defold, script_box2d_defold, gamesys_model, gamesys_rig, rig] + excludeJars: [] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt] + symbols: [] + libs: [physics_3d, gamesys_rig_null, gamesys_model_null, rig_null] + linkFlags: [] + jetifier: true + arm64-android: + context: + excludeLibs: [physics, box2d_defold, script_box2d_defold, gamesys_model, gamesys_rig, rig] + excludeJars: [] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt] + symbols: [] + libs: [physics_3d, gamesys_rig_null, gamesys_model_null, rig_null] + linkFlags: [] + jetifier: true + arm64-osx: + context: + excludeLibs: [physics, box2d_defold, script_box2d_defold, gamesys_model, gamesys_rig, rig, graphics_vulkan, platform_vulkan, MoltenVK] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt, GraphicsAdapterVulkan] + symbols: [GraphicsAdapterOpenGL] + libs: [physics_3d, gamesys_rig_null, gamesys_model_null, rig_null, graphics, platform] + frameworks: [OpenGL] + linkFlags: [] + x86_64-osx: + context: + excludeLibs: [physics, box2d_defold, script_box2d_defold, gamesys_model, gamesys_rig, rig, graphics_vulkan, platform_vulkan, MoltenVK] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt, GraphicsAdapterVulkan] + symbols: [GraphicsAdapterOpenGL] + libs: [physics_3d, gamesys_rig_null, gamesys_model_null, rig_null, graphics, platform] + frameworks: [OpenGL] + linkFlags: [] + x86_64-linux: + context: + excludeLibs: [physics, box2d_defold, script_box2d_defold, gamesys_model, gamesys_rig, rig] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt] + symbols: [] + libs: [physics_3d, gamesys_rig_null, gamesys_model_null, rig_null] + linkFlags: [] + arm64-linux: + context: + excludeLibs: [physics, box2d_defold, script_box2d_defold, gamesys_model, gamesys_rig, rig] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt] + symbols: [] + libs: [physics_3d, gamesys_rig_null, gamesys_model_null, rig_null] + linkFlags: [] + x86-win32: + context: + excludeLibs: [libphysics, libbox2d_defold, libscript_box2d_defold, libgamesys_model, libgamesys_rig, librig] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt] + symbols: [] + libs: [libphysics_3d.lib, libgamesys_rig_null.lib, libgamesys_model_null.lib, librig_null.lib] + linkFlags: [] + x86_64-win32: + context: + excludeLibs: [libphysics, libbox2d_defold, libscript_box2d_defold, libgamesys_model, libgamesys_rig, librig] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt] + symbols: [] + libs: [libphysics_3d.lib, libgamesys_rig_null.lib, libgamesys_model_null.lib, librig_null.lib] + linkFlags: [] + js-web: + context: + excludeLibs: [physics, box2d_defold, script_box2d_defold, gamesys_model, gamesys_rig, rig] + excludeJsLibs: [] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt] + symbols: [] + libs: [physics_3d, gamesys_rig_null, gamesys_model_null, rig_null] + linkFlags: [] + wasm-web: + context: + excludeLibs: [physics, box2d_defold, script_box2d_defold, gamesys_model, gamesys_rig, rig] + excludeJsLibs: [] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt] + symbols: [] + libs: [physics_3d, gamesys_rig_null, gamesys_model_null, rig_null] + linkFlags: [] + wasm_pthread-web: + context: + excludeLibs: [physics, box2d_defold, script_box2d_defold, gamesys_model, gamesys_rig, rig] + excludeJsLibs: [] + excludeSymbols: [ScriptBox2DExt, ScriptModelExt] + symbols: [] + libs: [physics_3d, gamesys_rig_null, gamesys_model_null, rig_null] + linkFlags: [] diff --git a/example/assets/hexgrid/entities/tile_dirt.go b/example/assets/hexgrid/entities/tile_dirt.go index 3d667ca..eb2c2c1 100644 --- a/example/assets/hexgrid/entities/tile_dirt.go +++ b/example/assets/hexgrid/entities/tile_dirt.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" + position { + y: 22.0 + } } diff --git a/example/assets/hexgrid/entities/tile_dirt_2.go b/example/assets/hexgrid/entities/tile_dirt_2.go index 964bae3..e940244 100644 --- a/example/assets/hexgrid/entities/tile_dirt_2.go +++ b/example/assets/hexgrid/entities/tile_dirt_2.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" + position { + y: 22.0 + } } diff --git a/example/assets/hexgrid/entities/tile_dirt_3.go b/example/assets/hexgrid/entities/tile_dirt_3.go index b518e0f..286c8dc 100644 --- a/example/assets/hexgrid/entities/tile_dirt_3.go +++ b/example/assets/hexgrid/entities/tile_dirt_3.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" + position { + y: 22.0 + } } diff --git a/example/assets/hexgrid/entities/tile_grass.go b/example/assets/hexgrid/entities/tile_grass.go index ef89027..08ec421 100644 --- a/example/assets/hexgrid/entities/tile_grass.go +++ b/example/assets/hexgrid/entities/tile_grass.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" + position { + y: 22.0 + } } diff --git a/example/assets/hexgrid/entities/tile_grass_2.go b/example/assets/hexgrid/entities/tile_grass_2.go index 92a7403..0b7596f 100644 --- a/example/assets/hexgrid/entities/tile_grass_2.go +++ b/example/assets/hexgrid/entities/tile_grass_2.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" + position { + y: 22.0 + } } diff --git a/example/assets/hexgrid/entities/tile_grass_3.go b/example/assets/hexgrid/entities/tile_grass_3.go index 73e414b..4018bc6 100644 --- a/example/assets/hexgrid/entities/tile_grass_3.go +++ b/example/assets/hexgrid/entities/tile_grass_3.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" + position { + y: 22.0 + } } diff --git a/example/assets/hexgrid/entities/tile_sand.go b/example/assets/hexgrid/entities/tile_sand.go index 9886f8c..8ee19bc 100644 --- a/example/assets/hexgrid/entities/tile_sand.go +++ b/example/assets/hexgrid/entities/tile_sand.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" + position { + y: 22.0 + } } diff --git a/example/assets/hexgrid/entities/tile_sand_2.go b/example/assets/hexgrid/entities/tile_sand_2.go index dbf6acf..3665c9b 100644 --- a/example/assets/hexgrid/entities/tile_sand_2.go +++ b/example/assets/hexgrid/entities/tile_sand_2.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" + position { + y: 22.0 + } } diff --git a/example/assets/hexgrid/entities/tile_sand_3.go b/example/assets/hexgrid/entities/tile_sand_3.go index 59886bd..db46c56 100644 --- a/example/assets/hexgrid/entities/tile_sand_3.go +++ b/example/assets/hexgrid/entities/tile_sand_3.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" + position { + y: 22.0 + } } diff --git a/example/assets/hexgrid/entities/tile_stone.go b/example/assets/hexgrid/entities/tile_stone.go index 778a4f2..bab9ba8 100644 --- a/example/assets/hexgrid/entities/tile_stone.go +++ b/example/assets/hexgrid/entities/tile_stone.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" + position { + y: 22.0 + } } diff --git a/example/assets/hexgrid/entities/tile_stone_2.go b/example/assets/hexgrid/entities/tile_stone_2.go index c16467b..907c2cb 100644 --- a/example/assets/hexgrid/entities/tile_stone_2.go +++ b/example/assets/hexgrid/entities/tile_stone_2.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" + position { + y: 22.0 + } } diff --git a/example/assets/hexgrid/entities/tile_stone_3.go b/example/assets/hexgrid/entities/tile_stone_3.go index f50c7c1..d20c911 100644 --- a/example/assets/hexgrid/entities/tile_stone_3.go +++ b/example/assets/hexgrid/entities/tile_stone_3.go @@ -8,4 +8,7 @@ embedded_components { " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" "}\n" "" + position { + y: 22.0 + } } diff --git a/example/example_grid/example_grid.script b/example/example_grid/example_grid.script index d1c7e61..c5731de 100644 --- a/example/example_grid/example_grid.script +++ b/example/example_grid/example_grid.script @@ -18,8 +18,7 @@ local function spawn_entity(entity) end -local function spawn_map(map) - local entities = map.child_instancies +local function spawn_map(entities) for _, entity in ipairs(entities) do spawn_entity(entity) end diff --git a/example/example_hexgrid/example_hexgrid.collection b/example/example_hexgrid/example_hexgrid.collection index 7bb3c1b..1682492 100644 --- a/example/example_hexgrid/example_hexgrid.collection +++ b/example/example_hexgrid/example_hexgrid.collection @@ -19,7 +19,7 @@ embedded_instances { " component: \"/example/assets/camera_wasd_control.script\"\n" " properties {\n" " id: \"movement_speed\"\n" - " value: \"600.0\"\n" + " value: \"1000.0\"\n" " type: PROPERTY_TYPE_NUMBER\n" " }\n" " properties {\n" diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index 5e40355..6f4c7b9 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -21,8 +21,7 @@ local function spawn_entity(entity) end -local function spawn_map(map) - local entities = map.child_instancies +local function spawn_map(entities) for _, entity in ipairs(entities) do spawn_entity(entity) end diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index 8eb1a9a..2d92280 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -27,8 +27,7 @@ local function spawn_entity(entity) end -local function spawn_map(map) - local entities = map.child_instancies +local function spawn_map(entities) for _, entity in ipairs(entities) do spawn_entity(entity) end diff --git a/game.project b/game.project index 4ef09bf..61cc479 100644 --- a/game.project +++ b/game.project @@ -34,3 +34,6 @@ default_texture_mag_filter = nearest [sprite] max_count = 1024 +[native_extension] +app_manifest = /example/assets/appmanifest.appmanifest + diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session index 329ca33..7b2c9ec 100644 --- a/tiled/detiled.tiled-session +++ b/tiled/detiled.tiled-session @@ -3,11 +3,11 @@ "height": 4300, "width": 2 }, - "activeFile": "maps/isogrid.json", + "activeFile": "maps/hexgrid.json", "expandedProjectPaths": [ "tilesets", - "maps", - "." + ".", + "maps" ], "fileStates": { ":/automap-tiles.tsx": { @@ -35,14 +35,17 @@ "expandedObjectLayers": [ 2 ], - "scale": 0.6611, + "scale": 0.2213, "selectedLayer": 1, "viewCenter": { - "x": 2169.1120859174102, - "y": 1475.5710180003025 + "x": 702.66606416629, + "y": 1854.9480343425216 } }, "maps/isogrid.json": { + "expandedObjectLayers": [ + 2 + ], "scale": 0.4068, "selectedLayer": 1, "viewCenter": { @@ -53,7 +56,7 @@ "tilesets/grid_items.json": { "dynamicWrapping": true, "scaleInDock": 3.0191, - "scaleInEditor": 0.73 + "scaleInEditor": 0.21 }, "tilesets/grid_items.tsj": { "dynamicWrapping": true, @@ -66,7 +69,7 @@ "tilesets/grid_tileset.json": { "dynamicWrapping": false, "scaleInDock": 2.4562, - "scaleInEditor": 0.73 + "scaleInEditor": 0.21 }, "tilesets/grid_tileset.json.tsj": { "scaleInDock": 1, @@ -80,17 +83,17 @@ "tilesets/hexgrid_objects.json": { "dynamicWrapping": true, "scaleInDock": 1, - "scaleInEditor": 0.73 + "scaleInEditor": 0.21 }, "tilesets/hexgrid_tiles.json": { "dynamicWrapping": true, "scaleInDock": 0.3806, - "scaleInEditor": 0.73 + "scaleInEditor": 0.21 }, "tilesets/isogrid_tileset.json": { "dynamicWrapping": true, "scaleInDock": 0.5024, - "scaleInEditor": 0.73 + "scaleInEditor": 0.21 } }, "last.exportedFilePath": "/Users/insality/code/defold/detiled/tiled/export", @@ -117,11 +120,11 @@ "tilesets/grid_tileset.json", "tilesets/grid_items.json", "maps/grid.json", - "maps/hexgrid.json", - "tilesets/hexgrid_tiles.json", - "tilesets/hexgrid_objects.json", "tilesets/isogrid_tileset.json", "maps/isogrid.json", + "tilesets/hexgrid_objects.json", + "tilesets/hexgrid_tiles.json", + "maps/hexgrid.json", ":/automap-tiles.tsx", "maps/grid.json.tmj", "tilesets/grid_tileset.tsx", diff --git a/tiled/maps/hexgrid.json b/tiled/maps/hexgrid.json index 549ccb0..a05ab91 100644 --- a/tiled/maps/hexgrid.json +++ b/tiled/maps/hexgrid.json @@ -332,6 +332,139 @@ "width":235, "x":2258.36127086501, "y":2283.24795176917 + }, + { + "gid":13, + "height":264, + "id":29, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":-95, + "y":2952 + }, + { + "gid":13, + "height":264, + "id":30, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":48, + "y":2880 + }, + { + "gid":13, + "height":264, + "id":31, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":191, + "y":2808 + }, + { + "gid":13, + "height":264, + "id":32, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":334, + "y":2736 + }, + { + "gid":13, + "height":264, + "id":33, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":477, + "y":2664 + }, + { + "gid":13, + "height":264, + "id":34, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":620, + "y":2592 + }, + + { + "gid":13, + "height":264, + "id":35, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":763, + "y":2520 + }, + { + "gid":13, + "height":264, + "id":36, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":906, + "y":2448 + }, + { + "gid":13, + "height":264, + "id":37, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":1049, + "y":2376 + }, + { + "gid":13, + "height":264, + "id":38, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":1192, + "y":2304 + }, + { + "gid":13, + "height":264, + "id":39, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":1335, + "y":2232 }], "opacity":1, "type":"objectgroup", @@ -340,7 +473,7 @@ "y":0 }], "nextlayerid":3, - "nextobjectid":29, + "nextobjectid":40, "orientation":"hexagonal", "renderorder":"right-down", "staggeraxis":"x", From 9e537ad5a3ee3cab38752d94603416e2c70da751 Mon Sep 17 00:00:00 2001 From: Insality Date: Sat, 14 Feb 2026 23:55:44 +0200 Subject: [PATCH 24/71] Update --- detiled/internal/grid/hexgrid.lua | 15 --------------- example/assets/hexgrid/entities/r_tree_round.go | 4 ++-- example/assets/hexgrid/entities/r_tree_round_2.go | 4 ++-- tiled/detiled.tiled-session | 12 ++++++------ tiled/tilesets/hexgrid_objects.json | 5 ++--- 5 files changed, 12 insertions(+), 28 deletions(-) diff --git a/detiled/internal/grid/hexgrid.lua b/detiled/internal/grid/hexgrid.lua index 1d1545a..9bcb967 100644 --- a/detiled/internal/grid/hexgrid.lua +++ b/detiled/internal/grid/hexgrid.lua @@ -19,18 +19,6 @@ end local function get_scene_size_flattop(data) - --[[ - width - 192 - height - 145 - side - 95 - - so two angles - 192 - 95 = 97 - one angle - 97 / 2 = 48.5 - width = (tile count * side) + (tile count * one angle) + one_angle - tile_count - 30 - width = (30 * 95) + (31 * 48.5) - (30 * 95) + (31 * 48.5) = 4353.5 - --]] local tile_width = data.tile.width local tile_height = data.tile.height local tile_side = data.tile.side @@ -43,9 +31,6 @@ local function get_scene_size_flattop(data) local width = (tile_count_x * tile_side) + ((tile_count_x + 1) * tile_angle_half) local height = (tile_count_y * tile_height) + tile_height/2 - pprint(data) - pprint("get_scene_size_flattop", width, height) - return width, height end diff --git a/example/assets/hexgrid/entities/r_tree_round.go b/example/assets/hexgrid/entities/r_tree_round.go index c1d88f6..f4df1e8 100644 --- a/example/assets/hexgrid/entities/r_tree_round.go +++ b/example/assets/hexgrid/entities/r_tree_round.go @@ -9,7 +9,7 @@ embedded_components { "}\n" "" position { - x: 5.0 - y: 89.0 + x: 5.5 + y: 88.5 } } diff --git a/example/assets/hexgrid/entities/r_tree_round_2.go b/example/assets/hexgrid/entities/r_tree_round_2.go index 210b291..a8e432e 100644 --- a/example/assets/hexgrid/entities/r_tree_round_2.go +++ b/example/assets/hexgrid/entities/r_tree_round_2.go @@ -9,7 +9,7 @@ embedded_components { "}\n" "" position { - x: -7.0 - y: 108.0 + x: -6.5 + y: 107.0 } } diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session index 7b2c9ec..3db700e 100644 --- a/tiled/detiled.tiled-session +++ b/tiled/detiled.tiled-session @@ -19,8 +19,8 @@ "scale": 9.05, "selectedLayer": 3, "viewCenter": { - "x": 453.09392265193367, - "y": 316.7403314917127 + "x": 240, + "y": 160 } }, "maps/grid.json.tmj": { @@ -38,8 +38,8 @@ "scale": 0.2213, "selectedLayer": 1, "viewCenter": { - "x": 702.66606416629, - "y": 1854.9480343425216 + "x": 2169.001355625847, + "y": 1477.6321735201086 } }, "maps/isogrid.json": { @@ -49,8 +49,8 @@ "scale": 0.4068, "selectedLayer": 1, "viewCenter": { - "x": 888.6430678466078, - "y": 669.8623402163225 + "x": 1199.60668633235, + "y": 599.803343166175 } }, "tilesets/grid_items.json": { diff --git a/tiled/tilesets/hexgrid_objects.json b/tiled/tilesets/hexgrid_objects.json index c0bbfe9..cdf8e8d 100644 --- a/tiled/tilesets/hexgrid_objects.json +++ b/tiled/tilesets/hexgrid_objects.json @@ -32,8 +32,8 @@ "type":"", "visible":true, "width":0, - "x":124.286120901539, - "y":240.011161789195 + "x":124.330714586181, + "y":238.896319673135 }], "opacity":1, "type":"objectgroup", @@ -50,7 +50,6 @@ "objectgroup": { "draworder":"index", - "id":2, "name":"", "objects":[ { From d1e7af89d2343c3cdbfc1d8eb7f819f146d3ddb8 Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 00:14:15 +0200 Subject: [PATCH 25/71] Update --- detiled/internal/grid/hexgrid.lua | 6 +++--- detiled/internal/grid/hexgrid_convertations.lua | 4 ++-- example/assets/hexgrid/entities/r_tree_round_2.go | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/detiled/internal/grid/hexgrid.lua b/detiled/internal/grid/hexgrid.lua index 9bcb967..9eb37a3 100644 --- a/detiled/internal/grid/hexgrid.lua +++ b/detiled/internal/grid/hexgrid.lua @@ -22,7 +22,7 @@ local function get_scene_size_flattop(data) local tile_width = data.tile.width local tile_height = data.tile.height local tile_side = data.tile.side - local tile_angle = tile_width - tile_side - 1 + local tile_angle = tile_width - tile_side local tile_angle_half = tile_angle / 2 local tile_count_x = data.scene.tiles_x @@ -56,8 +56,8 @@ function M.get_map_params_from_tiled(tiled_data) local map_params = {} map_params.tile = { - width = tiled_data.tilewidth, - height = tiled_data.tileheight, + width = tiled_data.tilewidth - 1, + height = tiled_data.tileheight - 1, side = tiled_data.hexsidelength or 0, } map_params.scene = { diff --git a/detiled/internal/grid/hexgrid_convertations.lua b/detiled/internal/grid/hexgrid_convertations.lua index 4fe7cb5..3c62dcf 100644 --- a/detiled/internal/grid/hexgrid_convertations.lua +++ b/detiled/internal/grid/hexgrid_convertations.lua @@ -7,7 +7,7 @@ end function M.cell_to_pos_flattop(i, j, data) - local part_size = data.tile.width - data.tile.side - 1 + local part_size = data.tile.width - data.tile.side local two_hex_width = data.tile.side * 2 + part_size local x = two_hex_width / 2 * i @@ -27,7 +27,7 @@ end function M.pos_to_cell_flattop(x, y, map_params) local data = map_params - local part_size = data.tile.width - data.tile.side - 1 + local part_size = data.tile.width - data.tile.side local two_hex_width = data.tile.side * 2 + part_size x = x - part_size diff --git a/example/assets/hexgrid/entities/r_tree_round_2.go b/example/assets/hexgrid/entities/r_tree_round_2.go index a8e432e..c8d5aaa 100644 --- a/example/assets/hexgrid/entities/r_tree_round_2.go +++ b/example/assets/hexgrid/entities/r_tree_round_2.go @@ -9,7 +9,7 @@ embedded_components { "}\n" "" position { - x: -6.5 + x: -7.0 y: 107.0 } } From c5b98dffe99a3a07a2c3d84bd440cdf87387d306 Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 00:27:32 +0200 Subject: [PATCH 26/71] hex pointy top --- example/assets/hexgrid_pointy/entities.go | 132 +++++++++++++++++ .../hexgrid_pointy/entities/tileAutumn.go | 14 ++ .../entities/tileAutumn_full.go | 14 ++ .../hexgrid_pointy/entities/tileDirt.go | 14 ++ .../hexgrid_pointy/entities/tileDirt_full.go | 14 ++ .../hexgrid_pointy/entities/tileGrass.go | 14 ++ .../hexgrid_pointy/entities/tileGrass_full.go | 14 ++ .../hexgrid_pointy/entities/tileLava.go | 14 ++ .../hexgrid_pointy/entities/tileLava_full.go | 14 ++ .../hexgrid_pointy/entities/tileMagic.go | 14 ++ .../hexgrid_pointy/entities/tileMagic_full.go | 14 ++ .../hexgrid_pointy/entities/tileRock.go | 14 ++ .../hexgrid_pointy/entities/tileRock_full.go | 14 ++ .../hexgrid_pointy/entities/tileSand.go | 14 ++ .../hexgrid_pointy/entities/tileSand_full.go | 14 ++ .../hexgrid_pointy/entities/tileSnow.go | 14 ++ .../hexgrid_pointy/entities/tileStone.go | 14 ++ .../hexgrid_pointy/entities/tileStone_full.go | 14 ++ .../hexgrid_pointy/entities/tileWater.go | 14 ++ .../hexgrid_pointy/entities/tileWater_full.go | 14 ++ .../entities/tileWater_shadow.go | 14 ++ .../hexgrid_pointy/hexgrid_pointy_tiles.atlas | 61 ++++++++ .../example_hexgrid_pointy.collection | 78 ++++++++++ .../example_hexgrid_pointy.script | 37 +++++ game.project | 2 +- tiled/assets/hexgrid_pointy/tileAutumn.png | Bin 0 -> 2194 bytes .../assets/hexgrid_pointy/tileAutumn_full.png | Bin 0 -> 1632 bytes tiled/assets/hexgrid_pointy/tileDirt.png | Bin 0 -> 2012 bytes tiled/assets/hexgrid_pointy/tileDirt_full.png | Bin 0 -> 1616 bytes tiled/assets/hexgrid_pointy/tileGrass.png | Bin 0 -> 2220 bytes .../assets/hexgrid_pointy/tileGrass_full.png | Bin 0 -> 1621 bytes tiled/assets/hexgrid_pointy/tileLava.png | Bin 0 -> 1967 bytes tiled/assets/hexgrid_pointy/tileLava_full.png | Bin 0 -> 1607 bytes tiled/assets/hexgrid_pointy/tileMagic.png | Bin 0 -> 2143 bytes .../assets/hexgrid_pointy/tileMagic_full.png | Bin 0 -> 1609 bytes tiled/assets/hexgrid_pointy/tileRock.png | Bin 0 -> 1721 bytes tiled/assets/hexgrid_pointy/tileRock_full.png | Bin 0 -> 1602 bytes tiled/assets/hexgrid_pointy/tileSand.png | Bin 0 -> 1946 bytes tiled/assets/hexgrid_pointy/tileSand_full.png | Bin 0 -> 1612 bytes tiled/assets/hexgrid_pointy/tileSnow.png | Bin 0 -> 1904 bytes tiled/assets/hexgrid_pointy/tileStone.png | Bin 0 -> 1698 bytes .../assets/hexgrid_pointy/tileStone_full.png | Bin 0 -> 1600 bytes tiled/assets/hexgrid_pointy/tileWater.png | Bin 0 -> 1932 bytes .../assets/hexgrid_pointy/tileWater_full.png | Bin 0 -> 1597 bytes .../hexgrid_pointy/tileWater_shadow.png | Bin 0 -> 1556 bytes tiled/detiled.tiled-session | 17 ++- tiled/maps/hexgrid_pointy.json | 103 +++++++++++++ tiled/tilesets/hexgrid_pointy.json | 138 ++++++++++++++++++ 48 files changed, 843 insertions(+), 5 deletions(-) create mode 100644 example/assets/hexgrid_pointy/entities.go create mode 100644 example/assets/hexgrid_pointy/entities/tileAutumn.go create mode 100644 example/assets/hexgrid_pointy/entities/tileAutumn_full.go create mode 100644 example/assets/hexgrid_pointy/entities/tileDirt.go create mode 100644 example/assets/hexgrid_pointy/entities/tileDirt_full.go create mode 100644 example/assets/hexgrid_pointy/entities/tileGrass.go create mode 100644 example/assets/hexgrid_pointy/entities/tileGrass_full.go create mode 100644 example/assets/hexgrid_pointy/entities/tileLava.go create mode 100644 example/assets/hexgrid_pointy/entities/tileLava_full.go create mode 100644 example/assets/hexgrid_pointy/entities/tileMagic.go create mode 100644 example/assets/hexgrid_pointy/entities/tileMagic_full.go create mode 100644 example/assets/hexgrid_pointy/entities/tileRock.go create mode 100644 example/assets/hexgrid_pointy/entities/tileRock_full.go create mode 100644 example/assets/hexgrid_pointy/entities/tileSand.go create mode 100644 example/assets/hexgrid_pointy/entities/tileSand_full.go create mode 100644 example/assets/hexgrid_pointy/entities/tileSnow.go create mode 100644 example/assets/hexgrid_pointy/entities/tileStone.go create mode 100644 example/assets/hexgrid_pointy/entities/tileStone_full.go create mode 100644 example/assets/hexgrid_pointy/entities/tileWater.go create mode 100644 example/assets/hexgrid_pointy/entities/tileWater_full.go create mode 100644 example/assets/hexgrid_pointy/entities/tileWater_shadow.go create mode 100644 example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas create mode 100644 example/example_hexgrid_pointy/example_hexgrid_pointy.collection create mode 100644 example/example_hexgrid_pointy/example_hexgrid_pointy.script create mode 100644 tiled/assets/hexgrid_pointy/tileAutumn.png create mode 100644 tiled/assets/hexgrid_pointy/tileAutumn_full.png create mode 100644 tiled/assets/hexgrid_pointy/tileDirt.png create mode 100644 tiled/assets/hexgrid_pointy/tileDirt_full.png create mode 100644 tiled/assets/hexgrid_pointy/tileGrass.png create mode 100644 tiled/assets/hexgrid_pointy/tileGrass_full.png create mode 100644 tiled/assets/hexgrid_pointy/tileLava.png create mode 100644 tiled/assets/hexgrid_pointy/tileLava_full.png create mode 100644 tiled/assets/hexgrid_pointy/tileMagic.png create mode 100644 tiled/assets/hexgrid_pointy/tileMagic_full.png create mode 100644 tiled/assets/hexgrid_pointy/tileRock.png create mode 100644 tiled/assets/hexgrid_pointy/tileRock_full.png create mode 100644 tiled/assets/hexgrid_pointy/tileSand.png create mode 100644 tiled/assets/hexgrid_pointy/tileSand_full.png create mode 100644 tiled/assets/hexgrid_pointy/tileSnow.png create mode 100644 tiled/assets/hexgrid_pointy/tileStone.png create mode 100644 tiled/assets/hexgrid_pointy/tileStone_full.png create mode 100644 tiled/assets/hexgrid_pointy/tileWater.png create mode 100644 tiled/assets/hexgrid_pointy/tileWater_full.png create mode 100644 tiled/assets/hexgrid_pointy/tileWater_shadow.png create mode 100644 tiled/maps/hexgrid_pointy.json create mode 100644 tiled/tilesets/hexgrid_pointy.json diff --git a/example/assets/hexgrid_pointy/entities.go b/example/assets/hexgrid_pointy/entities.go new file mode 100644 index 0000000..81e4fa5 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities.go @@ -0,0 +1,132 @@ +embedded_components { + id: "tileAutumn_full" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileAutumn_full.go\"\n" + "" +} +embedded_components { + id: "tileAutumn" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileAutumn.go\"\n" + "" +} +embedded_components { + id: "tileDirt_full" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileDirt_full.go\"\n" + "" +} +embedded_components { + id: "tileDirt" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileDirt.go\"\n" + "" +} +embedded_components { + id: "tileGrass_full" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileGrass_full.go\"\n" + "" +} +embedded_components { + id: "tileGrass" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileGrass.go\"\n" + "" +} +embedded_components { + id: "tileLava_full" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileLava_full.go\"\n" + "" +} +embedded_components { + id: "tileLava" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileLava.go\"\n" + "" +} +embedded_components { + id: "tileMagic_full" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileMagic_full.go\"\n" + "" +} +embedded_components { + id: "tileMagic" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileMagic.go\"\n" + "" +} +embedded_components { + id: "tileRock_full" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileRock_full.go\"\n" + "" +} +embedded_components { + id: "tileRock" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileRock.go\"\n" + "" +} +embedded_components { + id: "tileSand_full" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileSand_full.go\"\n" + "" +} +embedded_components { + id: "tileSand" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileSand.go\"\n" + "" +} +embedded_components { + id: "tileSnow" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileSnow.go\"\n" + "" +} +embedded_components { + id: "tileStone_full" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileStone_full.go\"\n" + "" +} +embedded_components { + id: "tileStone" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileStone.go\"\n" + "" +} +embedded_components { + id: "tileWater_full" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileWater_full.go\"\n" + "" +} +embedded_components { + id: "tileWater_shadow" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileWater_shadow.go\"\n" + "" +} +embedded_components { + id: "tileWater" + type: "factory" + data: "prototype: \"/example/assets/hexgrid_pointy/entities/tileWater.go\"\n" + "" +} +embedded_components { + id: "r_tree_round" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/r_tree_round.go\"\n" + "" +} +embedded_components { + id: "r_tree_round_2" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/r_tree_round_2.go\"\n" + "" +} diff --git a/example/assets/hexgrid_pointy/entities/tileAutumn.go b/example/assets/hexgrid_pointy/entities/tileAutumn.go new file mode 100644 index 0000000..96f6cf4 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileAutumn.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileAutumn\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileAutumn_full.go b/example/assets/hexgrid_pointy/entities/tileAutumn_full.go new file mode 100644 index 0000000..26985dd --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileAutumn_full.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileAutumn_full\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileDirt.go b/example/assets/hexgrid_pointy/entities/tileDirt.go new file mode 100644 index 0000000..9928312 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileDirt.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileDirt\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileDirt_full.go b/example/assets/hexgrid_pointy/entities/tileDirt_full.go new file mode 100644 index 0000000..24b8994 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileDirt_full.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileDirt_full\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileGrass.go b/example/assets/hexgrid_pointy/entities/tileGrass.go new file mode 100644 index 0000000..0f79f51 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileGrass.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileGrass\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileGrass_full.go b/example/assets/hexgrid_pointy/entities/tileGrass_full.go new file mode 100644 index 0000000..ef09039 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileGrass_full.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileGrass_full\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileLava.go b/example/assets/hexgrid_pointy/entities/tileLava.go new file mode 100644 index 0000000..c754db1 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileLava.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileLava\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileLava_full.go b/example/assets/hexgrid_pointy/entities/tileLava_full.go new file mode 100644 index 0000000..900be63 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileLava_full.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileLava_full\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileMagic.go b/example/assets/hexgrid_pointy/entities/tileMagic.go new file mode 100644 index 0000000..c0a4961 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileMagic.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileMagic\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileMagic_full.go b/example/assets/hexgrid_pointy/entities/tileMagic_full.go new file mode 100644 index 0000000..d4cbfdd --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileMagic_full.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileMagic_full\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileRock.go b/example/assets/hexgrid_pointy/entities/tileRock.go new file mode 100644 index 0000000..95e12d1 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileRock.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileRock\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileRock_full.go b/example/assets/hexgrid_pointy/entities/tileRock_full.go new file mode 100644 index 0000000..5282775 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileRock_full.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileRock_full\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileSand.go b/example/assets/hexgrid_pointy/entities/tileSand.go new file mode 100644 index 0000000..7c67a98 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileSand.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileSand\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileSand_full.go b/example/assets/hexgrid_pointy/entities/tileSand_full.go new file mode 100644 index 0000000..ff20156 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileSand_full.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileSand_full\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileSnow.go b/example/assets/hexgrid_pointy/entities/tileSnow.go new file mode 100644 index 0000000..c727776 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileSnow.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileSnow\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileStone.go b/example/assets/hexgrid_pointy/entities/tileStone.go new file mode 100644 index 0000000..45785db --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileStone.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileStone\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileStone_full.go b/example/assets/hexgrid_pointy/entities/tileStone_full.go new file mode 100644 index 0000000..2d8f05a --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileStone_full.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileStone_full\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileWater.go b/example/assets/hexgrid_pointy/entities/tileWater.go new file mode 100644 index 0000000..c2ab5de --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileWater.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileWater\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileWater_full.go b/example/assets/hexgrid_pointy/entities/tileWater_full.go new file mode 100644 index 0000000..b3b5ac2 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileWater_full.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileWater_full\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/entities/tileWater_shadow.go b/example/assets/hexgrid_pointy/entities/tileWater_shadow.go new file mode 100644 index 0000000..36a0ce3 --- /dev/null +++ b/example/assets/hexgrid_pointy/entities/tileWater_shadow.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tileWater_shadow\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas\"\n" + "}\n" + "" + position { + y: 44.0 + } +} diff --git a/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas b/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas new file mode 100644 index 0000000..43901d6 --- /dev/null +++ b/example/assets/hexgrid_pointy/hexgrid_pointy_tiles.atlas @@ -0,0 +1,61 @@ +images { + image: "/tiled/assets/hexgrid_pointy/tileAutumn_full.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileAutumn.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileDirt_full.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileDirt.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileGrass_full.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileGrass.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileLava_full.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileLava.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileMagic_full.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileMagic.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileRock_full.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileRock.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileSand_full.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileSand.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileSnow.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileStone_full.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileStone.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileWater_full.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileWater_shadow.png" +} +images { + image: "/tiled/assets/hexgrid_pointy/tileWater.png" +} +extrude_borders: 2 diff --git a/example/example_hexgrid_pointy/example_hexgrid_pointy.collection b/example/example_hexgrid_pointy/example_hexgrid_pointy.collection new file mode 100644 index 0000000..9a6f352 --- /dev/null +++ b/example/example_hexgrid_pointy/example_hexgrid_pointy.collection @@ -0,0 +1,78 @@ +name: "example_hexgrid_pointy" +instances { + id: "entities" + prototype: "/example/assets/hexgrid_pointy/entities.go" +} +scale_along_z: 0 +embedded_instances { + id: "go" + data: "components {\n" + " id: \"example_hexgrid_pointy\"\n" + " component: \"/example/example_hexgrid_pointy/example_hexgrid_pointy.script\"\n" + "}\n" + "" +} +embedded_instances { + id: "camera" + data: "components {\n" + " id: \"camera_wasd_control\"\n" + " component: \"/example/assets/camera_wasd_control.script\"\n" + " properties {\n" + " id: \"movement_speed\"\n" + " value: \"1000.0\"\n" + " type: PROPERTY_TYPE_NUMBER\n" + " }\n" + " properties {\n" + " id: \"zoom_speed\"\n" + " value: \"2.0\"\n" + " type: PROPERTY_TYPE_NUMBER\n" + " }\n" + "}\n" + "embedded_components {\n" + " id: \"camera\"\n" + " type: \"camera\"\n" + " data: \"aspect_ratio: 1.0\\n" + "fov: 0.7854\\n" + "near_z: -100.0\\n" + "far_z: 1000.0\\n" + "orthographic_projection: 1\\n" + "\"\n" + "}\n" + "" + position { + x: 480.0 + y: 320.0 + z: -10.0 + } +} +embedded_instances { + id: "background" + data: "embedded_components {\n" + " id: \"sprite\"\n" + " type: \"sprite\"\n" + " data: \"default_animation: \\\"pixel\\\"\\n" + "material: \\\"/builtins/materials/sprite.material\\\"\\n" + "slice9 {\\n" + " x: 2.0\\n" + " y: 2.0\\n" + " z: 2.0\\n" + " w: 2.0\\n" + "}\\n" + "size {\\n" + " x: 1952.0\\n" + " y: 1040.0\\n" + "}\\n" + "size_mode: SIZE_MODE_MANUAL\\n" + "textures {\\n" + " sampler: \\\"texture_sampler\\\"\\n" + " texture: \\\"/druid/druid.atlas\\\"\\n" + "}\\n" + "\"\n" + " position {\n" + " x: 976.0\n" + " y: 520.0\n" + " z: -4.0\n" + " }\n" + "}\n" + "" +} diff --git a/example/example_hexgrid_pointy/example_hexgrid_pointy.script b/example/example_hexgrid_pointy/example_hexgrid_pointy.script new file mode 100644 index 0000000..c1a1822 --- /dev/null +++ b/example/example_hexgrid_pointy/example_hexgrid_pointy.script @@ -0,0 +1,37 @@ +local detiled = require("detiled.detiled") + +local function get_z_position(position_x, position_y) + return -position_y / 10000 + position_x / 100000 +end + +local function spawn_entity(entity) + local prefab_id = entity.prefab_id + local components = entity.components + local transform = components.transform + local position_x = transform.position_x + local position_y = transform.position_y + local position_z = transform.position_z + get_z_position(position_x, position_y) + local scale_x = transform.scale_x or 1 + local scale_y = transform.scale_y or 1 + + local factory_url = "/entities#" .. prefab_id + local position = vmath.vector3(position_x, position_y, position_z) + local scale = vmath.vector3(scale_x, scale_y, 1) + factory.create(factory_url, position, nil, nil, scale) +end + + +local function spawn_map(entities) + for _, entity in ipairs(entities) do + spawn_entity(entity) + end +end + + +function init(self) + detiled.load_tileset("/tiled/tilesets/hexgrid_tiles.json") + detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") + detiled.load_tileset("/tiled/tilesets/hexgrid_pointy.json") + local map = detiled.get_entity_from_map("/tiled/maps/hexgrid_pointy.json") + spawn_map(map) +end diff --git a/game.project b/game.project index 61cc479..5b3d757 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example_hexgrid/example_hexgrid.collectionc +main_collection = /example/example_hexgrid_pointy/example_hexgrid_pointy.collectionc [script] shared_state = 1 diff --git a/tiled/assets/hexgrid_pointy/tileAutumn.png b/tiled/assets/hexgrid_pointy/tileAutumn.png new file mode 100644 index 0000000000000000000000000000000000000000..943a27728a838ce7925959169bfc603b57863158 GIT binary patch literal 2194 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 IbxsLQ0G&!==l}o! literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid_pointy/tileDirt.png b/tiled/assets/hexgrid_pointy/tileDirt.png new file mode 100644 index 0000000000000000000000000000000000000000..19842d96a100ab05cc24c98726c0f16357a1db0c GIT binary patch literal 2012 zcma)7YfuyC8V*T-l#2!tL_pmH)7$kY3t?Eep|vG;}SJff^w_j1#C31q?_v zP$rxVL#o{OyWkicjzCeTq@iiD)jTDlp+OD|&7{#`**IKGyh#Tsvtblaz?o`oEOpr2 zK?T&RSZXR;2Fi3II7_`UPY%bswGLGyTEM{wDUi)*EEQAw*A+Cnm$X{Li#A~mqnjWdok0T~SDFRN zWd9qg(Y!<(&}8^;z5hsTNXgZ~^kmq8Y}PBW!DR$FO6hnaJq)3UJ_SMEo9&`J3qcV> z7NP@0A|NbPtyLjLL-=#JOvaOH4Jf2l!cuW86(gXj)hZsF$&L~-xnd4m!eTHIm_jkg z60eX6Auhc@v#Lyjc{jWLC9%1HjY+t$-3tsvj)?#MYW3IOCI$nmu5!Xn? zf)vxup`R}&c?$w9_B%tTT6-T6!VtNmr8#|5`|e-CISF>$xKYtv z4Qvl#Tv*$7=xpVjhf{p$>rahbJcy2P@h8%^(L6ln=d{nb5eU~;ZLRdH>*=>z_$U3B z1iKs?p8!Dlna-9@{9o^U-oM&^++Y-fS;+RmwS{5`(I&IICHm3>az=9whvBcuF9KYf&>Hi5t#PDcbnW;H^;9G6|Msh7V z$yi8fD?HudIazz==njN(Cc~V&bMA52P#7i@CW?YX*3Gs2gbQknQf-a-(fNC^TPaZ3 zY<8NeA0>CyyERN#7wx$hU;2pay6@@Z;sXnxmT?C5o~m#s?73}Q-2X*rYp0u^4IX@_ zS5Z~M8H=gga-e3Y;j=3v^R`PYO&1UJ*#e@*m`gVL9$w72bs<_(=jzdDKkl{3%ZhC6 zi_>;AeZY~z%>~0DPbaMZS(;?8_8Rhg*pF{Djth>~R&X!eH?3cr{^4lF$^NOcjdubD zRlz-pL8E^|DxWOdU%-Q>|-E?8o*|&?y*TKY# z*&myGRy8h~9-TgU&D}`3^P$x~;7$_ot3Fy&c`EpJU~as7xUaHi_v(B>M!|u4(z)Lv zE`LWAXU2c(Eb=6Z5|1{NJu`pecY+m`8j1^zULW5^?3*ChN z*QY*m$#A`X!1s%t0>fKjHs3*S%l;FBna<2s&jS67-G2Gw^RTuk?-}W{EzVO$*XEwO z)C&S+(U|95TcF&BvTF~;0{R4R&&l-|D}j(tfZW%v;w?wkkv}?o{*P51lTRQyf#OOE zDH_R|v@b4yaJn|)hi@4_N!$Ir^v{sn)9^v>p}C~_MO7oz2ipX`kAPw|EJ$1M|VO!X&8iNm_L7jp6{}P5Tw{EyZ#{x=(lDxp2u+VvoIm zl44!%PN|!)czpv^Nl3gn7BN~P{5-_FJaE-?*Z9VKC*1cpJW1m8c0b4eR+^9~J}yiz F{1g3qA*lcW literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid_pointy/tileDirt_full.png b/tiled/assets/hexgrid_pointy/tileDirt_full.png new file mode 100644 index 0000000000000000000000000000000000000000..e0f26b7fba2a9075c5e3f145c61be6592eb547df GIT binary patch literal 1616 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 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid_pointy/tileLava.png b/tiled/assets/hexgrid_pointy/tileLava.png new file mode 100644 index 0000000000000000000000000000000000000000..8abe43dbcb8ec22cf88e2b12dc4cf120c112b060 GIT binary patch literal 1967 zcma)7Yg7|w8Xn{pK`>b_M5-_ZVL>1>VG=MS0g?;~uHj~?fz?Vb14K+FCZidIRf8cd z6olHY)O%c9i`}&p5$aaCgO;}5V{73kDOB6qmJ-)4Jr&!XSh4$K*|T%b%=f+Dd7kHe zzxRF4nX2r}RRMm%egFUjWTa!c^eU#`JcbYbRT?u|>17d_rXbf6g``<&!~wB}P~l*P zPFaNK;z~{F)@F|2W5pjMkN+HVzrGya&1zbU#8s_oAL?M?a;PIF9V!?Qrhd?j_@sK!PJPHd@ zo&bFIaOiACO(B|#t$db?jzpYdk~E+YWHy_*W`s)^iy)p*D1_j6C_X-pM#Py)^`w%D z)0@Jl6)@bSHfjx|me7N4MWu?^Mv6FerN3T5XLv5FH$7_;-7tt!8Xz7Qc3){4D3kqf zs807BZ6b5=-|GFZ!X|mC0f%yN6S2*xrUzFT?oMSurAAyy5=J>eY?N`reeYX zN~K`bdaYhVm`%}7;W8PTp*N9Ay&BKJL>yXxtJP{y0U}6{AYwtHU?rc&OG6|W%*O;U zwi1EiG%Gjbui7|1=>|Csai5p5p#_PJ~6;JNQ{J#BU)?dto{r>0=I+1FpScpjuCP6jmw)mHf)qV7S=xgzH;7GEf&Lz~2wRxEb@ zCG5>q`}_}Y4UD8!zh*_<$SpL4Zp>6@YDQEO_e`@VQ!rN!FgF<-Ojh7Bt zEC(ZwM*3`Sr-Io{d1DzWdtu%0EtdRzOV;_ILiE-cQmMa2t>oFy>goU@u!YlRfMI2vX;T!G70z+KNQu3x8VTGw-_?Z zapWaLB2}?#KCJ~WO>Cc>b!Nro0dPLS76+g2^VqP9fmZr&tEv7mcYICK#|!3;*+M^o zE27zNj8=tb_kiqOUwvJv(@%8`PZgCpmlgK3@F#%Cv16}<&G+|CANU09IA3Zx{sXxo zB=qsA6+7FC{C0YecUOJXd|}t{!;#-L*ITdEis79jD`t(ne9Tb;g*&0Mpj<8Q4??0{ zj&}0!wI_$E?=CiXJ_tWTRz_m7IpsYmmt4IGn^2+S$ztK57dkiY3iR!)Z}0oly+rn? zqjbSZRcOzPXrg!D@ZgiOdjb7pgUf|1XH#R=V`1Ht?Sz?;JVJT*t%`wQvS+9?L1n+w(r+jy~IaP5tZglXiFPHjkNDv3?^V-d+ z;A^v(`&tn4Co-guS;77M%AmnDUaijx{950!;FI7z_4UOL!=L62|(vVR3mmgad^Vf|uO;5Rnd91cqTB=F9qwImZdJ=96FYFwmGaYgNwU9u z-lm-~r%B&d`28(;u3X*3-!jMk-1Vqb(&1~b{rq24zkltipypspf=_@~o9iH}SXqx< z3vPbF!uOf&)#0+S(v@s69Go?$C(0J$mFwzfJyI2m!6jJ%;uu@7SH8=^a;O{<`w}8p zBC6TUC>%Jn*KWv+cK<>%(lW7kBn1`! E2F^401poj5 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid_pointy/tileLava_full.png b/tiled/assets/hexgrid_pointy/tileLava_full.png new file mode 100644 index 0000000000000000000000000000000000000000..6ca23594f4690acec4bd8db121f62d8eb6741d10 GIT binary patch literal 1607 zcma)6eM}Q)9KHbxYURUGz502y29-(guBFu8S{U@GR4u_$rG8}N+B>0Q@6PLKD{~ox z>Y{w;rp`po5S^KG#x>|9#xB+o+@+XS8!BOMS;a$QEu0e((Eiq>%jy8C&d$x$GMJnVIG}yP!|*I$T2L1 z1|fX8PWmD!tEmvuGaLn}84J+)kOD!KFrtJ}WjdD+=`4V+C=k&C!Kc5h81wi zW#=3$?_g*sqDa`74ZKb&MEW8HCp#ibyN1dn6b$wdER4#LNJ_&%lj*;qPUi^P#ha;@ z@&2o@%d&~3U^C@nHgI;Kacg7|S1hLID1v7=3&X4%u3}*s!!xcjhK2NcXl}8CCK22~f*X_wl9!{zhq*Xo z-{7QZewa(XAcp$x1u?`Y52k_E=CBmB{utJR)+gcl zVEgXyeWdUHjo9A($qiN4R|EaUaRaLY(Y1lN|No{Y(LY7EKUAO0x)(n%gS`n<>nb0b zD*KafKRPZ6E@i%(S^xNMpI8*?)w|v2{sOmon2^NJ^a5{XcO{v7T0_~QGcAX*zgxL^GY=(-#O^_{q-6*qneYI>A1OVr_# z&9v8So7+0YkZW;Q%HuS6DtKwO9X;-da<(=IMPigEtJ+OO61FDFUAyKl~NvnTJ*pe7) zs%`U~eE@I$+1i>$fZ>lY7U06YQ#)_3D`ew<@PrPfC%TTiFmA zlO`JPJr%Btvw*2dnJuLTq>hM6Dc?-T6oFXMBO%Lcb&b)DWqw7KTqKV9-s6lr2IeL5 zE#(X6ZvP-Q$L&YGesD$Nl9p);FKu5xqw20l;WdH9DTOV&WScG$Xvdwjx=dB%YB%N;;3slRs{RH#2VZ#r literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid_pointy/tileMagic.png b/tiled/assets/hexgrid_pointy/tileMagic.png new file mode 100644 index 0000000000000000000000000000000000000000..951e3781b170ed6d68204732ec96b4f15f741a4f GIT binary patch literal 2143 zcmb7FZB!Fy7LJNRasn#L1}W$cQEFJoH{l}?HRb~l6EFltftHXAAwV)A8AyNt@*xTe zEn5mGt*s4cw_Q;|L=lC6$5IN5D{4h(41(PXC|PWUisBAd?EYBxoSk!K?tS0)d7gXk zd+#|@5+Mw>$Gn3m(Ww#g;({AP}mQ z$UzY(k!7ZR3kIQ3E8G?0XgFH1lPQIiB*_AXq*tmDHVPHARj-yvQ$QF<0Obl53qN(a z9S5{ji+DbfHLe(M$>NY6wBlprht^vYC~mZ@jqU+Xdv ze_@-92VO(q6c+xsq@o2800+{50E5IJN-0zyz%PJAWl(+msonsMLZy=_bTXArq|%s_ z049|Iym|0QG>t5gDdO_q#6ngqd=d<+nPjp~rz7d;BuFDCQv(75$P^lxMk68!qBc_n zOY}sQcH^P~7t~5M3N@^NRKS9wBmqi?S$HJV-%3!b-^!}AZ>|ZsFtT2vCR0h2g_0J5 z0>S@=DwS{1T37`Bp6`DZ)`~OLAXx-zp>&NDXG59`IDv!RM zOYz|{C|o|BLgBIL+(j-IlBO#`6}-rm{m%7UlDjYoN;MLh3u+V@pp379l)&qXnTn-z z@mW&u4Og~wE{r9)WF#5#LSO%*&x>2g@GQ7*rxsbfoqJG)47&!IYW>d-Z=g^%w?esW zvHsp#D@d-BDh$x#F02X8{*oy32IEGidUG?GsjE!-2lG9QpMRvg_979%%bPavT=A+GA^kC2Y zC$66Q^)4qWaOyzks_nq?A{%#h$QsB0%a}NJkw^Ur$+Ar&6|TS5pLHrIsly}(VLpEP z%F-%wwbPIBGO&t&PQ``vp8}2^bIWr1!CEbkA~=)SUwuEWt_ds{HAs@cbtb=wzM-A* zn;nc;FFj5)V|$QY9H-~l6?%7hw$&H0|1yFzUnt70`iEEBiK3EooSGvKEuTH`%kkN3+wz3yi1X(!|1D@i@t2%6Hh|+DeSP!#6qc^6m>?cRjTliu$K;pTlBb zCkkVJ?R8^t@%^=@@{gio!p3Su1vS&;*f@DBM&KYSS)XJMIoaIxcb~MtY5$(T&X%M1 z`sbl|S+GnxTZ((WVoOdZ_GR$x2j|i6;L}gh~>kffF6 z_7Cl>HF_;;2@Go#->wqI@_szkGPFF}qBZn~E&~UOOfmH@uT0g^d#L;Vl{W7M+i~4z zhlSBNKCb3j>ew$|WPMs>Q1qpZl=82i?@|~lo_9Gl-idI>N6muE3;i5Bl5KH21}@3z zG3tgeYc@}EMdIt&XbImb|HUIXP5daf8&|5pJqwKy1ewA8x4KQ9tnT^ z)2oCtp9$LrlzEv4uFVy!Ix^?r8Cx&tJ*Rryk!mtOc&~{&@IDmx&7%`Hd}ms#&ZZh- z!2)kZ`{CiS%w4gem!a;)6o$F#SHiuSUsecC5=RMEOIcMJQopW*I8~cjUrYNH8 zUB{BsQ=PpR!ds+ku6~^JA|cGneU|k54xws#O-%Odt%{8b5$L6jGxIf0S%iZ_A-2O6Ewh<-<18sM*cdAb zm?(S;nM>lf?OVSlbs~{OZqF;=3(Tvv1VgFtFh=E}oB~@U(xrNwIN>09z)Ehh(|YiJ z!zB=~+w@?*+612^TvxFtrmSp7-B@RMk15;A~okuGOP$Z879;%q;v>rV;rmGd= z@HPYjV-Vh<2cH&IV9o*38I}apDs=(@BT2w=jS5jCNy&&3NQ4m-f>8)T6OcqLtkEKB zVEh4vY^-gwHWxFF=Mq+Wu!!fKS_pEx-6}V#V%RMZqS0s|I1x%rOb`$W+;*DBJqa|Y zm{7n-j$rLh-pc??rLaf>-c49{>yj1x#t2Nvhs zX&d9_mW;v8X03_lc$_9k6Q&0R0hQfu)2h*BXp#X-Tdp=HAxH+AhQUdg8pez$3}+Zn zY=Vn1go`3+eu8Uz#!a7+8+HQa6f$EZYu`rNj4VR|V<*;darQSH#HgzqADY=kP z3>5C`Kl(heC7351PP$fDO!}Ur1+%k)s~@g9Wf6(Q7fqNU&vWx$XFL7Un&?1?`@Qhp zc>A|EUse6=dZU3;R9xIOu(2nQ(e*(3K;2pITvM6X@-|kOQfP@CygsXG>Dt=^$KDzo zsPay~3ZqZr_D?%7t*QT&#*qhNUF~zb|G2g(^-qfvcx@evZqr@Kiq%?vl5ruP!=tCjVTUbW_TXon67#JAV8rUgwkbJVDF4x5l;Dbfu5_vVU2)VD8Hb zW%tp#A8NgpCeW%3UhAA!b^OKN{^Gjbk;dvsrPwEfj=NsyZErl>w)gXxTT%r*TIki` ziz@f|_mlp!q0`c4_?*l&5PQCVj-opDXxy8gv%^sf@6iVdWiUIas#^Ha(lP(zjkTE# zV)xy&lU+M|E@fSXtNXu{=U8)sj+Gr1c>J+h^4Y#S9@d*2+ZH-fj#Rm3z~}1{w^hfS zSQhP*3r-m|H88h^eDDQB3^CMwdvsN0d-k#B?|l;g-78%qt#_|E0+%EFfe8Nx!0N%l zjNgu&=^h%TYwMHqAOG4moINTzF|dhxzcX^_uFQG+dK*iI?=>`z^sFB`f%w72p(gKN zJIa>KQbfo@4(V!qKX|HQpMOQAp)3kXStgG0t@FMYs*v(Tks&koxXduu81Fq4x*2ud zx+tw9x^{tliBUPdJ!Fg6ih%N{)`JSHwN6@^+#TDj^&gJ#^;asq_-MH$xm#AYr%!VB ildo#l^_Pz<4T$b!9Z;^&pWYDuxtlVwu+P#gWq$+WI%0VM literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid_pointy/tileRock.png b/tiled/assets/hexgrid_pointy/tileRock.png new file mode 100644 index 0000000000000000000000000000000000000000..aec12437c60545d8158a08731f08fb996ed3f3af GIT binary patch literal 1721 zcma)7drT8|9B+h3RZyJbT5)*2Za$Fqe%HsKg~I4dP)aJ4S2V)W9?(JWN_*IXh*&{! z;xo(4bmA)}I8zJ|xJSbjXSA(P6~CCQDXMTq$@LZ`*buvx5_IHwge7UC3?i|3mO1^n=G3k;b} z3OGZm13Ie;FEA&R+3?h|WP`D+&?qy(aj{U0Q_cuja0-K*mLkF~cPijju99d zhfswI_*GDuIz6N!Z8#(qN(DxMN}x!Y5S5~mC^P~R0aT0tF@lN(s7MZEa#RXUTrlI! zX3CSNsI?Qmn4JPHpeU;xK^zW;&>ua zW$77@_a%{fTOIDYDr>pu+*uRSD=B=~-R*9;G}{m|rzY+0weP#1CRLI-2h&10^>Vi& z9Dr~-90ecJjP*G!Lc#B}2mm1sqky1c0M61eD0o1}0I;0K05H?>0Gy&L02ray18eF~ z1~xc4JbXjS5bfHKQ(A>^<8|95cB-kSr}l>F;`^yx#7@18QutSchh-#t`K zGzPTavGRw48V-Eb^kd7qY*q2*#kS^kL+CB~esVyC^w7~gTE4f~?sviA*wK->Ag(TH zY-~wXz>>Mf*b32MWz%(6`ensVht?4XW^f*O0}8LNUC`Pmc{{8TiC(h^ecsuqshOw! z!P&!J)5#8f7>aQ_dk?=e!nrb(&o0u0?wao3;mvAP9n)8q$0CauQAwD}GZrQvAnNVE zJ$=H8D}Porc3$Xxaz2dR&fS2`)~@Q!$sO3{#4dXJ6?H40x3wMHM1;1D#`ghrSM(o? zl?GtyXjJQ~dC~59u87)E?^sR_Y1#PVn@7%UHjI9T(M7`nyq9~Q?U+*qO=|~%8;8@r z4RA+%QCg%}Gg2SeG1Sz`xi_r8@PspRM)22aP5CnaI!?H!8LDp`jc? grl9xe?&ouJSbf~LO6HI1M}0q&L`|~#tTM;-H%m{0R{#J2 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid_pointy/tileRock_full.png b/tiled/assets/hexgrid_pointy/tileRock_full.png new file mode 100644 index 0000000000000000000000000000000000000000..7d117a8fc02acb1d86639bea2949ee4147c06bca GIT binary patch literal 1602 zcma)6eM}Q)7(W%T=x`#Kbog~#HRxu0ca&P%P^7d4IxRG%0*jk+^bUHK_RhPLDx97g3*G+B+P)TjcS zejp(lgO{o;`mE_#!cGI(IgVDtFwgTcUM{1UG8k2B1?V z-7p0=nbbxX%V91XVbp6NK|n^5xLP4srYa37Dy1ST1w{?=Og)mKS0MT6(XN0L7!fcb4kz1Hgf>FLk+a}%`j{t$~>$hDt& zmQ`(gaHiXFI6b4P^J92maci|VaIfI7Z={i2kT?KLrwSMAU(1Wl}`c<8|q4qaI7s z1y6B&*@E9!=hf60>c{G93!K6NPj)xx&n*quGSkA9m-zg$uAZVMJ@Ns4P<)s*pVsl2`Ydfl4B!qYcB2T$}qncNZm z{qozM3o9qj7y0dJ6IGtUld+FuZtuqe!(|@?;l5wDNd}*_dc@>VKNKG=aqKIpOS9b# zc(XiR_Dx^>B0e`LmmCv69Iv*w-8l8L+ZC5*5F3 z9edfp9~g-1;;*w2N5$6AgQew2>yS@!s1jI@ZDJQ zyjo|bzU#K9B#h>t4JCF|Hkem5Bb)AQ$K<2Or4NE%iyHl+#$u@N)YI0XOK%6Z-0_+J z>g_l(;pSdEn|HyRTd`qHj%S@ExMf4ti6w8sFaDVPP?6W9tuGE_$Bj=$TgCCB-62P8 zE3ywdb1<)QU`5x$%pYF%iEbe8L#LX08wV1)A~SzL-+XAf zB&K%QO^HbKQ}AWOSo5Lyp>+`tL%3)dDM&QmJS^$PHcHIFg*pU{&lub0TfH{@^Xz$1 Yz^$Avp!m$gRpGz7(U7Y@mswoMBN6TRgztj6cU3HNdl-r45%pbShAakkZhVP5b*)XL-B#= z)M}|B8c?Z^s1-*`R8T<}t2zmy?>%?E?>pz7^UZ92 zM0kjky_Y=z08U|{0tvbD$#*Tqmi!{xuy4u5lMqG|k+_UVL$nycNAW}q3{xR;OoAck z#?R|99srF0L>U!LM2nYmrMQZYSTJ%fVWt$L8M6-0VZN{r8KtR1JS*_#h18Hw{x#Zq*%%Fj9 zAw*Ij?OjpP;s`Jp*J2=>&i0i;FbnkO&|x;r3V;`Yeh|!LKuiYA^o9Mn5Qhu1!S@f1 z%%(+UT!}#RJ{K7U(i8-t;W8L$X=(H{CLPzx88C;#VL*NiKR;g*;j7!ICJ?=^TIVyW zAi#7|tx`iMaW!aBL=y27B9KN_`tAxU%?DYv?tPochB5Srh5^$d%aulfV)1`NRjLnY z9U;L!*88u*x~PpBj3L2vc#2j^4o>D{Nu}WiYcYhtwNW^pJle$w1y0~P1+D>ugTc9L zlxh@D)6IJe7mK-JY8`>7rC69CkVXp7l}eP$X0nzDA^!k>wulA8Lgo?y#1gO}frtq~ zLOxS4$`#M!D!mE@w=x#R)16nOT5om8lpi(&8%c?Txw0v1|EkOuhG9bnIIE z$K*1|Vi=aW{$tLgN2GZy+YhcKgAcyP)TG(9q^rG`Q$hj2+9gcDkJ2|kZ@G(4KNYMLsjhTn3I=v0%}clWYw52BPE_Yxy7EgMb-Llsv_@c zIRe_3)YDv|i^NBzkDG83<{k zcxU-&tP85#0<8W|;97mHYh2?t=&1S1*ZmHZt3i_v^4-wFQf{5ElHOs1xP?{@=@*Yo zv(M#Sf)DeU%^}6a{#KE}zUD_3W&gvRXZ3Ctvr)|K_+n+hKmzQsBTv}4+`|9(~ z!i8>zg>fsDwn)P@qN#Z3LOn*she!Vtz?rrM_GH` z3#alOZguvx6!7P_vX(3s%|4P7G1qbACs4Qhh2GQHTd`qW(V$kI65TqvLX-Syid9o` zo~P|;{RYYcSW(;P;CX7MbNcnpKekuR`i@`s{Cak8MGPdSvYtAaV_(f)wX~UeZ1W{! z>#+%lN49J;Tj%)O3S3k>aM<|_*q=z;Stc2etL}pA-%n)B`RegWv$3|(`b$>>6qFpV z^6D--mwTgVWEz$Jx_#C|zX^Q~K3Rp|U^~{|Fwm)~33^l9EAgHKdcUFr$L$;DqG#W1 zI$ON#X8R*%-If;Ht4+Xa!=8QN(_?HE4*(`mbTHHg&)I3WDdHA*y=zr(@r^UD$9tXR z6q@_$b;EZg8mC|6R`+C+oiZ;B=g44}rpE)lFFU71=bst49r}|*KJ5n+uf65w#gJGz zg|cg(e)yM(nJ>PVI2heg*&(iEu%dpiF@dAy*OYMPO9m$@CMR?iRc(lh+}^z|IDCdz z_Ilf88Cx4Ru1M^RiNE;haNF9IVIvie3Fr*SgForv1EIQk!oCrcO_||Jxv=oCRX^~B zSW*AOeR)|t?|R0Cd3?twkIy@xJ-^0MjPX{+wA}8`qT@{yEC1>$A1c_;7TK4Y2=a60 z4@|G>ZmO#r{Ij*7J+`EH@cxryuZT)$a~3d|UETiXN_AzBN66N;gx#AsNxKgS-FVAr zrza~=liKmCBKi_7CH0*-CvQ#D&DSr z1<%~X^wgl##FWaylc_cg49tp|ArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XR4cQU}&OXZmDNz zYG`6%sH0$HU}&swV61OwtZQgwWngJ#XsQ4ONh+i#(Mch>H3D2mX`VkM*2oZxQ#zd*s+SwSN_GcP5- zyjT;g+}GF2Gq1QLF)umQ)5TT^XnMv>2~2MaLa!T6y`YqkTL84#CABECEH%ZgC_h&L>|?7;+-`Bk zX&zK>3U0T!;MA)Rbc{YIUXkJ%CIn18ASOK30y*$>pPC0u>_xy-{W`p@k%58fpr?yt zNX4x;cYO11Ifxwi_`SpP$_*~xPOYu87tLF^TW*;pm%Atb1>-MFncrf+WCu@!VNhku9;K`QsCb9fv=rNJKPOJeG)9T#+mhak%2GM8xBY zT!|YEKTb*9Sn%VL#Ek<#4oTd2@Z*lejiw(yJUM|iT5R`v>}sCi{TV zErEr2)XedlU9aTZoU&u5^RB*EC|hv5mg!KZ0#9wnv_$Pkvd-=A0f@PFOo$2YCs&2HEzs{ef#(*)`MefD2Z$Gi6|`Z$xL^pJ-1eCfpL zhO3T=yLlY8uzEEy`9+t0?}Q^WV&Wb5*E8*1e!eF;=a~B^@qhpF*tmDz37vZ?-PK#t zS}y)jiIrhnqE?)AlPAyRkGBL%k^+uOJFjSRl+Bk}$Z;&KMuP3rl`_7Eht#99PU?wY zHdr9N-t1u3%IH(>uN3#E`6ca`w|&=&je_~Sik%P7@*n)n_jXF*Oyfj694VrhE#nST|KQ=qP{uzPjJexjA=D{d*mIJ}B7D zyYk&c6c=DVt^;d10`lI3>rvbyixvO>bf4wdRmG7ReelF{r5}E*5&|kLz literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid_pointy/tileSnow.png b/tiled/assets/hexgrid_pointy/tileSnow.png new file mode 100644 index 0000000000000000000000000000000000000000..dcde3cd52b232185defc590cbbf3e2b87413f210 GIT binary patch literal 1904 zcma)7Yfuws6irLOK%pWa1ZaotBDJ-W-6aGhLzIx^ktrZVrU+9gAz5$>$%f5h0#b`W zc|&PcbZnz2W2FdEPyq|_5Kw5fmSW|hh!_M%Zz?YN%3*oI8p(dsZB&8rIC^tLntQ_FhH!3CSejx zDo;=C$9x$Kleh55&D7@55Wb91aHK{IN2^fLYzD)3gH|P#C1VtjfFj#nZ4M0wLogJdrO!17G-}X992wMXC4@q|s8HuYXoKONrMQH+&MhQSV(!Y+NP`#8@s$ZmuP8g(>svv{|8;`UI3=REns6z1) zt)?W{-|_ydusSkbg+UTbO{9@Bx^RiEMpr7nh{U86K}Hfp%3>D7w-6Me-a@DVkqCGv z3RlVrjr!f^@X%1cSgEF@N*N|b1t2ZJ!ErgC$My6NfW1ZDyg*L`3E=vpuqVoc(LgQ? z2MD?7A{QlOX$nk9Epp|5bI~Qa#!gVEXwN7{;#)C!AW0~I=O^alOUEKyQtt&>8{?L@FqlmEVsm{Fj6~u@5&X)s2{s? zmM~ef>X2RCNqq_S%~M@j{m;w3{rpDN@Up4HL!T7KQKL201wfDq%O}m-#O@2fFUPE` z+jX<7qJ@ttE*xTg*BRlZt9Kjxt?SyE?@NWxZspur*X{6R_7EI=Y1XUL@$^93P}&<= z?|l|G35eT!ExI;71ChSQUg*`FwaJ;g*zys5RVQ%N2C~hmjcK#AY^<53_iN4-cLJ$} zlU+b+@$wwu4JQ|7PLJT)a|lG&;iCvlR~>HnDi8r?-OvW**3f2emsNZ%uLjArf&_X}LlYTKsQ{rt^@V(wGl5U|Hw<}r_3&zx_W zztm8~7V0O#TARRO?Ktblk}hW#cGqjJN56fvO9b{>uXJ&e+EfK2uW!}FAGl!I&(_c0 zD{OHe+;J>x^-Xf7IHV||_Sb_~Q^einDW*=wEy&P{h7Z__in9CIhdVk>F*1pYwNB>~1FKyFI+`RcHIL)>fBF*=PD;7{3BD#`}Kds6CPS?*GGn*^ixN7%tX!Yu$ zd-|vao{O7Vgq^`~hbvcar|i0e%s%^`q0joZG(=ReWX#H^$vM(;TM-L4W6iR fU$uSRygAHxr6MMZs2=Y%{sYAUVdydc`0PIcl~ww9 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid_pointy/tileStone.png b/tiled/assets/hexgrid_pointy/tileStone.png new file mode 100644 index 0000000000000000000000000000000000000000..87667c105dba2e4ede4749fb089256a779593e4e GIT binary patch literal 1698 zcma)7eM}Q)9IoJ`V?{tz3e0#tvN#cXceE8+K%|t9>WT%Kl!;<#52(=Ic|Gg_l?X}^ z6>&~f7N-m~F%iW8eq_3|YAGlTHaC@w=|tiXHGD)Joha;zfcs-CyWHLTd*3|I^ZUG9 zxjZ4x&DGbH!C<&a<0VP-8bv>;%sKR1Nk|*%#fOYhkZZ9_(x4kgO`mQ3=&xghC+%2SdTZK{O&rpRXg8RFF>ZKcyf+ z^(sPxlNwA1I24r`SRNSx(viMPL5okz>hzOkq6-F5N*qGCup^}@piK7PP_1?vttXSv z_woL#us%5-N1-HCkL3|6x^bEQ4p+D+nn0B#MkHfc?o<`!*%*oGvoRcqjs`wW(dg8e zLBDhYE|ZC*Iz6e>sZgmT0;C1F8jV^c;0a>*AxLP5AeN6HF+8yZ=1T;yB$fxmF;P6p z6jy?&^0cUqoZ_nAbA>Z<9h0ENY0nar&}>E3u>__CCNdUjW{zd~jCzw?^~|w^%*ci4 zU?4|d|Iz2EBYJoo=JeFko9Venb@Z?k^i*p)$|Us1;w_a#B~!mX?{3?7Th6u&4=y{4 zo@UMcsj9qz=nqW$ZfKElRz7p__R>xzeqzl-+oCWp)%D!8Z1P8|#Kk0yy?z1DUA?dxrO&xb7v=UF*p+gJ)055E9d zo@c~QTP$_fGgeDo^BLN*wb52fo5ixN+`GJZbRp#AJR&%@WX?cgxI3$Twb7T=zTP;G z)t+PgnAKiroX-kBXxFm4Hec#=Us~j4+SF{=(4g9eH*3i?*;28Fl?fzrMR}ysBvQQUBX&H@Cjc8=AteY|+2E z85&S^HTqSaFZ1>k?Du4OW_+Sd34O Vn6J43X|;~OhBPKYa!$OdfF#dHA9$MR2*8dotfQqxGMtgkFo4>ckl0g^E}V* zGjE+CYvt_l`QZQn%+_hqY<5+$Up^;{{o{7sSL_nYsEtexy@7G!b^=gZXcGbINW6f^ zCU8r6$vHv}0Mp~FxkkpQ&y<;IQh*0B0vBmx*#IC_kpQR<60C$Sk$+(^5gXOU4S21cQSvvY2wnTnhe}u8g&V#}FSJ zgD^!3{)?cDdIPAU?F1+mh?C4Pk_<|u0z`}?ryy^ELKqQ2un0m#Nr+GeOJ#@{9Dn$% zH@jtnEF0B~`(k$rej&ryWDw+ZIt5OVfVLMvh*T)mdt|ZD4KcRpU z4zt~AW2`g<1{HA=UCJoPwI5^gRiS>U#a4 za-eYmdVa=f?xslKJ z&seUlzG>_4ANW9>*fXc(&p-VBz0E^4Egt3hSs~j!*WWlB3ue8G9k?I3ZL6sv>YQ~o z#8xM3)gS)0^UIzb3|r$NP1qF=$y$SY)*94f*g8)s+(!A-a9fM79BzB)%ZJ+%eIxkI z@4epM1o!EW;`T&5@@IE80E;>~+y4KHMR%pG*i_bh#&ByLxU#g$)fI>(O?%wy!m|T)X&-x9ri=(M5N+s!8NWk1BEf!yS2_ z$9I=h#&q-*zuK5GT6*&K^!wEf+jjh35d&Smy6U=NF5>Urk2cNGTnb#^5ZxE+d+T>@ zzBKaW9Fpmtr_q|^^3*erJRzwOVONpugHPVym-gKqT;TN%Q&_8M@m+^euE_tUZ7vfOMZ-Tu1A@*U5jV%_b1CjXt`;k={IZnWM#f-H^x*yq#!^*nT0M0oAd zz%EWMcX@P{yFk-ck57*)s-!~KaucHc-SaeXJsxtfuw(hg#E6BV11>Y?1XmrE>0YpM z>6V6>T}+3#wu74=RqSSy+2UKY(d!b{=5XmagL_x}XE-n3(6d6NH9fAR`+uuk;`0UG Z>;#_SKZ8Y|45bF|be%d2ZOOnk{ta{GX_^24 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid_pointy/tileWater.png b/tiled/assets/hexgrid_pointy/tileWater.png new file mode 100644 index 0000000000000000000000000000000000000000..ecdcececb9e44f1b96b20318e516a934262f2914 GIT binary patch literal 1932 zcma)7Yfuwc6b_Jvl!v?&B5GZO;HxCrERiN9NXQb68bw4wtdM21Bxy)?-7HO@)Ea|W z6pC7{RM3K0b*v&)1|3mEjj@goY%NNq;@gT~AwF7KYVF2~?T^yw&g|ZM?tI^O&OPUw z*^=Zr)BSzIeHaXezj6kgLa#FVUBqV5UxZX1pqG(UQaUvs&!H>`i7{jvJR1X)MnsFH zV2CDv=@~4J!SEWVPfe%NRkI~1ZsZ|u49{vLXf}fpH_b{Qr~#vZY)q>+Nx8jE$GCuA zBju)vR00(t$8`D`1td1VU`{GpU_iwh?zDIy&MKh=j2MLgR%5QoEU`+tFLWjJ-hIsH z0xuwxLCXEBsB~2_Aje4z5b;FOr~r%sV#PdA1jf7tz6l5gAjB6yd=QETg%W{S0*Zi_ z50}nHYH}ngu;OJdI+AjA6h%n*e2c}xvp_tY)bc^GSj-m)`9fhdjfghqn<&H@Z8Ap; zD!`Z-CG`ZQ$4!7+5y{5$C@Gh&^sg%ziC3~F^UF5T4dYu8f)DZp?kf!fRjU7n8jY{e zW-0~yyWW2lHmBwj7(WFw<9Q@X4=yLdor;jiNerQIG8M;j2fLW8!ztXX!wEnx2PUTJ zO&Z){p7a8)Qc091GliH?ObJW5v;a@9*GNQ=Xlf!P17k&s7!XW?5@A6MEE2#9NFYd( zLGU0K#?d?@W}*hUn!mZiA-QfR7zsKvjFI~HFpYx5jlhc=OY}q5B32Bk_mZm_x)#BZ zTs~b4-#yoV%z5yLHjjJz%C&Ux%J-OwHakhXdMA3Vo55guC}CNu^=i-e9dkltoEBHF zVbh9hcayyqCSOvZo|!~#td84R(I5IKFg{^lS%58|I(~UtR8+9tx);2v*poeLO;y)> zma0YHW-M&HcJiF5X^ZlZ?cvSm-RG!`Ktl+fwx)Ak^YR4K!i)>Ap&1Mg8 z4e|1pZuMq4BjedDXLM%(%PH#gWjUpt{;XlM3S<2WGk$+&thm*Bnv=~iOuG07^J|Y_ z8FvP=1PB_x0$$7hKS4s#uTLgwHrz>e9xz?rw>_AB#i;-clk3}biAVK*Nrh9tU>LOW z{H&`*@8tOG56S2Odt9Px^%)yK$q9*1+nv0-*AaShQs#s^R8#}6G(w?0BC}6vsGaGN z;o4i%j&r>I-j92~)31d(l)3b9t<2FEemw+PEBM{nq`0pwt#)knA+n(-M-W127ZTk7q`^ccE53U zhW!+@!On0+IF@^BLiQ8)KSVW9qNuWOm{v9&%xY-YI*T?p#(&2w(aIzJ(|0h!ZjSH2 zVt@!{`HY~@^Q$ALyxSm%U(jvyXn*{~_eOu{XWK?ORPDBrBs&Z6imW1z*p;MbggV{& z^E{hxpSNP=`P~;HZ-iC8w$?7n=@r3D$M8Ul+} zZ6D5Vd5S1k?hrxC`_sRC(s=fc_l6Rm?uxsTDW9Gr)yvJlFz2BkUwFOoO8woFX#K(C zqo}W3oSHwb+a8L3>H2L;qm-3s#qZ~^L)}LLsB&!lw>^a(F;p@tK z9XmIcm4%6O6Kq>QUwFbZ-=3zP+r&gSJD+lTgv|oWv&=IR@apsMD22VwdGPkZmhXg1 zZigw`9#6WcDjaC1d+gwjHj3r{6;12a;+QJ4#q54Qo~;7IOxpsU@^4I3}eza#b&zy NkIJMua9yH$#h))y@E8C9 literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid_pointy/tileWater_full.png b/tiled/assets/hexgrid_pointy/tileWater_full.png new file mode 100644 index 0000000000000000000000000000000000000000..5f74dbbf79fc7357f06f13b10a201ebbcc453d61 GIT binary patch literal 1597 zcmeAS@N?(olHy`uVBq!ia0vp^jzApA!3HD~i##_2DajJoh?3y^w370~qErUQl>DSr z1<%~X^wgl##FWaylc_cg49tp|ArU1JzCKpT`MG+DAT@dwxdlMo3=B5*6$OdO*{LN8 zNvY|XdA3ULckfqH$V{%1*XSQL?vFu&J;D8jzb> zlBiITo0C^;Rbi_HHrEQs1_|pcDS(xfWZNo192Makpx~Tel&WB=XR4cQU}&OXZmDNz zYG`6%sH0$HU}&swV61OwtZQgwWngJ#XsQ4ONh+i#(Mch>H3D2mX`VkM*2oZxQ#zd*s+SwSN_GcP5- zyjT;g+}GF2Gq1QLF)umQ)5TT^XnMv>2~2MaLazx|?7;+-@<% zX&zK>3U0R;;nb@Sbc{YIUXkJ%CIn18ASOK30y*$>pPC0u>_xy-{cECt3bxJ%$-RV-~QDXi5#8OoKSf0ym7S>wIOmuF4%9v~~*MwRWF?K~#t*+Th3%(KPvfh?)@ z!pyVf)-yBT7K&$OzAYBd#(Y~Uo`w0g+M|JEK z4T2JlM5BWWhhFcM<2mA|{y22|EAicYhdl4MCaOF*oy>4r;f>3mg7Ai{aAmu5>k~~X zSPwJr|0?nF$L`P_d7}J|4D<8F4dUzab=|`Lc%9mx?zAaU+R*IrVT&JT?;?&cc-9yx z{XJ%uu;lU8U7`+CHts!fD^S?5>sY>PhLGFMA9pxPkFAi3mr&$>TyS6c_yy5;DaGEx z!tE`OB_4M?ICG=l@-N z%x#Zpi;3I&e~iEO<$wPq^}&Ei8HoOLD;zx+(PZ;FY0oRS@Sgearq)&e%Vcpha6Q2J z)TwHo|3A@{k7TdUohQfp?A6Em^0UFo0ZL0APd@qQKZ_O*SIe3oYdJzB)C9L3eePz^ zo5-Y?Uz5lZEMXtd@gsVWwacO6b zu8HgiL-rK5?2*t{oYAN5e53873{$9$rIXk(HKtOqlkeZ2|E1=elF{r5}E)$l|j1z literal 0 HcmV?d00001 diff --git a/tiled/assets/hexgrid_pointy/tileWater_shadow.png b/tiled/assets/hexgrid_pointy/tileWater_shadow.png new file mode 100644 index 0000000000000000000000000000000000000000..4a79e862a9c49d84979fb783e6f6e55a09fa183a GIT binary patch literal 1556 zcmaJ>eM}Q)96rE^Bbc=qSw*L}V_^^VZCcrki61Z#C4eF`NQhZNWD7+6h~hT<#OerY1b5|Y`$N3s?)|-Qp6B^} zyiaa>M*7ORVNqcK0L;~|!ZU?6Re0CVnJs(?R^K2j3pi~qm&MpP7r~N1s+BR5px#at zkeMW5b#Lk-RR9q37L}dLlD(Q0U@r40fp zs~XBt7!ZR)Ll#o2N?0K$GpNPH($`DizBXSs($DuL|QDUe9oO~c5 z8*8;;nYeB;m#|Yqg&gO=VA$nyNnLU&!xq4(QmKRy87z~<35YnSo8|~Uj&?>*Dd42j z!cq>7VrVd+NSK*oP7Mi_PPAZmOv}>F$uS87gL%RMqf#W$(iG5Ocs0~+pGG^mO!B{a zUn=a(b~{KolXNo0tVOsuTXZ0m1Jkf1!7*$$!xT+TF{6;-7-u2l05uwLX%0nO8JF|j zak#;N>1iiN&=yjUt06%^N>Nr!Ay>+DvUo*;LKlysT6r3d#N!GC*U1q?n<~erxHw}e zwv#kB#kEdw6B9H_WJYel33i8&87En4GilYaj2#^B7^7ycMLwh6B-i@#S^|B<&&Y*^ zV&K5N{_mcrjs)`r!fDqEn`z&Zv|x5taP_*?``rK#yj_o{X7iWtUAelU$F!)^|Dx@a zX9trawp7S4)uZEAwESOsqe={$uT|w7fcmjM(|KRkQA15kvhnTO3%1`bKK@$ubkui} zy7bd^W7g6w-*(+-ttl&8(CHV;m$X%@+(UQV^+%p8tvVzdL(Uk@-w!t>6o1}+e4t?< z*i#cR6yd3f91@}^W}c^JF%#nHk6MVglRM~H|04R?E_9ZcsSvf|O2-J|MXMWWAuSs)NJX9W=a>TtF=PqpY$^e??# z{2#}jbsXsAkUKqz5nN;V?R8BL@aH_Zs_}?;2~ATcQV#kH2i3aeV;jWX_j)UEk@lab zf2-C$oF5J6HNI1j*6iCQsqy>nwd@P!{7FqajVrB7219hq^BNC7DPF`}&AWB~uvbD3 zxS*4-)ov&yDq}3adtvYHZGOJ{bd_(}Sy@`7W!HB=|_W%vZgqbbVOH z;tN5;-wel&)vhmZ2|HGPO?2w@eI0#!3)+8fy$@YmkQP}h&aV^C9v{+}_KVP)hz)yS zZoRW+)YZ1<(=t}+`zZ0xeO1jOV;NfZ`1$SCaW6)Wxc8$c{I_q7l~))gZhw-v^jzQk ze2LF1(GGkNeKM%FsFbXXF=u=0yxp_DZ1!Iktv3zs=&dq^Xk4x6ta*|{H@(q==a4s< vxxTQi$N0N*v`A5BlBRF#jo9QLQi8*Q1l!O$?Z*qN1OI8gHXT2nW~%rX*B(g_ literal 0 HcmV?d00001 diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session index 3db700e..77c0146 100644 --- a/tiled/detiled.tiled-session +++ b/tiled/detiled.tiled-session @@ -9,6 +9,7 @@ ".", "maps" ], + "file.lastUsedOpenFilter": "All Files (*)", "fileStates": { ":/automap-tiles.tsx": { "dynamicWrapping": false, @@ -35,11 +36,19 @@ "expandedObjectLayers": [ 2 ], - "scale": 0.2213, + "scale": 1.78, "selectedLayer": 1, "viewCenter": { - "x": 2169.001355625847, - "y": 1477.6321735201086 + "x": 162.92134831460675, + "y": 86.51685393258427 + } + }, + "maps/hexgrid_pointy.json": { + "scale": 0.5, + "selectedLayer": 0, + "viewCenter": { + "x": 826, + "y": 820 } }, "maps/isogrid.json": { @@ -97,7 +106,7 @@ } }, "last.exportedFilePath": "/Users/insality/code/defold/detiled/tiled/export", - "last.imagePath": "/Users/insality/code/defold/detiled/tiled/assets/isogrid", + "last.imagePath": "/Users/insality/code/defold/detiled/tiled/assets/hexgrid_pointy", "lastUsedTilesetExportFilter": "JSON tileset files (*.tsj *.json)", "map.lastUsedExportFilter": "Defold Collection (*.collection)", "map.lastUsedFormat": "json", diff --git a/tiled/maps/hexgrid_pointy.json b/tiled/maps/hexgrid_pointy.json new file mode 100644 index 0000000..4c1354c --- /dev/null +++ b/tiled/maps/hexgrid_pointy.json @@ -0,0 +1,103 @@ +{ "compressionlevel":-1, + "height":20, + "hexsidelength":11, + "infinite":false, + "layers":[ + { + "data":[30, 32, 27, 32, 21, 28, 29, 17, 34, 21, 26, 16, 23, 21, 23, 24, 27, 34, 32, 22, 25, 16, 30, 21, 31, 29, 20, 26, 23, 19, + 21, 20, 17, 32, 21, 16, 26, 27, 29, 33, 31, 26, 20, 22, 17, 32, 18, 29, 27, 21, 31, 21, 29, 29, 20, 30, 28, 27, 24, 19, + 18, 29, 27, 33, 33, 25, 19, 20, 23, 31, 31, 0, 29, 29, 19, 24, 32, 19, 25, 32, 33, 33, 17, 19, 15, 16, 26, 32, 24, 31, + 27, 18, 19, 32, 21, 26, 21, 28, 18, 33, 0, 0, 0, 26, 34, 34, 22, 15, 27, 28, 17, 28, 17, 16, 27, 33, 29, 21, 28, 33, + 16, 20, 30, 15, 15, 20, 29, 15, 28, 29, 15, 29, 30, 17, 15, 21, 31, 33, 22, 15, 16, 17, 34, 32, 26, 22, 25, 26, 27, 22, + 33, 33, 20, 31, 17, 26, 18, 26, 24, 32, 26, 17, 31, 33, 22, 24, 30, 33, 21, 31, 0, 15, 23, 33, 26, 25, 22, 16, 21, 20, + 15, 15, 16, 31, 25, 27, 19, 28, 20, 32, 25, 19, 21, 22, 15, 20, 30, 26, 15, 30, 0, 31, 34, 31, 32, 18, 27, 15, 34, 17, + 17, 26, 20, 25, 25, 31, 0, 16, 22, 24, 25, 26, 21, 28, 0, 31, 24, 20, 28, 28, 0, 20, 22, 28, 25, 25, 27, 32, 25, 34, + 23, 30, 21, 32, 16, 21, 0, 20, 24, 25, 19, 32, 33, 20, 0, 20, 34, 25, 21, 24, 24, 0, 18, 32, 33, 20, 31, 23, 22, 27, + 20, 28, 28, 26, 22, 29, 0, 32, 26, 18, 0, 25, 33, 23, 0, 27, 22, 16, 18, 18, 18, 32, 34, 33, 24, 17, 20, 27, 23, 27, + 20, 18, 18, 22, 28, 33, 0, 25, 25, 20, 0, 0, 24, 22, 0, 28, 32, 16, 0, 27, 16, 24, 19, 24, 29, 33, 33, 24, 27, 20, + 16, 16, 20, 34, 20, 16, 0, 15, 19, 33, 0, 0, 18, 18, 0, 28, 18, 23, 0, 19, 28, 20, 24, 28, 30, 15, 32, 29, 21, 20, + 30, 19, 34, 31, 21, 24, 15, 0, 19, 21, 33, 31, 28, 0, 0, 20, 17, 23, 0, 17, 33, 34, 15, 0, 29, 25, 29, 30, 25, 16, + 25, 19, 22, 23, 17, 15, 18, 0, 27, 31, 18, 0, 0, 0, 29, 18, 34, 0, 32, 28, 31, 0, 0, 22, 16, 23, 25, 22, 22, 20, + 20, 27, 15, 17, 29, 22, 27, 33, 0, 0, 0, 0, 22, 27, 30, 18, 0, 0, 17, 28, 31, 0, 33, 24, 31, 23, 28, 30, 32, 33, + 26, 18, 27, 34, 27, 22, 31, 16, 17, 29, 25, 26, 15, 18, 15, 20, 33, 23, 22, 18, 0, 33, 33, 28, 18, 24, 18, 28, 26, 16, + 31, 19, 27, 22, 28, 34, 32, 19, 28, 27, 34, 23, 24, 17, 27, 17, 26, 26, 15, 24, 0, 0, 31, 22, 30, 28, 30, 29, 22, 22, + 34, 24, 21, 32, 31, 34, 20, 15, 27, 19, 23, 32, 31, 17, 26, 27, 24, 18, 32, 29, 32, 27, 16, 31, 20, 24, 33, 29, 21, 16, + 16, 21, 20, 24, 16, 18, 18, 23, 34, 34, 23, 17, 21, 18, 34, 31, 30, 17, 22, 23, 26, 25, 25, 30, 18, 34, 30, 21, 16, 18, + 19, 31, 18, 34, 20, 27, 30, 15, 15, 25, 18, 33, 22, 22, 31, 20, 27, 19, 33, 19, 26, 27, 22, 33, 22, 20, 28, 31, 22, 18], + "height":20, + "id":1, + "name":"tiles", + "opacity":1, + "properties":[ + { + "name":"position_z", + "type":"float", + "value":-1 + }], + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }, + { + "draworder":"topdown", + "id":2, + "name":"objects", + "objects":[ + { + "gid":13, + "height":264, + "id":40, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":-65.7783871991297, + "y":1038.12392910566 + }, + { + "gid":13, + "height":97.4829828705128, + "id":41, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":86.7746249036762, + "x":274.413181781009, + "y":623.46628143279 + }], + "opacity":1, + "type":"objectgroup", + "visible":true, + "x":0, + "y":0 + }], + "nextlayerid":3, + "nextobjectid":42, + "orientation":"hexagonal", + "renderorder":"right-down", + "staggeraxis":"y", + "staggerindex":"odd", + "tiledversion":"1.11.2", + "tileheight":90, + "tilesets":[ + { + "firstgid":1, + "source":"..\/tilesets\/hexgrid_tiles.json" + }, + { + "firstgid":13, + "source":"..\/tilesets\/hexgrid_objects.json" + }, + { + "firstgid":15, + "source":"..\/tilesets\/hexgrid_pointy.json" + }], + "tilewidth":65, + "type":"map", + "version":"1.10", + "width":30 +} \ No newline at end of file diff --git a/tiled/tilesets/hexgrid_pointy.json b/tiled/tilesets/hexgrid_pointy.json new file mode 100644 index 0000000..e2e862c --- /dev/null +++ b/tiled/tilesets/hexgrid_pointy.json @@ -0,0 +1,138 @@ +{ "columns":0, + "grid": + { + "height":1, + "orientation":"orthogonal", + "width":1 + }, + "margin":0, + "name":"hexgrid_pointy", + "spacing":0, + "tilecount":20, + "tiledversion":"1.11.2", + "tileheight":89, + "tiles":[ + { + "id":0, + "image":"..\/assets\/hexgrid_pointy\/tileAutumn_full.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":1, + "image":"..\/assets\/hexgrid_pointy\/tileAutumn.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":2, + "image":"..\/assets\/hexgrid_pointy\/tileDirt_full.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":3, + "image":"..\/assets\/hexgrid_pointy\/tileDirt.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":4, + "image":"..\/assets\/hexgrid_pointy\/tileGrass_full.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":5, + "image":"..\/assets\/hexgrid_pointy\/tileGrass.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":6, + "image":"..\/assets\/hexgrid_pointy\/tileLava_full.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":7, + "image":"..\/assets\/hexgrid_pointy\/tileLava.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":8, + "image":"..\/assets\/hexgrid_pointy\/tileMagic_full.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":9, + "image":"..\/assets\/hexgrid_pointy\/tileMagic.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":10, + "image":"..\/assets\/hexgrid_pointy\/tileRock_full.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":11, + "image":"..\/assets\/hexgrid_pointy\/tileRock.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":12, + "image":"..\/assets\/hexgrid_pointy\/tileSand_full.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":13, + "image":"..\/assets\/hexgrid_pointy\/tileSand.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":14, + "image":"..\/assets\/hexgrid_pointy\/tileSnow.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":15, + "image":"..\/assets\/hexgrid_pointy\/tileStone_full.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":16, + "image":"..\/assets\/hexgrid_pointy\/tileStone.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":17, + "image":"..\/assets\/hexgrid_pointy\/tileWater_full.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":18, + "image":"..\/assets\/hexgrid_pointy\/tileWater_shadow.png", + "imageheight":89, + "imagewidth":65 + }, + { + "id":19, + "image":"..\/assets\/hexgrid_pointy\/tileWater.png", + "imageheight":89, + "imagewidth":65 + }], + "tilewidth":65, + "type":"tileset", + "version":"1.10" +} \ No newline at end of file From 2672f5c934d508e2cd9a20ca667eab4c65cbb8dc Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 00:48:47 +0200 Subject: [PATCH 27/71] Update --- detiled/internal/grid/hexgrid.lua | 13 +++++++++---- detiled/internal/grid/hexgrid_convertations.lua | 4 ++-- tiled/maps/hexgrid_pointy.json | 4 ++-- 3 files changed, 13 insertions(+), 8 deletions(-) diff --git a/detiled/internal/grid/hexgrid.lua b/detiled/internal/grid/hexgrid.lua index 9eb37a3..a193eac 100644 --- a/detiled/internal/grid/hexgrid.lua +++ b/detiled/internal/grid/hexgrid.lua @@ -9,11 +9,16 @@ local HEXMAP_TYPE = { local function get_scene_size_pointytop(data) - local double_size = data.tile.height + data.tile.side - local part_size = data.tile.height - data.tile.side + local tile_width = data.tile.width + local tile_height = data.tile.height + local tile_side = data.tile.side + local tile_count_x = data.scene.tiles_x + local tile_count_y = data.scene.tiles_y + local tile_angle = tile_height - tile_side + local tile_angle_half = tile_angle / 2 - local width = (data.scene.tiles_x + 0.5) * data.tile.width - local height = (data.scene.tiles_y / 2 * double_size) + 2 * part_size + local width = (tile_count_x + 0.5) * tile_width + local height = (tile_count_y * tile_side) + ((tile_count_y + 1) * tile_angle_half) return width, height end diff --git a/detiled/internal/grid/hexgrid_convertations.lua b/detiled/internal/grid/hexgrid_convertations.lua index 3c62dcf..d583692 100644 --- a/detiled/internal/grid/hexgrid_convertations.lua +++ b/detiled/internal/grid/hexgrid_convertations.lua @@ -46,7 +46,7 @@ end function M.cell_to_pos_pointytop(i, j, data) local part_size = data.tile.height - data.tile.side - local two_hex_height = data.tile.height + data.tile.side + local two_hex_height = data.tile.side * 2 + part_size local x = data.tile.width * (i + 0.5 * (bit.band(j, 1))) local y = two_hex_height / 2 * j @@ -66,7 +66,7 @@ function M.pos_to_cell_pointytop(x, y, map_params) local data = map_params local part_size = data.tile.height - data.tile.side - local two_hex_height = data.tile.height + data.tile.side + local two_hex_height = data.tile.side * 2 + part_size x = x - data.tile.width/2 y = y - (data.scene.invert_y and -part_size or part_size) diff --git a/tiled/maps/hexgrid_pointy.json b/tiled/maps/hexgrid_pointy.json index 4c1354c..3f84bc9 100644 --- a/tiled/maps/hexgrid_pointy.json +++ b/tiled/maps/hexgrid_pointy.json @@ -1,6 +1,6 @@ { "compressionlevel":-1, "height":20, - "hexsidelength":11, + "hexsidelength":38, "infinite":false, "layers":[ { @@ -82,7 +82,7 @@ "staggeraxis":"y", "staggerindex":"odd", "tiledversion":"1.11.2", - "tileheight":90, + "tileheight":65, "tilesets":[ { "firstgid":1, From 678e5448d328d917d32488ccd591464a26de807a Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 00:55:23 +0200 Subject: [PATCH 28/71] Update --- example/assets/hexgrid_pointy/entities/tileAutumn.go | 2 +- example/assets/hexgrid_pointy/entities/tileAutumn_full.go | 2 +- example/assets/hexgrid_pointy/entities/tileDirt.go | 2 +- example/assets/hexgrid_pointy/entities/tileDirt_full.go | 2 +- example/assets/hexgrid_pointy/entities/tileGrass.go | 2 +- example/assets/hexgrid_pointy/entities/tileGrass_full.go | 2 +- example/assets/hexgrid_pointy/entities/tileLava.go | 2 +- example/assets/hexgrid_pointy/entities/tileLava_full.go | 2 +- example/assets/hexgrid_pointy/entities/tileMagic.go | 2 +- example/assets/hexgrid_pointy/entities/tileMagic_full.go | 2 +- example/assets/hexgrid_pointy/entities/tileRock.go | 2 +- example/assets/hexgrid_pointy/entities/tileRock_full.go | 2 +- example/assets/hexgrid_pointy/entities/tileSand.go | 2 +- example/assets/hexgrid_pointy/entities/tileSand_full.go | 2 +- example/assets/hexgrid_pointy/entities/tileSnow.go | 2 +- example/assets/hexgrid_pointy/entities/tileStone.go | 2 +- example/assets/hexgrid_pointy/entities/tileStone_full.go | 2 +- example/assets/hexgrid_pointy/entities/tileWater.go | 2 +- example/assets/hexgrid_pointy/entities/tileWater_full.go | 2 +- example/assets/hexgrid_pointy/entities/tileWater_shadow.go | 2 +- .../example_hexgrid_pointy/example_hexgrid_pointy.collection | 4 ++-- 21 files changed, 22 insertions(+), 22 deletions(-) diff --git a/example/assets/hexgrid_pointy/entities/tileAutumn.go b/example/assets/hexgrid_pointy/entities/tileAutumn.go index 96f6cf4..9d64eea 100644 --- a/example/assets/hexgrid_pointy/entities/tileAutumn.go +++ b/example/assets/hexgrid_pointy/entities/tileAutumn.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileAutumn_full.go b/example/assets/hexgrid_pointy/entities/tileAutumn_full.go index 26985dd..51db88f 100644 --- a/example/assets/hexgrid_pointy/entities/tileAutumn_full.go +++ b/example/assets/hexgrid_pointy/entities/tileAutumn_full.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileDirt.go b/example/assets/hexgrid_pointy/entities/tileDirt.go index 9928312..9c2a6d6 100644 --- a/example/assets/hexgrid_pointy/entities/tileDirt.go +++ b/example/assets/hexgrid_pointy/entities/tileDirt.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileDirt_full.go b/example/assets/hexgrid_pointy/entities/tileDirt_full.go index 24b8994..fd53949 100644 --- a/example/assets/hexgrid_pointy/entities/tileDirt_full.go +++ b/example/assets/hexgrid_pointy/entities/tileDirt_full.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileGrass.go b/example/assets/hexgrid_pointy/entities/tileGrass.go index 0f79f51..00fb9b5 100644 --- a/example/assets/hexgrid_pointy/entities/tileGrass.go +++ b/example/assets/hexgrid_pointy/entities/tileGrass.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileGrass_full.go b/example/assets/hexgrid_pointy/entities/tileGrass_full.go index ef09039..6a20f8c 100644 --- a/example/assets/hexgrid_pointy/entities/tileGrass_full.go +++ b/example/assets/hexgrid_pointy/entities/tileGrass_full.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileLava.go b/example/assets/hexgrid_pointy/entities/tileLava.go index c754db1..d91b334 100644 --- a/example/assets/hexgrid_pointy/entities/tileLava.go +++ b/example/assets/hexgrid_pointy/entities/tileLava.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileLava_full.go b/example/assets/hexgrid_pointy/entities/tileLava_full.go index 900be63..0c8b58a 100644 --- a/example/assets/hexgrid_pointy/entities/tileLava_full.go +++ b/example/assets/hexgrid_pointy/entities/tileLava_full.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileMagic.go b/example/assets/hexgrid_pointy/entities/tileMagic.go index c0a4961..ffb9165 100644 --- a/example/assets/hexgrid_pointy/entities/tileMagic.go +++ b/example/assets/hexgrid_pointy/entities/tileMagic.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileMagic_full.go b/example/assets/hexgrid_pointy/entities/tileMagic_full.go index d4cbfdd..86263e0 100644 --- a/example/assets/hexgrid_pointy/entities/tileMagic_full.go +++ b/example/assets/hexgrid_pointy/entities/tileMagic_full.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileRock.go b/example/assets/hexgrid_pointy/entities/tileRock.go index 95e12d1..13e7d37 100644 --- a/example/assets/hexgrid_pointy/entities/tileRock.go +++ b/example/assets/hexgrid_pointy/entities/tileRock.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileRock_full.go b/example/assets/hexgrid_pointy/entities/tileRock_full.go index 5282775..232000d 100644 --- a/example/assets/hexgrid_pointy/entities/tileRock_full.go +++ b/example/assets/hexgrid_pointy/entities/tileRock_full.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileSand.go b/example/assets/hexgrid_pointy/entities/tileSand.go index 7c67a98..9e1bf83 100644 --- a/example/assets/hexgrid_pointy/entities/tileSand.go +++ b/example/assets/hexgrid_pointy/entities/tileSand.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileSand_full.go b/example/assets/hexgrid_pointy/entities/tileSand_full.go index ff20156..147580d 100644 --- a/example/assets/hexgrid_pointy/entities/tileSand_full.go +++ b/example/assets/hexgrid_pointy/entities/tileSand_full.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileSnow.go b/example/assets/hexgrid_pointy/entities/tileSnow.go index c727776..fff9b91 100644 --- a/example/assets/hexgrid_pointy/entities/tileSnow.go +++ b/example/assets/hexgrid_pointy/entities/tileSnow.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileStone.go b/example/assets/hexgrid_pointy/entities/tileStone.go index 45785db..790fd46 100644 --- a/example/assets/hexgrid_pointy/entities/tileStone.go +++ b/example/assets/hexgrid_pointy/entities/tileStone.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileStone_full.go b/example/assets/hexgrid_pointy/entities/tileStone_full.go index 2d8f05a..46d8d38 100644 --- a/example/assets/hexgrid_pointy/entities/tileStone_full.go +++ b/example/assets/hexgrid_pointy/entities/tileStone_full.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileWater.go b/example/assets/hexgrid_pointy/entities/tileWater.go index c2ab5de..bbb68fb 100644 --- a/example/assets/hexgrid_pointy/entities/tileWater.go +++ b/example/assets/hexgrid_pointy/entities/tileWater.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileWater_full.go b/example/assets/hexgrid_pointy/entities/tileWater_full.go index b3b5ac2..acb4b1b 100644 --- a/example/assets/hexgrid_pointy/entities/tileWater_full.go +++ b/example/assets/hexgrid_pointy/entities/tileWater_full.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/assets/hexgrid_pointy/entities/tileWater_shadow.go b/example/assets/hexgrid_pointy/entities/tileWater_shadow.go index 36a0ce3..ab3d89c 100644 --- a/example/assets/hexgrid_pointy/entities/tileWater_shadow.go +++ b/example/assets/hexgrid_pointy/entities/tileWater_shadow.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 44.0 + y: 7.0 } } diff --git a/example/example_hexgrid_pointy/example_hexgrid_pointy.collection b/example/example_hexgrid_pointy/example_hexgrid_pointy.collection index 9a6f352..e695a28 100644 --- a/example/example_hexgrid_pointy/example_hexgrid_pointy.collection +++ b/example/example_hexgrid_pointy/example_hexgrid_pointy.collection @@ -60,7 +60,7 @@ embedded_instances { "}\\n" "size {\\n" " x: 1952.0\\n" - " y: 1040.0\\n" + " y: 1033.0\\n" "}\\n" "size_mode: SIZE_MODE_MANUAL\\n" "textures {\\n" @@ -70,7 +70,7 @@ embedded_instances { "\"\n" " position {\n" " x: 976.0\n" - " y: 520.0\n" + " y: 516.5\n" " z: -4.0\n" " }\n" "}\n" From 739f9d542ad2f572dbca7d758ed04e9629676df3 Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 00:56:10 +0200 Subject: [PATCH 29/71] Update --- tiled/maps/hexgrid_pointy.json | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/tiled/maps/hexgrid_pointy.json b/tiled/maps/hexgrid_pointy.json index 3f84bc9..6e3c4c2 100644 --- a/tiled/maps/hexgrid_pointy.json +++ b/tiled/maps/hexgrid_pointy.json @@ -54,8 +54,8 @@ "type":"", "visible":true, "width":235, - "x":-65.7783871991297, - "y":1038.12392910566 + "x":-65.4491257325991, + "y":1032.86796124158 }, { "gid":13, @@ -66,8 +66,8 @@ "type":"", "visible":true, "width":86.7746249036762, - "x":274.413181781009, - "y":623.46628143279 + "x":146.659808914908, + "y":609.560627174192 }], "opacity":1, "type":"objectgroup", From e17a8901cbc9e07bc22fdcf7154776fb9ab2aa26 Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 11:12:53 +0200 Subject: [PATCH 30/71] Update --- .../example_grid_game_objects.collection | 82 +++++++ .../example_grid_game_objects.script | 35 +++ game.project | 2 +- tiled/detiled.tiled-session | 28 ++- tiled/maps/grid_game_objects.json | 204 ++++++++++++++++++ 5 files changed, 340 insertions(+), 11 deletions(-) create mode 100644 example/example_grid_game_objects/example_grid_game_objects.collection create mode 100644 example/example_grid_game_objects/example_grid_game_objects.script create mode 100644 tiled/maps/grid_game_objects.json diff --git a/example/example_grid_game_objects/example_grid_game_objects.collection b/example/example_grid_game_objects/example_grid_game_objects.collection new file mode 100644 index 0000000..b02fbb5 --- /dev/null +++ b/example/example_grid_game_objects/example_grid_game_objects.collection @@ -0,0 +1,82 @@ +name: "example_grid" +instances { + id: "entities" + prototype: "/example/assets/grid/entities.go" +} +scale_along_z: 0 +embedded_instances { + id: "go" + data: "components {\n" + " id: \"example_grid_game_objects\"\n" + " component: \"/example/example_grid_game_objects/example_grid_game_objects.script\"\n" + "}\n" + "" +} +embedded_instances { + id: "camera" + data: "components {\n" + " id: \"camera_wasd_control\"\n" + " component: \"/example/assets/camera_wasd_control.script\"\n" + " properties {\n" + " id: \"movement_speed\"\n" + " value: \"100.0\"\n" + " type: PROPERTY_TYPE_NUMBER\n" + " }\n" + " properties {\n" + " id: \"zoom_speed\"\n" + " value: \"2.0\"\n" + " type: PROPERTY_TYPE_NUMBER\n" + " }\n" + "}\n" + "embedded_components {\n" + " id: \"camera\"\n" + " type: \"camera\"\n" + " data: \"aspect_ratio: 1.0\\n" + "fov: 0.7854\\n" + "near_z: -100.0\\n" + "far_z: 1000.0\\n" + "orthographic_projection: 1\\n" + "orthographic_zoom: 2.0\\n" + "\"\n" + "}\n" + "" + position { + x: 240.0 + y: 160.0 + z: -10.0 + } +} +embedded_instances { + id: "background" + data: "embedded_components {\n" + " id: \"sprite\"\n" + " type: \"sprite\"\n" + " data: \"default_animation: \\\"pixel\\\"\\n" + "material: \\\"/builtins/materials/sprite.material\\\"\\n" + "slice9 {\\n" + " x: 2.0\\n" + " y: 2.0\\n" + " z: 2.0\\n" + " w: 2.0\\n" + "}\\n" + "size {\\n" + " x: 480.0\\n" + " y: 320.0\\n" + "}\\n" + "size_mode: SIZE_MODE_MANUAL\\n" + "textures {\\n" + " sampler: \\\"texture_sampler\\\"\\n" + " texture: \\\"/druid/druid.atlas\\\"\\n" + "}\\n" + "\"\n" + " position {\n" + " x: 240.0\n" + " y: 160.0\n" + " z: -1.0\n" + " }\n" + "}\n" + "" + position { + z: -2.0 + } +} diff --git a/example/example_grid_game_objects/example_grid_game_objects.script b/example/example_grid_game_objects/example_grid_game_objects.script new file mode 100644 index 0000000..422a89c --- /dev/null +++ b/example/example_grid_game_objects/example_grid_game_objects.script @@ -0,0 +1,35 @@ +local detiled = require("detiled.detiled") + + +local function spawn_entity(entity) + local prefab_id = entity.prefab_id + local components = entity.components + local transform = components.transform + local position_x = transform.position_x + local position_y = transform.position_y + local position_z = transform.position_z + local scale_x = transform.scale_x or 1 + local scale_y = transform.scale_y or 1 + + local factory_url = "/entities#" .. prefab_id + local position = vmath.vector3(position_x, position_y, position_z) + local scale = vmath.vector3(scale_x, scale_y, 1) + print("Spawn entity: ", factory_url, position_x, position_y, position_z) + factory.create(factory_url, position, nil, nil, scale) +end + + +local function spawn_map(entities) + for _, entity in ipairs(entities) do + spawn_entity(entity) + end +end + + +function init(self) + detiled.load_tileset("/tiled/tilesets/grid_items.json") + --detiled.load_tileset("/tiled/tilesets/grid_tileset.json") + + local map = detiled.get_entity_from_map("/tiled/maps/grid_game_objects.json") + spawn_map(map) +end diff --git a/game.project b/game.project index 5b3d757..baa3b5b 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example_hexgrid_pointy/example_hexgrid_pointy.collectionc +main_collection = /example/example_grid_game_objects/example_grid_game_objects.collectionc [script] shared_state = 1 diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session index 77c0146..3e17cbb 100644 --- a/tiled/detiled.tiled-session +++ b/tiled/detiled.tiled-session @@ -17,11 +17,11 @@ "scaleInEditor": 1 }, "maps/grid.json": { - "scale": 9.05, - "selectedLayer": 3, + "scale": 2.2515, + "selectedLayer": 2, "viewCenter": { - "x": 240, - "y": 160 + "x": 306.90650677326227, + "y": 201.19920053297804 } }, "maps/grid.json.tmj": { @@ -32,6 +32,14 @@ "y": 176.08265552868764 } }, + "maps/grid_game_objects.json": { + "scale": 1.72, + "selectedLayer": 0, + "viewCenter": { + "x": 240.11627906976744, + "y": 159.88372093023258 + } + }, "maps/hexgrid.json": { "expandedObjectLayers": [ 2 @@ -44,11 +52,11 @@ } }, "maps/hexgrid_pointy.json": { - "scale": 0.5, - "selectedLayer": 0, + "scale": 0.4687, + "selectedLayer": 1, "viewCenter": { - "x": 826, - "y": 820 + "x": 738.2120759547685, + "y": 823.5545124813312 } }, "maps/isogrid.json": { @@ -126,6 +134,7 @@ "project": "detiled.tiled-project", "property.type": "float", "recentFiles": [ + "maps/grid_game_objects.json", "tilesets/grid_tileset.json", "tilesets/grid_items.json", "maps/grid.json", @@ -136,8 +145,7 @@ "maps/hexgrid.json", ":/automap-tiles.tsx", "maps/grid.json.tmj", - "tilesets/grid_tileset.tsx", - "tilesets/grid_tileset.json.tsj" + "tilesets/grid_tileset.tsx" ], "tileset.lastUsedFormat": "json", "tileset.tileSize": { diff --git a/tiled/maps/grid_game_objects.json b/tiled/maps/grid_game_objects.json new file mode 100644 index 0000000..9cb0170 --- /dev/null +++ b/tiled/maps/grid_game_objects.json @@ -0,0 +1,204 @@ +{ "compressionlevel":-1, + "height":20, + "infinite":false, + "layers":[ + { + "data":[65, 66, 65, 66, 65, 65, 66, 65, 66, 65, 66, 66, 65, 65, 65, 66, 66, 65, 65, 66, 66, 65, 65, 65, 66, 65, 66, 65, 65, 65, + 65, 65, 65, 66, 66, 66, 66, 66, 65, 66, 65, 66, 66, 65, 65, 66, 65, 65, 65, 65, 66, 65, 66, 65, 65, 65, 66, 65, 65, 66, + 65, 66, 66, 66, 65, 65, 65, 66, 66, 66, 66, 66, 65, 65, 66, 65, 66, 66, 65, 65, 66, 66, 65, 66, 66, 65, 66, 65, 65, 66, + 65, 65, 66, 66, 65, 65, 66, 66, 66, 66, 66, 65, 66, 66, 66, 65, 66, 65, 65, 66, 65, 66, 65, 66, 65, 65, 66, 66, 65, 65, + 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 65, 65, 66, 66, 65, 65, 65, 65, 66, 65, 66, 66, 65, 66, 66, 66, 66, 65, 66, 66, + 66, 66, 65, 66, 65, 65, 66, 66, 66, 65, 65, 66, 66, 65, 65, 66, 65, 65, 65, 65, 66, 66, 65, 66, 66, 65, 65, 66, 66, 65, + 65, 66, 66, 65, 66, 65, 155, 156, 157, 101, 102, 103, 65, 65, 66, 65, 65, 65, 66, 66, 66, 65, 65, 65, 66, 65, 66, 65, 65, 65, + 65, 66, 65, 65, 66, 65, 173, 174, 175, 119, 120, 121, 65, 66, 65, 65, 65, 66, 65, 66, 66, 66, 66, 65, 65, 65, 66, 65, 66, 66, + 65, 66, 66, 65, 66, 66, 191, 192, 193, 137, 138, 139, 65, 66, 65, 66, 66, 65, 65, 66, 66, 65, 65, 65, 66, 66, 65, 66, 66, 65, + 65, 65, 65, 65, 66, 66, 91, 92, 93, 96, 97, 98, 66, 66, 65, 65, 66, 65, 65, 66, 66, 66, 66, 66, 65, 65, 66, 65, 66, 66, + 66, 66, 66, 66, 66, 66, 109, 110, 111, 114, 115, 116, 65, 65, 66, 65, 65, 66, 65, 66, 65, 65, 66, 65, 65, 66, 65, 65, 65, 66, + 66, 66, 66, 65, 65, 65, 127, 128, 129, 132, 133, 134, 65, 65, 65, 66, 66, 66, 66, 65, 65, 66, 66, 66, 66, 65, 65, 65, 66, 66, + 66, 65, 66, 65, 65, 66, 65, 65, 66, 66, 65, 65, 66, 66, 65, 65, 66, 65, 65, 66, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, + 66, 66, 66, 65, 65, 65, 66, 66, 66, 65, 66, 66, 65, 65, 66, 65, 66, 66, 66, 66, 65, 65, 66, 65, 65, 66, 66, 65, 66, 65, + 65, 65, 66, 65, 65, 66, 66, 65, 65, 66, 65, 66, 65, 65, 65, 66, 65, 66, 65, 66, 65, 65, 66, 66, 66, 65, 66, 65, 65, 66, + 65, 65, 66, 66, 66, 65, 65, 65, 65, 66, 66, 66, 66, 65, 65, 65, 65, 66, 66, 65, 66, 65, 66, 66, 65, 66, 65, 65, 66, 66, + 65, 65, 66, 66, 66, 66, 65, 66, 66, 66, 66, 66, 66, 66, 66, 65, 66, 66, 65, 66, 66, 65, 65, 65, 65, 65, 66, 65, 66, 65, + 66, 66, 65, 65, 65, 65, 65, 66, 65, 65, 65, 65, 66, 66, 65, 66, 66, 65, 66, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 65, + 66, 66, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 65, 66, 65, 66, 66, 66, 66, 65, 65, 66, 66, 66, + 65, 65, 65, 66, 66, 65, 66, 66, 65, 66, 66, 66, 66, 66, 65, 66, 65, 66, 65, 66, 66, 65, 65, 66, 65, 65, 66, 65, 66, 66], + "height":20, + "id":1, + "name":"back", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }, + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 0, 0, 156, 174, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 156, 156, 156, 156, 156, 156, 174, 174, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, 174, 0, 0, 0, 0, 155, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 155, 156, 0, 173, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 174, 0, 173, 174, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 194, 176, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":20, + "id":4, + "name":"roads", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }, + { + "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + "height":20, + "id":3, + "name":"tile_items", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }, + { + "draworder":"topdown", + "id":2, + "name":"items", + "objects":[ + { + "gid":243, + "height":16, + "id":1, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":16, + "x":173.068, + "y":137.38 + }, + { + "gid":243, + "height":16, + "id":2, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":16, + "x":149.337, + "y":140.956 + }, + { + "gid":243, + "height":16, + "id":3, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":16, + "x":155.513, + "y":120.151 + }, + { + "gid":246, + "height":16, + "id":4, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":16, + "x":98.6251, + "y":180.616 + }, + { + "gid":246, + "height":16, + "id":5, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":16, + "x":157.139, + "y":162.086 + }, + { + "gid":246, + "height":16, + "id":6, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":16, + "x":100.901, + "y":117.226 + }], + "opacity":1, + "type":"objectgroup", + "visible":true, + "x":0, + "y":0 + }], + "nextlayerid":5, + "nextobjectid":7, + "orientation":"orthogonal", + "renderorder":"right-down", + "tiledversion":"1.11.2", + "tileheight":16, + "tilesets":[ + { + "firstgid":1, + "source":"..\/tilesets\/grid_tileset.json" + }, + { + "firstgid":235, + "source":"..\/tilesets\/grid_items.json" + }, + { + "firstgid":250, + "source":":\/automap-tiles.tsx" + }], + "tilewidth":16, + "type":"map", + "version":"1.10", + "width":30 +} \ No newline at end of file From 84416cda8ea159511698c449ac7594cbd742da8d Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 13:44:55 +0200 Subject: [PATCH 31/71] Update --- detiled/internal/detiled_internal.lua | 1 - .../example_grid_game_objects/example_grid_game_objects.script | 2 +- game.project | 2 +- 3 files changed, 2 insertions(+), 3 deletions(-) diff --git a/detiled/internal/detiled_internal.lua b/detiled/internal/detiled_internal.lua index 5680cbb..77b5a01 100644 --- a/detiled/internal/detiled_internal.lua +++ b/detiled/internal/detiled_internal.lua @@ -146,7 +146,6 @@ end ---@param tile_global_id number ---@return detiled.tileset.tile|nil, detiled.tileset|nil function M.get_tile_by_gid(map, tile_global_id) - -- TODO: is always tilesets goes in sorted order? for tileset_index = #map.tilesets, 1, -1 do local tileset = map.tilesets[tileset_index] local first_gid = tileset.firstgid diff --git a/example/example_grid_game_objects/example_grid_game_objects.script b/example/example_grid_game_objects/example_grid_game_objects.script index 422a89c..74d7c86 100644 --- a/example/example_grid_game_objects/example_grid_game_objects.script +++ b/example/example_grid_game_objects/example_grid_game_objects.script @@ -28,7 +28,7 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/grid_items.json") - --detiled.load_tileset("/tiled/tilesets/grid_tileset.json") + detiled.load_tileset("/tiled/tilesets/grid_tileset.json") local map = detiled.get_entity_from_map("/tiled/maps/grid_game_objects.json") spawn_map(map) diff --git a/game.project b/game.project index baa3b5b..cbd180b 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example_grid_game_objects/example_grid_game_objects.collectionc +main_collection = /example/example_isogrid/example_isogrid.collectionc [script] shared_state = 1 From ff77d2743dc55d8ca41cc92c60c7ed10f3044f36 Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 14:00:47 +0200 Subject: [PATCH 32/71] Fixes for isometric --- detiled/internal/grid/isometric.lua | 4 ++-- example/example_isogrid/example_isogrid.script | 2 -- tiled/detiled.tiled-session | 4 ++-- 3 files changed, 4 insertions(+), 6 deletions(-) diff --git a/detiled/internal/grid/isometric.lua b/detiled/internal/grid/isometric.lua index 55d4bbf..251c06d 100644 --- a/detiled/internal/grid/isometric.lua +++ b/detiled/internal/grid/isometric.lua @@ -8,7 +8,8 @@ local function get_scene_size(map_params) local tw = data.tile.width local th = data.tile.height local size_x = (w + h) * (tw / 2) - local size_y = (w + h - 1) * (th / 2) + local size_y = (w + h) * (th / 2) + return size_x, size_y end @@ -54,7 +55,6 @@ function M.cell_to_pos(i, j, map_params) y = data.scene.size_y - y end - x = x + tw / 2 y = y + (data.scene.invert_y and -th / 2 or th / 2) return x, y diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index 2d92280..cdfa4be 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -22,8 +22,6 @@ local function spawn_entity(entity) local scale = vmath.vector3(scale_x, scale_y, 1) local rot = vmath.quat_rotation_z(math.rad(rotation)) factory.create(factory_url, position, rot, nil, scale) - - print("Spawn entity: ", factory_url, position_x, position_y, position_z) end diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session index 3e17cbb..770ec62 100644 --- a/tiled/detiled.tiled-session +++ b/tiled/detiled.tiled-session @@ -36,8 +36,8 @@ "scale": 1.72, "selectedLayer": 0, "viewCenter": { - "x": 240.11627906976744, - "y": 159.88372093023258 + "x": 235.7558139534884, + "y": 155.52325581395354 } }, "maps/hexgrid.json": { From b5f5c7b745c04b340fec74f2f375cdec0149737b Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 14:40:41 +0200 Subject: [PATCH 33/71] Update --- .../example_isogrid/example_isogrid.script | 9 + tiled/maps/isogrid.json | 196 +++++++++++++++++- 2 files changed, 197 insertions(+), 8 deletions(-) diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index cdfa4be..afc8aa0 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -37,4 +37,13 @@ function init(self) detiled.load_tileset("/tiled/tilesets/isogrid_tileset.json") local map = detiled.get_entity_from_map("/tiled/maps/isogrid.json") spawn_map(map) + + msg.post(".", "acquire_input_focus") +end + + + +function on_input(self, action_id, action) + if action_id == hash("touch") and action.pressed then + end end diff --git a/tiled/maps/isogrid.json b/tiled/maps/isogrid.json index d4fde9b..9b66908 100644 --- a/tiled/maps/isogrid.json +++ b/tiled/maps/isogrid.json @@ -3,8 +3,8 @@ "infinite":false, "layers":[ { - "data":[76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + "data":[31, 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 1, 1, + 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 1, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 22, 22, 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, @@ -21,8 +21,8 @@ 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 31, 12, 6, 6, 10, 50, 12, 6, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 6, 6, 3, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76], + 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 61, + 22, 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 61, 61], "height":20, "id":1, "name":"tiles", @@ -67,12 +67,12 @@ "height":264, "id":3, "name":"", - "rotation":0, + "rotation":17.7996525766271, "type":"", "visible":true, "width":235, - "x":562.737420078054, - "y":533.281179938554 + "x":569.38717490984, + "y":524.515959668664 }, { "gid":2147483737, @@ -85,6 +85,186 @@ "width":66.7834096861822, "x":522.013819439409, "y":613.694351433714 + }, + { + "gid":90, + "height":221, + "id":5, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1680 + }, + { + "gid":90, + "height":221, + "id":6, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1632 + }, + { + "gid":90, + "height":221, + "id":7, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1536 + }, + { + "gid":90, + "height":221, + "id":8, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1440 + }, + { + "gid":90, + "height":221, + "id":9, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1344 + }, + { + "gid":90, + "height":221, + "id":10, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1248 + }, + { + "gid":90, + "height":221, + "id":12, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1152 + }, + { + "gid":90, + "height":221, + "id":13, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1008 + }, + { + "gid":90, + "height":221, + "id":14, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1056 + }, + { + "gid":90, + "height":221, + "id":15, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1104 + }, + { + "gid":90, + "height":221, + "id":16, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1200 + }, + { + "gid":90, + "height":221, + "id":18, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1296 + }, + { + "gid":90, + "height":221, + "id":19, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1392 + }, + { + "gid":90, + "height":221, + "id":21, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1488 + }, + { + "gid":90, + "height":221, + "id":23, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":768, + "y":1584 }], "opacity":1, "properties":[ @@ -99,7 +279,7 @@ "y":0 }], "nextlayerid":3, - "nextobjectid":5, + "nextobjectid":24, "orientation":"isometric", "renderorder":"right-down", "tiledversion":"1.11.2", From 5991a2b3f8c330dc732fdf9134412fb0c68681f3 Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 14:59:37 +0200 Subject: [PATCH 34/71] Update --- README.md | 16 +++++--- api/detiled_api.md | 41 +++++++++++++++++-- detiled/detiled.lua | 24 ++++++++++- detiled/internal/detiled_annotations.lua | 22 ++++++++++ detiled/internal/detiled_parser.lua | 37 +++++++++++++---- .../{hexgrid.lua => hexagonal_staggered.lua} | 24 +++++++++-- detiled/internal/grid/isometric.lua | 33 +++++++++++++-- .../{isogrid.lua => isometric_staggered.lua} | 29 +++++++++++-- .../grid/{grid.lua => orthogonal.lua} | 29 +++++++++++-- example/example_grid/example_grid.script | 4 +- .../example_grid_game_objects.script | 4 +- .../example_hexgrid/example_hexgrid.script | 4 +- .../example_hexgrid_pointy.script | 4 +- .../example_isogrid/example_isogrid.script | 8 +++- test/test_detiled.lua | 7 ++-- 15 files changed, 241 insertions(+), 45 deletions(-) rename detiled/internal/grid/{hexgrid.lua => hexagonal_staggered.lua} (82%) rename detiled/internal/grid/{isogrid.lua => isometric_staggered.lua} (70%) rename detiled/internal/grid/{grid.lua => orthogonal.lua} (70%) diff --git a/README.md b/README.md index fe46cf3..41530a1 100644 --- a/README.md +++ b/README.md @@ -61,11 +61,15 @@ After that, select `Project ▸ Fetch Libraries` to update [library dependencies 2. Convert Tiled maps to Decore entities: ```lua - -- Get entity prefab from map - local map = detiled.get_entity_from_map("/resources/maps/my_map.json") + -- Get map params and entities from map + local result = detiled.get_entity_from_map("/resources/maps/my_map.json") - -- Add to Decore world - world:addEntity(decore.create(map)) + -- Add entities to Decore world + for _, entity in ipairs(result.entities) do + world:addEntity(decore.create(entity)) + end + + -- Use result.map_params for coordinate conversion (cell_to_pos, pos_to_cell) ``` ### Prefab ID Resolution @@ -121,7 +125,9 @@ Look at [Shooting Circles](https://github.com/Insality/shooting_circles) or [Cos ```lua detiled.set_logger(logger_instance) detiled.load_tileset(tileset_path_or_data) -detiled.get_entity_from_map(map_path_or_data) +detiled.get_entity_from_map(map_path_or_data) -- returns { map_params, entities } +detiled.cell_to_pos(map_params, i, j) -- returns x, y +detiled.pos_to_cell(map_params, x, y) -- returns i, j ``` ### API Reference diff --git a/api/detiled_api.md b/api/detiled_api.md index 3071aa9..1c15301 100644 --- a/api/detiled_api.md +++ b/api/detiled_api.md @@ -7,6 +7,8 @@ - [set_logger](#set_logger) - [get_entity_from_map](#get_entity_from_map) - [load_tileset](#load_tileset) +- [cell_to_pos](#cell_to_pos) +- [pos_to_cell](#pos_to_cell) ### set_logger @@ -28,14 +30,13 @@ Set a logger instance detiled.get_entity_from_map(map_or_path) ``` -Load a tiled map as a Decore entity -You can add this entity with `world:addEntity(entity)` +Load a tiled map and return map params and entities. Use `result.entities` to spawn and `result.map_params` for coordinate conversion. - **Parameters:** - `map_or_path` *(string|detiled.map)*: - **Returns:** - - `` *(entity)*: + - *(table)* `{ map_params = table|nil, entities = detiled.entity[] }` ### load_tileset @@ -51,3 +52,37 @@ Load a tileset - **Returns:** - `` *(detiled.tileset)*: + +### cell_to_pos + +--- +```lua +detiled.cell_to_pos(map_params, i, j) +``` + +Convert cell indices to world position. Requires `map_params` from `get_entity_from_map` (same orientation as the map). + +- **Parameters:** + - `map_params` *(table)*: + - `i` *(number)*: column index + - `j` *(number)*: row index + +- **Returns:** + - *(number, number)*: x, y + +### pos_to_cell + +--- +```lua +detiled.pos_to_cell(map_params, x, y) +``` + +Convert world position to cell indices. Requires `map_params` from `get_entity_from_map`. + +- **Parameters:** + - `map_params` *(table)*: + - `x` *(number)*: world x + - `y` *(number)*: world y + +- **Returns:** + - *(number, number)*: i, j diff --git a/detiled/detiled.lua b/detiled/detiled.lua index b790f91..dfab070 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -16,14 +16,14 @@ end ---Load a tiled map as a Decore entity ---You can add this entity with `world:addEntity(entity)` ---@param map_or_path detiled.map|string ----@return detiled.entity[] +---@return detiled.get_entity_from_map_result function M.get_entity_from_map(map_or_path) local map = map_or_path if type(map_or_path) == "string" then map = detiled_internal.load_json(map_or_path) --[[@as detiled.map]] if not map then logger:error("Failed to load map", map_or_path) - return {} + return { map_params = nil, entities = {} } end end ---@cast map detiled.map @@ -32,6 +32,26 @@ function M.get_entity_from_map(map_or_path) end +---Convert cell indices to world position +---@param map_params detiled.map_params +---@param i number +---@param j number +---@return number, number +function M.cell_to_pos(map_params, i, j) + return detiled_parser.cell_to_pos(map_params, i, j) +end + + +---Convert world position to cell indices +---@param map_params detiled.map_params +---@param x number +---@param y number +---@return number, number +function M.pos_to_cell(map_params, x, y) + return detiled_parser.pos_to_cell(map_params, x, y) +end + + ---Load a tileset ---@param tileset_or_path detiled.tileset|string ---@return detiled.tileset diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 3785f9d..05e82aa 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -127,3 +127,25 @@ ---@class detiled.entity ---@field prefab_id string ---@field components table + +---@class detiled.map_params.tile +---@field width number +---@field height number +---@field side number|nil + +---@class detiled.map_params.scene +---@field invert_y boolean +---@field tiles_x number +---@field tiles_y number +---@field size_x number +---@field size_y number +---@field hexmap_type string|nil + +---@class detiled.map_params +---@field orientation string +---@field tile detiled.map_params.tile +---@field scene detiled.map_params.scene + +---@class detiled.get_entity_from_map_result +---@field map_params detiled.map_params|nil +---@field entities detiled.entity[] diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 662f42a..357ebf1 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -5,10 +5,10 @@ local base64 = require("detiled.internal.base64") local M = {} local GRID_MODULES = { - ["orthogonal"] = require("detiled.internal.grid.grid"), -- orthogonal - ["isometric"] = require("detiled.internal.grid.isometric"), -- isometric - ["staggered"] = require("detiled.internal.grid.isogrid"), -- isometric staggered - ["hexagonal"] = require("detiled.internal.grid.hexgrid"), -- hexagonal + ["orthogonal"] = require("detiled.internal.grid.orthogonal"), + ["isometric"] = require("detiled.internal.grid.isometric"), + ["staggered"] = require("detiled.internal.grid.isometric_staggered"), + ["hexagonal"] = require("detiled.internal.grid.hexagonal_staggered"), } @@ -274,11 +274,14 @@ end ---@param tiled_map detiled.map ----@return detiled.entity[] +---@return detiled.get_entity_from_map_result function M.get_entities(tiled_map) ---@type detiled.entity[] local entities = {} + local grid_module = GRID_MODULES[tiled_map.orientation] + local map_params = grid_module and grid_module.get_map_params_from_tiled(tiled_map) or nil + for layer_index = 1, #tiled_map.layers do local layer = tiled_map.layers[layer_index] @@ -297,7 +300,27 @@ function M.get_entities(tiled_map) end end - return entities + return { map_params = map_params, entities = entities } +end + + +---@param map_params detiled.map_params +---@param i number +---@param j number +---@return number, number +function M.cell_to_pos(map_params, i, j) + local grid = GRID_MODULES[map_params.orientation] + return grid.cell_to_pos(i, j, map_params) +end + + +---@param map_params detiled.map_params +---@param x number +---@param y number +---@return number, number +function M.pos_to_cell(map_params, x, y) + local grid = GRID_MODULES[map_params.orientation] + return grid.pos_to_cell(x, y, map_params) end @@ -319,7 +342,7 @@ end ---@param tile detiled.tileset.tile|nil ---@param map_width number|nil ---@param map_height number|nil ----@param map_params table|nil +---@param map_params detiled.map_params|nil ---@return number, number, number, number function M.get_defold_position_from_tiled_object(object, tile, map_width, map_height, map_params) map_height = map_height or 0 diff --git a/detiled/internal/grid/hexgrid.lua b/detiled/internal/grid/hexagonal_staggered.lua similarity index 82% rename from detiled/internal/grid/hexgrid.lua rename to detiled/internal/grid/hexagonal_staggered.lua index a193eac..fcb076b 100644 --- a/detiled/internal/grid/hexgrid.lua +++ b/detiled/internal/grid/hexagonal_staggered.lua @@ -52,7 +52,7 @@ end ---@param tiled_data detiled.map ----@return table +---@return detiled.map_params function M.get_map_params_from_tiled(tiled_data) local hexmap_type = HEXMAP_TYPE.POINTYTOP if tiled_data.staggeraxis == "x" then @@ -60,6 +60,7 @@ function M.get_map_params_from_tiled(tiled_data) end local map_params = {} + map_params.orientation = "hexagonal" map_params.tile = { width = tiled_data.tilewidth - 1, height = tiled_data.tileheight - 1, @@ -84,7 +85,7 @@ end ---@param i number ---@param j number ----@param map_params table +---@param map_params detiled.map_params ---@return number, number function M.cell_to_pos(i, j, map_params) if map_params.scene.hexmap_type == HEXMAP_TYPE.POINTYTOP then @@ -98,10 +99,26 @@ function M.cell_to_pos(i, j, map_params) end +---@param x number +---@param y number +---@param map_params detiled.map_params +---@return number, number +function M.pos_to_cell(x, y, map_params) + if map_params.scene.hexmap_type == HEXMAP_TYPE.POINTYTOP then + return hexgrid_convert.pos_to_cell_pointytop(x, y, map_params) + end + if map_params.scene.hexmap_type == HEXMAP_TYPE.FLATTOP then + return hexgrid_convert.pos_to_cell_flattop(x, y, map_params) + end + + return 0, 0 +end + + ---@param i number ---@param j number ---@param z_layer number|nil ----@param map_params table +---@param map_params detiled.map_params ---@return number, number, number function M.get_tile_pos(i, j, z_layer, map_params) z_layer = z_layer or 0 @@ -116,4 +133,3 @@ end return M - diff --git a/detiled/internal/grid/isometric.lua b/detiled/internal/grid/isometric.lua index 251c06d..bc0386a 100644 --- a/detiled/internal/grid/isometric.lua +++ b/detiled/internal/grid/isometric.lua @@ -15,9 +15,10 @@ end ---@param tiled_data detiled.map ----@return table +---@return detiled.map_params function M.get_map_params_from_tiled(tiled_data) local map_params = {} + map_params.orientation = "isometric" map_params.tile = { width = tiled_data.tilewidth, height = tiled_data.tileheight, @@ -40,7 +41,7 @@ end ---@param i number ---@param j number ----@param map_params table +---@param map_params detiled.map_params ---@return number, number function M.cell_to_pos(i, j, map_params) local data = map_params @@ -61,10 +62,36 @@ function M.cell_to_pos(i, j, map_params) end +---@param x number +---@param y number +---@param map_params detiled.map_params +---@return number, number +function M.pos_to_cell(x, y, map_params) + local data = map_params + local h = data.scene.tiles_y + local tw = data.tile.width + local th = data.tile.height + + local sum_ij + if data.scene.invert_y then + sum_ij = 2 * (data.scene.size_y - th / 2 - y) / th + else + y = y - th / 2 + sum_ij = 2 * y / th + end + + local diff_ij = 2 * x / tw - h + local i = (sum_ij + diff_ij) / 2 + local j = (sum_ij - diff_ij) / 2 + + return math.floor(i + 0.5), math.floor(j + 0.5) +end + + ---@param i number ---@param j number ---@param z_layer number|nil ----@param map_params table +---@param map_params detiled.map_params ---@return number, number, number function M.get_tile_pos(i, j, z_layer, map_params) z_layer = z_layer or 0 diff --git a/detiled/internal/grid/isogrid.lua b/detiled/internal/grid/isometric_staggered.lua similarity index 70% rename from detiled/internal/grid/isogrid.lua rename to detiled/internal/grid/isometric_staggered.lua index 6df5394..61ec53a 100644 --- a/detiled/internal/grid/isogrid.lua +++ b/detiled/internal/grid/isometric_staggered.lua @@ -11,9 +11,10 @@ end ---@param tiled_data detiled.map ----@return table +---@return detiled.map_params function M.get_map_params_from_tiled(tiled_data) local map_params = {} + map_params.orientation = "staggered" map_params.tile = { width = tiled_data.tilewidth, height = tiled_data.tileheight, @@ -36,7 +37,7 @@ end ---@param i number ---@param j number ----@param map_params table +---@param map_params detiled.map_params ---@return number, number function M.cell_to_pos(i, j, map_params) local data = map_params @@ -55,10 +56,31 @@ function M.cell_to_pos(i, j, map_params) end +---@param x number +---@param y number +---@param map_params detiled.map_params +---@return number, number +function M.pos_to_cell(x, y, map_params) + local data = map_params + + x = x - data.tile.width / 2 + y = y - (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + local j = math.floor(y / (data.tile.height / 2) + 0.5) + local i = math.floor((x / data.tile.width) - 0.5 * (bit.band(j, 1)) + 0.5) + + return i, j +end + + ---@param i number ---@param j number ---@param z_layer number|nil ----@param map_params table +---@param map_params detiled.map_params ---@return number, number, number function M.get_tile_pos(i, j, z_layer, map_params) z_layer = z_layer or 0 @@ -73,4 +95,3 @@ end return M - diff --git a/detiled/internal/grid/grid.lua b/detiled/internal/grid/orthogonal.lua similarity index 70% rename from detiled/internal/grid/grid.lua rename to detiled/internal/grid/orthogonal.lua index 51ad430..bfeb17a 100644 --- a/detiled/internal/grid/grid.lua +++ b/detiled/internal/grid/orthogonal.lua @@ -11,9 +11,10 @@ end ---@param tiled_data detiled.map ----@return table +---@return detiled.map_params function M.get_map_params_from_tiled(tiled_data) local map_params = {} + map_params.orientation = "orthogonal" map_params.tile = { width = tiled_data.tilewidth, height = tiled_data.tileheight, @@ -36,7 +37,7 @@ end ---@param i number ---@param j number ----@param map_params table +---@param map_params detiled.map_params ---@return number, number function M.cell_to_pos(i, j, map_params) local data = map_params @@ -55,10 +56,31 @@ function M.cell_to_pos(i, j, map_params) end +---@param x number +---@param y number +---@param map_params detiled.map_params +---@return number, number +function M.pos_to_cell(x, y, map_params) + local data = map_params + + x = x - data.tile.width / 2 + y = y - (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + local i = math.floor(x / data.tile.width + 0.5) + local j = math.floor(y / data.tile.height + 0.5) + + return i, j +end + + ---@param i number ---@param j number ---@param z_layer number|nil ----@param map_params table +---@param map_params detiled.map_params ---@return number, number, number function M.get_tile_pos(i, j, z_layer, map_params) z_layer = z_layer or 0 @@ -73,4 +95,3 @@ end return M - diff --git a/example/example_grid/example_grid.script b/example/example_grid/example_grid.script index c5731de..f41140e 100644 --- a/example/example_grid/example_grid.script +++ b/example/example_grid/example_grid.script @@ -29,6 +29,6 @@ function init(self) detiled.load_tileset("/tiled/tilesets/grid_items.json") detiled.load_tileset("/tiled/tilesets/grid_tileset.json") - local map = detiled.get_entity_from_map("/tiled/maps/grid.json") - spawn_map(map) + local result = detiled.get_entity_from_map("/tiled/maps/grid.json") + spawn_map(result.entities) end diff --git a/example/example_grid_game_objects/example_grid_game_objects.script b/example/example_grid_game_objects/example_grid_game_objects.script index 74d7c86..0859b77 100644 --- a/example/example_grid_game_objects/example_grid_game_objects.script +++ b/example/example_grid_game_objects/example_grid_game_objects.script @@ -30,6 +30,6 @@ function init(self) detiled.load_tileset("/tiled/tilesets/grid_items.json") detiled.load_tileset("/tiled/tilesets/grid_tileset.json") - local map = detiled.get_entity_from_map("/tiled/maps/grid_game_objects.json") - spawn_map(map) + local result = detiled.get_entity_from_map("/tiled/maps/grid_game_objects.json") + spawn_map(result.entities) end diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index 6f4c7b9..b52ea12 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -31,6 +31,6 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_tiles.json") detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") - local map = detiled.get_entity_from_map("/tiled/maps/hexgrid.json") - spawn_map(map) + local result = detiled.get_entity_from_map("/tiled/maps/hexgrid.json") + spawn_map(result.entities) end diff --git a/example/example_hexgrid_pointy/example_hexgrid_pointy.script b/example/example_hexgrid_pointy/example_hexgrid_pointy.script index c1a1822..9cc4faa 100644 --- a/example/example_hexgrid_pointy/example_hexgrid_pointy.script +++ b/example/example_hexgrid_pointy/example_hexgrid_pointy.script @@ -32,6 +32,6 @@ function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_tiles.json") detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") detiled.load_tileset("/tiled/tilesets/hexgrid_pointy.json") - local map = detiled.get_entity_from_map("/tiled/maps/hexgrid_pointy.json") - spawn_map(map) + local result = detiled.get_entity_from_map("/tiled/maps/hexgrid_pointy.json") + spawn_map(result.entities) end diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index afc8aa0..953673b 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -35,8 +35,9 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") detiled.load_tileset("/tiled/tilesets/isogrid_tileset.json") - local map = detiled.get_entity_from_map("/tiled/maps/isogrid.json") - spawn_map(map) + local result = detiled.get_entity_from_map("/tiled/maps/isogrid.json") + spawn_map(result.entities) + self.map_params = result.map_params msg.post(".", "acquire_input_focus") end @@ -45,5 +46,8 @@ end function on_input(self, action_id, action) if action_id == hash("touch") and action.pressed then + local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) + local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) + local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) end end diff --git a/test/test_detiled.lua b/test/test_detiled.lua index 26230b5..6830184 100644 --- a/test/test_detiled.lua +++ b/test/test_detiled.lua @@ -9,9 +9,10 @@ return function() it("Should init correclty", function() detiled.load_tileset("/resources/tilesets/shooting_circle.json") - local entity = detiled.get_entity_from_map("/resources/maps/game.json") - assert(entity) - assert(entity.child_instancies) + local result = detiled.get_entity_from_map("/resources/maps/game.json") + assert(result) + assert(result.entities) + assert(result.map_params) end) end) end From 1702828ffa8fe7384b24a2cdc0a11a24be240690 Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 15:13:55 +0200 Subject: [PATCH 35/71] Update --- example/example_grid/example_grid.script | 13 +++++++++++++ .../example_grid_game_objects.script | 13 +++++++++++++ example/example_hexgrid/example_hexgrid.script | 13 +++++++++++++ .../example_hexgrid_pointy.script | 13 +++++++++++++ example/example_isogrid/example_isogrid.script | 1 + 5 files changed, 53 insertions(+) diff --git a/example/example_grid/example_grid.script b/example/example_grid/example_grid.script index f41140e..e4a7a07 100644 --- a/example/example_grid/example_grid.script +++ b/example/example_grid/example_grid.script @@ -31,4 +31,17 @@ function init(self) local result = detiled.get_entity_from_map("/tiled/maps/grid.json") spawn_map(result.entities) + self.map_params = result.map_params + + msg.post(".", "acquire_input_focus") +end + + +function on_input(self, action_id, action) + if action_id == hash("touch") and action.pressed then + local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) + local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) + local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) + print("touch cell", cell_i, cell_j, "pos", position_x, position_y) + end end diff --git a/example/example_grid_game_objects/example_grid_game_objects.script b/example/example_grid_game_objects/example_grid_game_objects.script index 0859b77..74684ee 100644 --- a/example/example_grid_game_objects/example_grid_game_objects.script +++ b/example/example_grid_game_objects/example_grid_game_objects.script @@ -32,4 +32,17 @@ function init(self) local result = detiled.get_entity_from_map("/tiled/maps/grid_game_objects.json") spawn_map(result.entities) + self.map_params = result.map_params + + msg.post(".", "acquire_input_focus") +end + + +function on_input(self, action_id, action) + if action_id == hash("touch") and action.pressed then + local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) + local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) + local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) + print("touch cell", cell_i, cell_j, "pos", position_x, position_y) + end end diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index b52ea12..1c5d99f 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -33,4 +33,17 @@ function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") local result = detiled.get_entity_from_map("/tiled/maps/hexgrid.json") spawn_map(result.entities) + self.map_params = result.map_params + + msg.post(".", "acquire_input_focus") +end + + +function on_input(self, action_id, action) + if action_id == hash("touch") and action.pressed then + local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) + local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) + local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) + print("touch cell", cell_i, cell_j, "pos", position_x, position_y) + end end diff --git a/example/example_hexgrid_pointy/example_hexgrid_pointy.script b/example/example_hexgrid_pointy/example_hexgrid_pointy.script index 9cc4faa..1f50bca 100644 --- a/example/example_hexgrid_pointy/example_hexgrid_pointy.script +++ b/example/example_hexgrid_pointy/example_hexgrid_pointy.script @@ -34,4 +34,17 @@ function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_pointy.json") local result = detiled.get_entity_from_map("/tiled/maps/hexgrid_pointy.json") spawn_map(result.entities) + self.map_params = result.map_params + + msg.post(".", "acquire_input_focus") +end + + +function on_input(self, action_id, action) + if action_id == hash("touch") and action.pressed then + local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) + local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) + local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) + print("touch cell", cell_i, cell_j, "pos", position_x, position_y) + end end diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index 953673b..b140a88 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -49,5 +49,6 @@ function on_input(self, action_id, action) local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) + print("touch cell", cell_i, cell_j, "pos", position_x, position_y) end end From f80a98d2e9c699c024ccc4a351831e89640f7a6f Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 15:26:06 +0200 Subject: [PATCH 36/71] Update --- .gitignore | 3 +- example/assets/isogrid/entities/roadHill2S.go | 2 +- example/assets/isogrid/entities/roadHill2W.go | 2 +- .../example_isogrid_staggered.collection | 78 +++++++++++ .../example_isogrid_staggered.script | 53 ++++++++ game.project | 2 +- tiled/detiled.tiled-session | 6 +- tiled/maps/isogrid_staggered.json | 122 ++++++++++++++++++ 8 files changed, 261 insertions(+), 7 deletions(-) create mode 100644 example/example_isogrid_staggered/example_isogrid_staggered.collection create mode 100644 example/example_isogrid_staggered/example_isogrid_staggered.script create mode 100644 tiled/maps/isogrid_staggered.json diff --git a/.gitignore b/.gitignore index 445277d..042850f 100644 --- a/.gitignore +++ b/.gitignore @@ -8,4 +8,5 @@ Thumbs.db .project .cproject builtins -/.editor_settings \ No newline at end of file +/.editor_settings +*.tiled-session diff --git a/example/assets/isogrid/entities/roadHill2S.go b/example/assets/isogrid/entities/roadHill2S.go index 0661f42..45af691 100644 --- a/example/assets/isogrid/entities/roadHill2S.go +++ b/example/assets/isogrid/entities/roadHill2S.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 8.0 + y: 14.0 } } diff --git a/example/assets/isogrid/entities/roadHill2W.go b/example/assets/isogrid/entities/roadHill2W.go index ba2ad2b..59b5806 100644 --- a/example/assets/isogrid/entities/roadHill2W.go +++ b/example/assets/isogrid/entities/roadHill2W.go @@ -9,6 +9,6 @@ embedded_components { "}\n" "" position { - y: 8.0 + y: 14.0 } } diff --git a/example/example_isogrid_staggered/example_isogrid_staggered.collection b/example/example_isogrid_staggered/example_isogrid_staggered.collection new file mode 100644 index 0000000..22fa2c4 --- /dev/null +++ b/example/example_isogrid_staggered/example_isogrid_staggered.collection @@ -0,0 +1,78 @@ +name: "example_isogrid_staggered" +instances { + id: "entities" + prototype: "/example/assets/isogrid/entities.go" +} +scale_along_z: 0 +embedded_instances { + id: "go" + data: "components {\n" + " id: \"example_isogrid_staggered\"\n" + " component: \"/example/example_isogrid_staggered/example_isogrid_staggered.script\"\n" + "}\n" + "" +} +embedded_instances { + id: "background" + data: "embedded_components {\n" + " id: \"sprite\"\n" + " type: \"sprite\"\n" + " data: \"default_animation: \\\"pixel\\\"\\n" + "material: \\\"/builtins/materials/sprite.material\\\"\\n" + "slice9 {\\n" + " x: 2.0\\n" + " y: 2.0\\n" + " z: 2.0\\n" + " w: 2.0\\n" + "}\\n" + "size {\\n" + " x: 2928.0\\n" + " y: 504.0\\n" + "}\\n" + "size_mode: SIZE_MODE_MANUAL\\n" + "textures {\\n" + " sampler: \\\"texture_sampler\\\"\\n" + " texture: \\\"/druid/druid.atlas\\\"\\n" + "}\\n" + "\"\n" + " position {\n" + " x: 1464.0\n" + " y: 252.0\n" + " z: -1.0\n" + " }\n" + "}\n" + "" +} +embedded_instances { + id: "camera" + data: "components {\n" + " id: \"camera_wasd_control\"\n" + " component: \"/example/assets/camera_wasd_control.script\"\n" + " properties {\n" + " id: \"movement_speed\"\n" + " value: \"600.0\"\n" + " type: PROPERTY_TYPE_NUMBER\n" + " }\n" + " properties {\n" + " id: \"zoom_speed\"\n" + " value: \"2.0\"\n" + " type: PROPERTY_TYPE_NUMBER\n" + " }\n" + "}\n" + "embedded_components {\n" + " id: \"camera\"\n" + " type: \"camera\"\n" + " data: \"aspect_ratio: 1.0\\n" + "fov: 0.7854\\n" + "near_z: -100.0\\n" + "far_z: 1000.0\\n" + "orthographic_projection: 1\\n" + "\"\n" + "}\n" + "" + position { + x: 480.0 + y: 320.0 + z: -10.0 + } +} diff --git a/example/example_isogrid_staggered/example_isogrid_staggered.script b/example/example_isogrid_staggered/example_isogrid_staggered.script new file mode 100644 index 0000000..1456d45 --- /dev/null +++ b/example/example_isogrid_staggered/example_isogrid_staggered.script @@ -0,0 +1,53 @@ +local detiled = require("detiled.detiled") + + +local function get_z_position(position_x, position_y) + return -position_y / 10000 + position_x / 100000 +end + + +local function spawn_entity(entity) + local prefab_id = entity.prefab_id + local components = entity.components + local transform = components.transform + local position_x = transform.position_x + local position_y = transform.position_y + local position_z = transform.position_z + get_z_position(position_x, position_y) + local scale_x = transform.scale_x or 1 + local scale_y = transform.scale_y or 1 + local rotation = transform.rotation or 0 + + local factory_url = "/entities#" .. prefab_id + local position = vmath.vector3(position_x, position_y, position_z) + local scale = vmath.vector3(scale_x, scale_y, 1) + local rot = vmath.quat_rotation_z(math.rad(rotation)) + factory.create(factory_url, position, rot, nil, scale) +end + + +local function spawn_map(entities) + for _, entity in ipairs(entities) do + spawn_entity(entity) + end +end + + +function init(self) + detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") + detiled.load_tileset("/tiled/tilesets/isogrid_tileset.json") + local result = detiled.get_entity_from_map("/tiled/maps/isogrid_staggered.json") + spawn_map(result.entities) + self.map_params = result.map_params + + msg.post(".", "acquire_input_focus") +end + + +function on_input(self, action_id, action) + if action_id == hash("touch") and action.pressed then + local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) + local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) + local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) + print("touch cell", cell_i, cell_j, "pos", position_x, position_y) + end +end diff --git a/game.project b/game.project index cbd180b..4ed4d6a 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example_isogrid/example_isogrid.collectionc +main_collection = /example/example_isogrid_staggered/example_isogrid_staggered.collectionc [script] shared_state = 1 diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session index 770ec62..2e814a4 100644 --- a/tiled/detiled.tiled-session +++ b/tiled/detiled.tiled-session @@ -63,11 +63,11 @@ "expandedObjectLayers": [ 2 ], - "scale": 0.4068, + "scale": 0.2972, "selectedLayer": 1, "viewCenter": { - "x": 1199.60668633235, - "y": 599.803343166175 + "x": 918.5733512786002, + "y": 1202.8936742934047 } }, "tilesets/grid_items.json": { diff --git a/tiled/maps/isogrid_staggered.json b/tiled/maps/isogrid_staggered.json new file mode 100644 index 0000000..c4f56cd --- /dev/null +++ b/tiled/maps/isogrid_staggered.json @@ -0,0 +1,122 @@ +{ "compressionlevel":-1, + "height":20, + "infinite":false, + "layers":[ + { + "data":[31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 1, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 1, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 76, 76, 76, 76, 76, 1, 1, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 31, 31, 31, 76, 76, 76, 76, 31, 76, 76, 76, 31, 31, 76, 76, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 31, 31, 76, 76, 76, 31, 31, 76, 76, 76, 31, 44, 31, 76, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 31, 31, 31, 76, 76, 31, 31, 31, 76, 76, 31, 45, 42, 31, 76, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 31, 31, 31, 76, 76, 31, 31, 31, 76, 76, 31, 31, 20, 75, 31, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 31, 31, 31, 76, 31, 31, 31, 31, 76, 31, 31, 68, 72, 24, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 31, 31, 31, 76, 31, 31, 31, 31, 76, 31, 31, 63, 31, 84, 76, 76, 76, 1, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 31, 31, 31, 76, 31, 31, 31, 31, 81, 31, 67, 31, 85, 76, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 31, 31, 76, 31, 31, 31, 31, 76, 81, 23, 31, 31, 79, 76, 76, 76, 1, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 31, 31, 76, 31, 31, 31, 76, 76, 81, 31, 31, 83, 76, 76, 76, 76, 1, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 31, 31, 76, 76, 31, 31, 76, 76, 76, 81, 31, 83, 76, 76, 76, 76, 76, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 31, 76, 76, 76, 76, 76, 76, 76, 76, 81, 83, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 78, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 22, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 61], + "height":20, + "id":1, + "name":"tiles", + "opacity":1, + "type":"tilelayer", + "visible":true, + "width":30, + "x":0, + "y":0 + }, + { + "draworder":"topdown", + "id":2, + "name":"objects", + "objects":[ + { + "gid":89, + "height":264, + "id":24, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":451.133276377616, + "y":379.757368645878 + }, + { + "gid":89, + "height":264, + "id":25, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":235, + "x":724.520717642033, + "y":274.389292325217 + }, + { + "gid":89, + "height":149.04888266469, + "id":26, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":132.676088735614, + "x":1581.2189248366, + "y":157.77818320816 + }, + { + "gid":90, + "height":221, + "id":27, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":169, + "x":2130.14706811718, + "y":114.611249040762 + }], + "opacity":1, + "properties":[ + { + "name":"position_z", + "type":"float", + "value":1 + }], + "type":"objectgroup", + "visible":true, + "x":0, + "y":0 + }], + "nextlayerid":3, + "nextobjectid":28, + "orientation":"staggered", + "renderorder":"right-down", + "staggeraxis":"y", + "staggerindex":"odd", + "tiledversion":"1.11.2", + "tileheight":48, + "tilesets":[ + { + "firstgid":1, + "source":"..\/tilesets\/isogrid_tileset.json" + }, + { + "firstgid":89, + "source":"..\/tilesets\/hexgrid_objects.json" + }], + "tilewidth":96, + "type":"map", + "version":"1.10", + "width":30 +} \ No newline at end of file From 33e169e60c542ecaac88b359d16af9f53372b88a Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 15:41:25 +0200 Subject: [PATCH 37/71] Add even/odd for the hexagonal staggered index support --- detiled/internal/detiled_annotations.lua | 2 ++ detiled/internal/grid/hexagonal_staggered.lua | 3 +++ .../internal/grid/hexgrid_convertations.lua | 20 +++++++++++++++---- game.project | 2 +- tiled/maps/hexgrid.json | 2 +- 5 files changed, 23 insertions(+), 6 deletions(-) diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 05e82aa..117fee8 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -78,6 +78,7 @@ ---@field version string ---@field width number ---@field staggeraxis string +---@field staggerindex string ---@field hexsidelength number ---@class detiled.map.layer @@ -140,6 +141,7 @@ ---@field size_x number ---@field size_y number ---@field hexmap_type string|nil +---@field stagger_index string|nil "odd" or "even" ---@class detiled.map_params ---@field orientation string diff --git a/detiled/internal/grid/hexagonal_staggered.lua b/detiled/internal/grid/hexagonal_staggered.lua index fcb076b..b591573 100644 --- a/detiled/internal/grid/hexagonal_staggered.lua +++ b/detiled/internal/grid/hexagonal_staggered.lua @@ -59,6 +59,8 @@ function M.get_map_params_from_tiled(tiled_data) hexmap_type = HEXMAP_TYPE.FLATTOP end + local stagger_index = tiled_data.staggerindex or "odd" + local map_params = {} map_params.orientation = "hexagonal" map_params.tile = { @@ -73,6 +75,7 @@ function M.get_map_params_from_tiled(tiled_data) size_x = 0, size_y = 0, hexmap_type = hexmap_type, + stagger_index = stagger_index, } local size_x, size_y = get_scene_size(map_params) diff --git a/detiled/internal/grid/hexgrid_convertations.lua b/detiled/internal/grid/hexgrid_convertations.lua index d583692..0573d59 100644 --- a/detiled/internal/grid/hexgrid_convertations.lua +++ b/detiled/internal/grid/hexgrid_convertations.lua @@ -6,12 +6,21 @@ local function round(x) end +local function stagger_offset(idx, stagger_index) + if stagger_index == "even" then + return 0.5 * (1 - bit.band(idx, 1)) + end + return 0.5 * bit.band(idx, 1) +end + + function M.cell_to_pos_flattop(i, j, data) local part_size = data.tile.width - data.tile.side local two_hex_width = data.tile.side * 2 + part_size + local stagger_index = data.scene.stagger_index or "odd" local x = two_hex_width / 2 * i - local y = data.tile.height * (j + 0.5 * (bit.band(i, 1))) + local y = data.tile.height * (j + stagger_offset(i, stagger_index)) if data.scene.invert_y then y = data.scene.size_y - y @@ -26,6 +35,7 @@ end function M.pos_to_cell_flattop(x, y, map_params) local data = map_params + local stagger_index = data.scene.stagger_index or "odd" local part_size = data.tile.width - data.tile.side local two_hex_width = data.tile.side * 2 + part_size @@ -38,7 +48,7 @@ function M.pos_to_cell_flattop(x, y, map_params) end local i = round(2 * x / two_hex_width) - local j = round(y / data.tile.height - 0.5 * bit.band(i, 1)) + local j = round(y / data.tile.height - stagger_offset(i, stagger_index)) return i, j end @@ -47,8 +57,9 @@ end function M.cell_to_pos_pointytop(i, j, data) local part_size = data.tile.height - data.tile.side local two_hex_height = data.tile.side * 2 + part_size + local stagger_index = data.scene.stagger_index or "odd" - local x = data.tile.width * (i + 0.5 * (bit.band(j, 1))) + local x = data.tile.width * (i + stagger_offset(j, stagger_index)) local y = two_hex_height / 2 * j if data.scene.invert_y then @@ -64,6 +75,7 @@ end function M.pos_to_cell_pointytop(x, y, map_params) local data = map_params + local stagger_index = data.scene.stagger_index or "odd" local part_size = data.tile.height - data.tile.side local two_hex_height = data.tile.side * 2 + part_size @@ -76,7 +88,7 @@ function M.pos_to_cell_pointytop(x, y, map_params) end local j = round(2 * y / two_hex_height) - local i = round(x / data.tile.width - 0.5 * bit.band(j, 1)) + local i = round(x / data.tile.width - stagger_offset(j, stagger_index)) return i, j end diff --git a/game.project b/game.project index 4ed4d6a..61cc479 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example_isogrid_staggered/example_isogrid_staggered.collectionc +main_collection = /example/example_hexgrid/example_hexgrid.collectionc [script] shared_state = 1 diff --git a/tiled/maps/hexgrid.json b/tiled/maps/hexgrid.json index a05ab91..edf3cb3 100644 --- a/tiled/maps/hexgrid.json +++ b/tiled/maps/hexgrid.json @@ -477,7 +477,7 @@ "orientation":"hexagonal", "renderorder":"right-down", "staggeraxis":"x", - "staggerindex":"odd", + "staggerindex":"even", "tiledversion":"1.11.2", "tileheight":145, "tilesets":[ From 8a4abfc84430bfd912db0847217e06c6cdc3c370 Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 15:43:25 +0200 Subject: [PATCH 38/71] Update --- tiled/detiled.tiled-session | 156 ------------------------------------ 1 file changed, 156 deletions(-) delete mode 100644 tiled/detiled.tiled-session diff --git a/tiled/detiled.tiled-session b/tiled/detiled.tiled-session deleted file mode 100644 index 2e814a4..0000000 --- a/tiled/detiled.tiled-session +++ /dev/null @@ -1,156 +0,0 @@ -{ - "Map/SizeTest": { - "height": 4300, - "width": 2 - }, - "activeFile": "maps/hexgrid.json", - "expandedProjectPaths": [ - "tilesets", - ".", - "maps" - ], - "file.lastUsedOpenFilter": "All Files (*)", - "fileStates": { - ":/automap-tiles.tsx": { - "dynamicWrapping": false, - "scaleInDock": 1, - "scaleInEditor": 1 - }, - "maps/grid.json": { - "scale": 2.2515, - "selectedLayer": 2, - "viewCenter": { - "x": 306.90650677326227, - "y": 201.19920053297804 - } - }, - "maps/grid.json.tmj": { - "scale": 2.2745, - "selectedLayer": 2, - "viewCenter": { - "x": 171.02659925258297, - "y": 176.08265552868764 - } - }, - "maps/grid_game_objects.json": { - "scale": 1.72, - "selectedLayer": 0, - "viewCenter": { - "x": 235.7558139534884, - "y": 155.52325581395354 - } - }, - "maps/hexgrid.json": { - "expandedObjectLayers": [ - 2 - ], - "scale": 1.78, - "selectedLayer": 1, - "viewCenter": { - "x": 162.92134831460675, - "y": 86.51685393258427 - } - }, - "maps/hexgrid_pointy.json": { - "scale": 0.4687, - "selectedLayer": 1, - "viewCenter": { - "x": 738.2120759547685, - "y": 823.5545124813312 - } - }, - "maps/isogrid.json": { - "expandedObjectLayers": [ - 2 - ], - "scale": 0.2972, - "selectedLayer": 1, - "viewCenter": { - "x": 918.5733512786002, - "y": 1202.8936742934047 - } - }, - "tilesets/grid_items.json": { - "dynamicWrapping": true, - "scaleInDock": 3.0191, - "scaleInEditor": 0.21 - }, - "tilesets/grid_items.tsj": { - "dynamicWrapping": true, - "scaleInDock": 1, - "scaleInEditor": 1 - }, - "tilesets/grid_items.tsx": { - "dynamicWrapping": true - }, - "tilesets/grid_tileset.json": { - "dynamicWrapping": false, - "scaleInDock": 2.4562, - "scaleInEditor": 0.21 - }, - "tilesets/grid_tileset.json.tsj": { - "scaleInDock": 1, - "scaleInEditor": 1.341 - }, - "tilesets/grid_tileset.tsx": { - "dynamicWrapping": false, - "scaleInDock": 1, - "scaleInEditor": 1 - }, - "tilesets/hexgrid_objects.json": { - "dynamicWrapping": true, - "scaleInDock": 1, - "scaleInEditor": 0.21 - }, - "tilesets/hexgrid_tiles.json": { - "dynamicWrapping": true, - "scaleInDock": 0.3806, - "scaleInEditor": 0.21 - }, - "tilesets/isogrid_tileset.json": { - "dynamicWrapping": true, - "scaleInDock": 0.5024, - "scaleInEditor": 0.21 - } - }, - "last.exportedFilePath": "/Users/insality/code/defold/detiled/tiled/export", - "last.imagePath": "/Users/insality/code/defold/detiled/tiled/assets/hexgrid_pointy", - "lastUsedTilesetExportFilter": "JSON tileset files (*.tsj *.json)", - "map.lastUsedExportFilter": "Defold Collection (*.collection)", - "map.lastUsedFormat": "json", - "map.orientation": "2", - "map.tileHeight": 182, - "map.tileWidth": 192, - "openFiles": [ - "tilesets/grid_tileset.json", - "tilesets/grid_items.json", - "maps/grid.json", - "maps/hexgrid.json", - "tilesets/hexgrid_tiles.json", - "tilesets/hexgrid_objects.json", - "maps/isogrid.json", - "tilesets/isogrid_tileset.json" - ], - "project": "detiled.tiled-project", - "property.type": "float", - "recentFiles": [ - "maps/grid_game_objects.json", - "tilesets/grid_tileset.json", - "tilesets/grid_items.json", - "maps/grid.json", - "tilesets/isogrid_tileset.json", - "maps/isogrid.json", - "tilesets/hexgrid_objects.json", - "tilesets/hexgrid_tiles.json", - "maps/hexgrid.json", - ":/automap-tiles.tsx", - "maps/grid.json.tmj", - "tilesets/grid_tileset.tsx" - ], - "tileset.lastUsedFormat": "json", - "tileset.tileSize": { - "height": 16, - "width": 16 - }, - "tileset.type": 1 -} From 96b5daa36922f99f4905dea35f7e9d68c3b13e8f Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 15:58:34 +0200 Subject: [PATCH 39/71] Update --- detiled/internal/detiled_annotations.lua | 1 + detiled/internal/grid/isometric_staggered.lua | 65 ++++++++++++++++--- tiled/maps/hexgrid.json | 2 +- tiled/maps/isogrid_staggered.json | 2 +- 4 files changed, 58 insertions(+), 12 deletions(-) diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 117fee8..ddd5a87 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -142,6 +142,7 @@ ---@field size_y number ---@field hexmap_type string|nil ---@field stagger_index string|nil "odd" or "even" +---@field stagger_axis string|nil "x" or "y", used for staggered orientation ---@class detiled.map_params ---@field orientation string diff --git a/detiled/internal/grid/isometric_staggered.lua b/detiled/internal/grid/isometric_staggered.lua index 61ec53a..8b64e2d 100644 --- a/detiled/internal/grid/isometric_staggered.lua +++ b/detiled/internal/grid/isometric_staggered.lua @@ -1,11 +1,35 @@ local M = {} +local STAGGER_AXIS = { + X = "x", + Y = "y", +} + + +local function stagger_offset(idx, stagger_index) + if stagger_index == "even" then + return 0.5 * (1 - bit.band(idx, 1)) + end + return 0.5 * bit.band(idx, 1) +end + local function get_scene_size(map_params) local data = map_params + local tw = data.tile.width + local th = data.tile.height + local nx = data.scene.tiles_x + local ny = data.scene.tiles_y + local axis = data.scene.stagger_axis or STAGGER_AXIS.Y + + if axis == STAGGER_AXIS.X then + local width = nx * tw + local height = ny * (th / 2) + th / 2 + return width, height + end - local width = data.scene.tiles_x * data.tile.width + data.tile.width / 2 - local height = data.tile.height + ((data.scene.tiles_y - 1) * data.tile.height/2) + local width = nx * tw + tw / 2 + local height = th + (ny - 1) * (th / 2) return width, height end @@ -13,6 +37,9 @@ end ---@param tiled_data detiled.map ---@return detiled.map_params function M.get_map_params_from_tiled(tiled_data) + local stagger_axis = tiled_data.staggeraxis or "y" + local stagger_index = tiled_data.staggerindex or "odd" + local map_params = {} map_params.orientation = "staggered" map_params.tile = { @@ -25,6 +52,8 @@ function M.get_map_params_from_tiled(tiled_data) tiles_y = tiled_data.height, size_x = 0, size_y = 0, + stagger_axis = stagger_axis, + stagger_index = stagger_index, } local size_x, size_y = get_scene_size(map_params) @@ -41,16 +70,24 @@ end ---@return number, number function M.cell_to_pos(i, j, map_params) local data = map_params - - local x = data.tile.width * (i + 0.5 * (bit.band(j, 1))) - local y = data.tile.height/2 * j + local axis = data.scene.stagger_axis or STAGGER_AXIS.Y + local stagger_index = data.scene.stagger_index or "odd" + local x, y + + if axis == STAGGER_AXIS.X then + x = data.tile.width * i + y = data.tile.height / 2 * (j + stagger_offset(i, stagger_index)) + else + x = data.tile.width * (i + stagger_offset(j, stagger_index)) + y = data.tile.height / 2 * j + end if data.scene.invert_y then y = data.scene.size_y - y end - x = x + data.tile.width/2 - y = y + (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) + x = x + data.tile.width / 2 + y = y + (data.scene.invert_y and -data.tile.height / 2 or data.tile.height / 2) return x, y end @@ -62,16 +99,24 @@ end ---@return number, number function M.pos_to_cell(x, y, map_params) local data = map_params + local axis = data.scene.stagger_axis or STAGGER_AXIS.Y + local stagger_index = data.scene.stagger_index or "odd" x = x - data.tile.width / 2 - y = y - (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) + y = y - (data.scene.invert_y and -data.tile.height / 2 or data.tile.height / 2) if data.scene.invert_y then y = data.scene.size_y - y end - local j = math.floor(y / (data.tile.height / 2) + 0.5) - local i = math.floor((x / data.tile.width) - 0.5 * (bit.band(j, 1)) + 0.5) + local i, j + if axis == STAGGER_AXIS.X then + i = math.floor(x / data.tile.width + 0.5) + j = math.floor(2 * y / data.tile.height - stagger_offset(i, stagger_index) + 0.5) + else + j = math.floor(2 * y / data.tile.height + 0.5) + i = math.floor(x / data.tile.width - stagger_offset(j, stagger_index) + 0.5) + end return i, j end diff --git a/tiled/maps/hexgrid.json b/tiled/maps/hexgrid.json index edf3cb3..a05ab91 100644 --- a/tiled/maps/hexgrid.json +++ b/tiled/maps/hexgrid.json @@ -477,7 +477,7 @@ "orientation":"hexagonal", "renderorder":"right-down", "staggeraxis":"x", - "staggerindex":"even", + "staggerindex":"odd", "tiledversion":"1.11.2", "tileheight":145, "tilesets":[ diff --git a/tiled/maps/isogrid_staggered.json b/tiled/maps/isogrid_staggered.json index c4f56cd..0ca21b3 100644 --- a/tiled/maps/isogrid_staggered.json +++ b/tiled/maps/isogrid_staggered.json @@ -102,7 +102,7 @@ "nextobjectid":28, "orientation":"staggered", "renderorder":"right-down", - "staggeraxis":"y", + "staggeraxis":"x", "staggerindex":"odd", "tiledversion":"1.11.2", "tileheight":48, From 42f3e7376519ae72e41a176e2f2d01b14326613c Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 16:14:43 +0200 Subject: [PATCH 40/71] stagger axis for isometric staggered --- detiled/internal/grid/isometric_staggered.lua | 12 ++++++------ tiled/maps/isogrid_staggered.json | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/detiled/internal/grid/isometric_staggered.lua b/detiled/internal/grid/isometric_staggered.lua index 8b64e2d..49a76a0 100644 --- a/detiled/internal/grid/isometric_staggered.lua +++ b/detiled/internal/grid/isometric_staggered.lua @@ -23,8 +23,8 @@ local function get_scene_size(map_params) local axis = data.scene.stagger_axis or STAGGER_AXIS.Y if axis == STAGGER_AXIS.X then - local width = nx * tw - local height = ny * (th / 2) + th / 2 + local width = nx * (tw / 2) + tw / 2 + local height = ny * th + th / 2 return width, height end @@ -75,8 +75,8 @@ function M.cell_to_pos(i, j, map_params) local x, y if axis == STAGGER_AXIS.X then - x = data.tile.width * i - y = data.tile.height / 2 * (j + stagger_offset(i, stagger_index)) + x = data.tile.width / 2 * i + y = data.tile.height * (j + stagger_offset(i, stagger_index)) else x = data.tile.width * (i + stagger_offset(j, stagger_index)) y = data.tile.height / 2 * j @@ -111,8 +111,8 @@ function M.pos_to_cell(x, y, map_params) local i, j if axis == STAGGER_AXIS.X then - i = math.floor(x / data.tile.width + 0.5) - j = math.floor(2 * y / data.tile.height - stagger_offset(i, stagger_index) + 0.5) + i = math.floor(2 * x / data.tile.width + 0.5) + j = math.floor(y / data.tile.height - stagger_offset(i, stagger_index) + 0.5) else j = math.floor(2 * y / data.tile.height + 0.5) i = math.floor(x / data.tile.width - stagger_offset(j, stagger_index) + 0.5) diff --git a/tiled/maps/isogrid_staggered.json b/tiled/maps/isogrid_staggered.json index 0ca21b3..4c4aaf1 100644 --- a/tiled/maps/isogrid_staggered.json +++ b/tiled/maps/isogrid_staggered.json @@ -99,7 +99,7 @@ "y":0 }], "nextlayerid":3, - "nextobjectid":28, + "nextobjectid":29, "orientation":"staggered", "renderorder":"right-down", "staggeraxis":"x", From 646dcd6493dc6dae1f08c1acad7659382eb0d79a Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 23:04:36 +0200 Subject: [PATCH 41/71] Update iso position --- detiled/internal/detiled_parser.lua | 15 +- detiled/internal/grid/isometric.lua | 48 +++- example/assets/camera_wasd_control.script | 1 + example/example_grid/example_grid.collection | 2 +- .../example_hexgrid_pointy.script | 3 +- .../example_isogrid.collection | 12 +- tiled/maps/hexgrid_pointy.json | 18 +- tiled/maps/isogrid.json | 228 ++++-------------- tiled/maps/isogrid_staggered.json | 2 +- 9 files changed, 122 insertions(+), 207 deletions(-) diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 357ebf1..21175e8 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -402,8 +402,19 @@ function M.get_defold_position_from_tiled_object(object, tile, map_width, map_he local position_x = object.x + rotated_offset_x local position_y = object.y - rotated_offset_y - if map_params and map_params.scene.invert_y then - position_y = map_height - position_y + if map_params then + local grid = GRID_MODULES[map_params.orientation] + if grid and grid.convert_object_position then + position_x, position_y = grid.convert_object_position(object.x, object.y, map_params) + local bottom_center_x = base_width / 2 + local bottom_center_y = 0 + local offset_x = (anchor_x - bottom_center_x) * cos + (anchor_y - bottom_center_y) * sin + local offset_y = -(anchor_x - bottom_center_x) * sin + (anchor_y - bottom_center_y) * cos + position_x = position_x + offset_x * scale_x + position_y = position_y + offset_y * scale_y + elseif map_params.scene.invert_y then + position_y = map_height - position_y + end end return position_x, position_y, scale_x, scale_y diff --git a/detiled/internal/grid/isometric.lua b/detiled/internal/grid/isometric.lua index bc0386a..82be1db 100644 --- a/detiled/internal/grid/isometric.lua +++ b/detiled/internal/grid/isometric.lua @@ -45,18 +45,18 @@ end ---@return number, number function M.cell_to_pos(i, j, map_params) local data = map_params - local h = data.scene.tiles_y - local tw = data.tile.width - local th = data.tile.height + local tile_count_y = data.scene.tiles_y + local tile_width = data.tile.width + local tile_height = data.tile.height - local x = (i - j + h) * (tw / 2) - local y = (i + j) * (th / 2) + local x = (i - j + tile_count_y) * (tile_width / 2) + 1 + local y = (i + j) * (tile_height / 2) if data.scene.invert_y then y = data.scene.size_y - y end - y = y + (data.scene.invert_y and -th / 2 or th / 2) + y = y + (data.scene.invert_y and -tile_height / 2 or tile_height / 2) return x, y end @@ -68,19 +68,19 @@ end ---@return number, number function M.pos_to_cell(x, y, map_params) local data = map_params - local h = data.scene.tiles_y - local tw = data.tile.width - local th = data.tile.height + local tile_count_y = data.scene.tiles_y + local tile_width = data.tile.width + local tile_height = data.tile.height local sum_ij if data.scene.invert_y then - sum_ij = 2 * (data.scene.size_y - th / 2 - y) / th + sum_ij = 2 * (data.scene.size_y - tile_height / 2 - y) / tile_height else - y = y - th / 2 - sum_ij = 2 * y / th + y = y - tile_height / 2 + sum_ij = 2 * y / tile_height end - local diff_ij = 2 * x / tw - h + local diff_ij = 2 * x / tile_width - tile_count_y local i = (sum_ij + diff_ij) / 2 local j = (sum_ij - diff_ij) / 2 @@ -88,6 +88,28 @@ function M.pos_to_cell(x, y, map_params) end +--- Get object position from Tiled, convert to defold map position +--- @param x number +--- @param y number +--- @param map_params detiled.map_params +--- @return number, number +function M.convert_object_position(x, y, map_params) + local tile_count_y = map_params.scene.tiles_y + local tw = map_params.tile.width + local th = map_params.tile.height + + local origin_x = (tile_count_y) * (tw / 2) + 1 + local origin_y = map_params.scene.size_y - th / 2 + + local offset_x = x - y + local offset_y = (th - x - y)/2 + + local out_x = origin_x + offset_x + local out_y = origin_y + offset_y + return out_x, out_y +end + + ---@param i number ---@param j number ---@param z_layer number|nil diff --git a/example/assets/camera_wasd_control.script b/example/assets/camera_wasd_control.script index e639baa..68a50d4 100644 --- a/example/assets/camera_wasd_control.script +++ b/example/assets/camera_wasd_control.script @@ -19,6 +19,7 @@ function update(self, dt) local p = go.get_position() p.x = p.x + self.move.x * self.movement_speed * dt p.y = p.y + self.move.y * self.movement_speed * dt + go.set_position(p) if self.zoom_delta ~= 0 then diff --git a/example/example_grid/example_grid.collection b/example/example_grid/example_grid.collection index 1145a25..b0c56b5 100644 --- a/example/example_grid/example_grid.collection +++ b/example/example_grid/example_grid.collection @@ -26,7 +26,7 @@ embedded_instances { " component: \"/example/assets/camera_wasd_control.script\"\n" " properties {\n" " id: \"movement_speed\"\n" - " value: \"100.0\"\n" + " value: \"250.0\"\n" " type: PROPERTY_TYPE_NUMBER\n" " }\n" " properties {\n" diff --git a/example/example_hexgrid_pointy/example_hexgrid_pointy.script b/example/example_hexgrid_pointy/example_hexgrid_pointy.script index 1f50bca..afec5b4 100644 --- a/example/example_hexgrid_pointy/example_hexgrid_pointy.script +++ b/example/example_hexgrid_pointy/example_hexgrid_pointy.script @@ -17,7 +17,8 @@ local function spawn_entity(entity) local factory_url = "/entities#" .. prefab_id local position = vmath.vector3(position_x, position_y, position_z) local scale = vmath.vector3(scale_x, scale_y, 1) - factory.create(factory_url, position, nil, nil, scale) + local rot = vmath.quat_rotation_z(math.rad(transform.rotation or 0)) + factory.create(factory_url, position, rot, nil, scale) end diff --git a/example/example_isogrid/example_isogrid.collection b/example/example_isogrid/example_isogrid.collection index 0aed19a..edf2e08 100644 --- a/example/example_isogrid/example_isogrid.collection +++ b/example/example_isogrid/example_isogrid.collection @@ -26,8 +26,8 @@ embedded_instances { " w: 2.0\\n" "}\\n" "size {\\n" - " x: 2400.0\\n" - " y: 1200.0\\n" + " x: 2450.0\\n" + " y: 1225.0\\n" "}\\n" "size_mode: SIZE_MODE_MANUAL\\n" "textures {\\n" @@ -36,8 +36,8 @@ embedded_instances { "}\\n" "\"\n" " position {\n" - " x: 1200.0\n" - " y: 600.0\n" + " x: 1225.0\n" + " y: 612.5\n" " z: -1.0\n" " }\n" "}\n" @@ -71,8 +71,8 @@ embedded_instances { "}\n" "" position { - x: 480.0 - y: 320.0 + x: 981.0 + y: 1116.0 z: -10.0 } } diff --git a/tiled/maps/hexgrid_pointy.json b/tiled/maps/hexgrid_pointy.json index 6e3c4c2..454568a 100644 --- a/tiled/maps/hexgrid_pointy.json +++ b/tiled/maps/hexgrid_pointy.json @@ -54,8 +54,8 @@ "type":"", "visible":true, "width":235, - "x":-65.4491257325991, - "y":1032.86796124158 + "x":0, + "y":0 }, { "gid":13, @@ -68,6 +68,18 @@ "width":86.7746249036762, "x":146.659808914908, "y":609.560627174192 + }, + { + "gid":13, + "height":136.325540126502, + "id":42, + "name":"", + "rotation":90, + "type":"", + "visible":true, + "width":121.350329947387, + "x":466.822255692162, + "y":453.923741473732 }], "opacity":1, "type":"objectgroup", @@ -76,7 +88,7 @@ "y":0 }], "nextlayerid":3, - "nextobjectid":42, + "nextobjectid":43, "orientation":"hexagonal", "renderorder":"right-down", "staggeraxis":"y", diff --git a/tiled/maps/isogrid.json b/tiled/maps/isogrid.json index 9b66908..afba06e 100644 --- a/tiled/maps/isogrid.json +++ b/tiled/maps/isogrid.json @@ -40,231 +40,99 @@ "objects":[ { "gid":89, - "height":264, - "id":1, + "height":61.5723, + "id":34, "name":"", "rotation":0, "type":"", "visible":true, - "width":235, - "x":813.090322178859, - "y":194.910342107448 + "width":53.0949, + "x":0, + "y":0 }, { "gid":89, - "height":264, - "id":2, + "height":61.5723, + "id":35, "name":"", "rotation":0, "type":"", "visible":true, - "width":235, - "x":933.492215394835, - "y":692.294714772067 + "width":53.0949, + "x":-8.1601392309949e-15, + "y":49 }, { "gid":89, - "height":264, - "id":3, - "name":"", - "rotation":17.7996525766271, - "type":"", - "visible":true, - "width":235, - "x":569.38717490984, - "y":524.515959668664 - }, - { - "gid":2147483737, - "height":75.0247666261791, - "id":4, - "name":"", - "rotation":0, - "type":"", - "visible":true, - "width":66.7834096861822, - "x":522.013819439409, - "y":613.694351433714 - }, - { - "gid":90, - "height":221, - "id":5, - "name":"", - "rotation":0, - "type":"", - "visible":true, - "width":169, - "x":768, - "y":1680 - }, - { - "gid":90, - "height":221, - "id":6, - "name":"", - "rotation":0, - "type":"", - "visible":true, - "width":169, - "x":768, - "y":1632 - }, - { - "gid":90, - "height":221, - "id":7, - "name":"", - "rotation":0, - "type":"", - "visible":true, - "width":169, - "x":768, - "y":1536 - }, - { - "gid":90, - "height":221, - "id":8, - "name":"", - "rotation":0, - "type":"", - "visible":true, - "width":169, - "x":768, - "y":1440 - }, - { - "gid":90, - "height":221, - "id":9, + "height":61.5723, + "id":37, "name":"", "rotation":0, "type":"", "visible":true, - "width":169, - "x":768, - "y":1344 + "width":53.0949, + "x":49, + "y":0 }, { - "gid":90, - "height":221, - "id":10, - "name":"", - "rotation":0, - "type":"", - "visible":true, - "width":169, - "x":768, - "y":1248 - }, - { - "gid":90, - "height":221, - "id":12, - "name":"", - "rotation":0, - "type":"", - "visible":true, - "width":169, - "x":768, - "y":1152 - }, - { - "gid":90, - "height":221, - "id":13, - "name":"", - "rotation":0, - "type":"", - "visible":true, - "width":169, - "x":768, - "y":1008 - }, - { - "gid":90, - "height":221, - "id":14, - "name":"", - "rotation":0, - "type":"", - "visible":true, - "width":169, - "x":768, - "y":1056 - }, - { - "gid":90, - "height":221, - "id":15, - "name":"", - "rotation":0, - "type":"", - "visible":true, - "width":169, - "x":768, - "y":1104 - }, - { - "gid":90, - "height":221, - "id":16, + "gid":89, + "height":34.0849164575597, + "id":39, "name":"", "rotation":0, "type":"", "visible":true, - "width":169, - "x":768, - "y":1200 + "width":29.3920355553144, + "x":49, + "y":49 }, { - "gid":90, - "height":221, - "id":18, + "gid":89, + "height":76.759273070589, + "id":40, "name":"", "rotation":0, "type":"", "visible":true, - "width":169, - "x":768, - "y":1296 + "width":66.1908514940855, + "x":530.911414272719, + "y":629.945858242628 }, { - "gid":90, - "height":221, - "id":19, + "gid":89, + "height":76.7593, + "id":41, "name":"", "rotation":0, "type":"", "visible":true, - "width":169, - "x":768, - "y":1392 + "width":66.1909, + "x":628.865789302753, + "y":630.665812139635 }, { - "gid":90, - "height":221, - "id":21, + "gid":89, + "height":76.7593, + "id":42, "name":"", "rotation":0, "type":"", "visible":true, - "width":169, - "x":768, - "y":1488 + "width":66.1909, + "x":720.569737770332, + "y":606.533194121851 }, { - "gid":90, - "height":221, - "id":23, + "gid":89, + "height":76.7593, + "id":43, "name":"", "rotation":0, "type":"", "visible":true, - "width":169, - "x":768, - "y":1584 + "width":66.1909, + "x":897.387573631402, + "y":471.297715460655 }], "opacity":1, "properties":[ @@ -279,11 +147,11 @@ "y":0 }], "nextlayerid":3, - "nextobjectid":24, + "nextobjectid":44, "orientation":"isometric", "renderorder":"right-down", "tiledversion":"1.11.2", - "tileheight":48, + "tileheight":49, "tilesets":[ { "firstgid":1, @@ -293,7 +161,7 @@ "firstgid":89, "source":"..\/tilesets\/hexgrid_objects.json" }], - "tilewidth":96, + "tilewidth":98, "type":"map", "version":"1.10", "width":30 diff --git a/tiled/maps/isogrid_staggered.json b/tiled/maps/isogrid_staggered.json index 4c4aaf1..f40f69d 100644 --- a/tiled/maps/isogrid_staggered.json +++ b/tiled/maps/isogrid_staggered.json @@ -102,7 +102,7 @@ "nextobjectid":29, "orientation":"staggered", "renderorder":"right-down", - "staggeraxis":"x", + "staggeraxis":"y", "staggerindex":"odd", "tiledversion":"1.11.2", "tileheight":48, From 9b1e779aafc9d3d0a85eef0c1c5420919aa982f0 Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Feb 2026 23:58:32 +0200 Subject: [PATCH 42/71] Update --- detiled/internal/grid/isometric.lua | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/detiled/internal/grid/isometric.lua b/detiled/internal/grid/isometric.lua index 82be1db..f6b04db 100644 --- a/detiled/internal/grid/isometric.lua +++ b/detiled/internal/grid/isometric.lua @@ -98,8 +98,8 @@ function M.convert_object_position(x, y, map_params) local tw = map_params.tile.width local th = map_params.tile.height - local origin_x = (tile_count_y) * (tw / 2) + 1 - local origin_y = map_params.scene.size_y - th / 2 + local origin_x = (tile_count_y) * (tw / 2) + local origin_y = map_params.scene.size_y - (th / 2) local offset_x = x - y local offset_y = (th - x - y)/2 From da69d8ee27a9fe90801fa37f8fd81c9e41b13093 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 16 Feb 2026 10:16:17 +0200 Subject: [PATCH 43/71] Update --- detiled/detiled.lua | 12 +- detiled/internal/grid/isometric.lua | 10 +- example/assets/camera_wasd_control.script | 5 + example/example.collection | 40 + example/example.gui | 632 +++++++++++++ example/example.gui_script | 61 ++ game.project | 11 +- test/test.script | 3 +- .../properties/property_button.gui | 166 ++++ .../properties/property_button.lua | 66 ++ .../properties/property_checkbox.gui | 145 +++ .../properties/property_checkbox.lua | 83 ++ .../properties/property_input.gui | 152 ++++ .../properties/property_input.lua | 57 ++ .../property_left_right_selector.gui | 226 +++++ .../property_left_right_selector.lua | 211 +++++ .../properties/property_slider.gui | 236 +++++ .../properties/property_slider.lua | 126 +++ .../properties/property_text.gui | 105 +++ .../properties/property_text.lua | 42 + .../properties/property_vector3.gui | 510 +++++++++++ .../properties/property_vector3.lua | 75 ++ widget/properties_panel/properties_panel.gui | 846 ++++++++++++++++++ widget/properties_panel/properties_panel.lua | 580 ++++++++++++ .../properties_panel/properties_panel.version | 1 + widget/rich_input/rich_input.gui | 171 ++++ widget/rich_input/rich_input.lua | 296 ++++++ widget/rich_input/rich_input.version | 1 + 28 files changed, 4855 insertions(+), 14 deletions(-) create mode 100644 example/example.collection create mode 100644 example/example.gui create mode 100644 example/example.gui_script create mode 100644 widget/properties_panel/properties/property_button.gui create mode 100644 widget/properties_panel/properties/property_button.lua create mode 100644 widget/properties_panel/properties/property_checkbox.gui create mode 100644 widget/properties_panel/properties/property_checkbox.lua create mode 100644 widget/properties_panel/properties/property_input.gui create mode 100644 widget/properties_panel/properties/property_input.lua create mode 100644 widget/properties_panel/properties/property_left_right_selector.gui create mode 100644 widget/properties_panel/properties/property_left_right_selector.lua create mode 100644 widget/properties_panel/properties/property_slider.gui create mode 100644 widget/properties_panel/properties/property_slider.lua create mode 100644 widget/properties_panel/properties/property_text.gui create mode 100644 widget/properties_panel/properties/property_text.lua create mode 100644 widget/properties_panel/properties/property_vector3.gui create mode 100644 widget/properties_panel/properties/property_vector3.lua create mode 100644 widget/properties_panel/properties_panel.gui create mode 100644 widget/properties_panel/properties_panel.lua create mode 100644 widget/properties_panel/properties_panel.version create mode 100644 widget/rich_input/rich_input.gui create mode 100644 widget/rich_input/rich_input.lua create mode 100644 widget/rich_input/rich_input.version diff --git a/detiled/detiled.lua b/detiled/detiled.lua index dfab070..9541444 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -18,6 +18,8 @@ end ---@param map_or_path detiled.map|string ---@return detiled.get_entity_from_map_result function M.get_entity_from_map(map_or_path) + local memory = collectgarbage("count") + local map = map_or_path if type(map_or_path) == "string" then map = detiled_internal.load_json(map_or_path) --[[@as detiled.map]] @@ -26,9 +28,17 @@ function M.get_entity_from_map(map_or_path) return { map_params = nil, entities = {} } end end + + print("Memory after load map", collectgarbage("count") - memory) + memory = collectgarbage("count") + ---@cast map detiled.map - return detiled_parser.get_entities(map) + local result = detiled_parser.get_entities(map) + + print("Memory after get entities", collectgarbage("count") - memory) + + return result end diff --git a/detiled/internal/grid/isometric.lua b/detiled/internal/grid/isometric.lua index f6b04db..51c794e 100644 --- a/detiled/internal/grid/isometric.lua +++ b/detiled/internal/grid/isometric.lua @@ -95,14 +95,14 @@ end --- @return number, number function M.convert_object_position(x, y, map_params) local tile_count_y = map_params.scene.tiles_y - local tw = map_params.tile.width - local th = map_params.tile.height + local tile_width = map_params.tile.width + local tile_height = map_params.tile.height - local origin_x = (tile_count_y) * (tw / 2) - local origin_y = map_params.scene.size_y - (th / 2) + local origin_x = (tile_count_y) * (tile_width / 2) + local origin_y = map_params.scene.size_y - (tile_height / 2) local offset_x = x - y - local offset_y = (th - x - y)/2 + local offset_y = (tile_height - x - y)/2 local out_x = origin_x + offset_x local out_y = origin_y + offset_y diff --git a/example/assets/camera_wasd_control.script b/example/assets/camera_wasd_control.script index 68a50d4..9638ccc 100644 --- a/example/assets/camera_wasd_control.script +++ b/example/assets/camera_wasd_control.script @@ -15,6 +15,11 @@ function init(self) end +function final(self) + msg.post(".", "release_input_focus") +end + + function update(self, dt) local p = go.get_position() p.x = p.x + self.move.x * self.movement_speed * dt diff --git a/example/example.collection b/example/example.collection new file mode 100644 index 0000000..8c6a047 --- /dev/null +++ b/example/example.collection @@ -0,0 +1,40 @@ +name: "example" +scale_along_z: 0 +embedded_instances { + id: "go" + data: "components {\n" + " id: \"example\"\n" + " component: \"/example/example.gui\"\n" + "}\n" + "embedded_components {\n" + " id: \"grid\"\n" + " type: \"collectionproxy\"\n" + " data: \"collection: \\\"/example/example_grid/example_grid.collection\\\"\\n" + "\"\n" + "}\n" + "embedded_components {\n" + " id: \"hex\"\n" + " type: \"collectionproxy\"\n" + " data: \"collection: \\\"/example/example_hexgrid/example_hexgrid.collection\\\"\\n" + "\"\n" + "}\n" + "embedded_components {\n" + " id: \"iso_staggered\"\n" + " type: \"collectionproxy\"\n" + " data: \"collection: \\\"/example/example_isogrid_staggered/example_isogrid_staggered.collection\\\"\\n" + "\"\n" + "}\n" + "embedded_components {\n" + " id: \"iso\"\n" + " type: \"collectionproxy\"\n" + " data: \"collection: \\\"/example/example_isogrid/example_isogrid.collection\\\"\\n" + "\"\n" + "}\n" + "embedded_components {\n" + " id: \"hex_pointy\"\n" + " type: \"collectionproxy\"\n" + " data: \"collection: \\\"/example/example_hexgrid_pointy/example_hexgrid_pointy.collection\\\"\\n" + "\"\n" + "}\n" + "" +} diff --git a/example/example.gui b/example/example.gui new file mode 100644 index 0000000..1e26f64 --- /dev/null +++ b/example/example.gui @@ -0,0 +1,632 @@ +script: "/example/example.gui_script" +nodes { + position { + x: 840.0 + y: 640.0 + } + scale { + x: 0.6 + y: 0.6 + } + type: TYPE_TEMPLATE + id: "properties_panel" + inherit_alpha: true + template: "/widget/properties_panel/properties_panel.gui" +} +nodes { + type: TYPE_BOX + id: "properties_panel/root" + parent: "properties_panel" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/header" + parent: "properties_panel/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/text_header" + parent: "properties_panel/header" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/icon_drag" + parent: "properties_panel/header" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/icon_refresh" + parent: "properties_panel/header" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/icon_back" + parent: "properties_panel/header" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/content" + parent: "properties_panel/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/scroll_view" + parent: "properties_panel/content" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/scroll_content" + parent: "properties_panel/scroll_view" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/properties" + parent: "properties_panel/content" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "properties_panel/property_slider" + parent: "properties_panel/properties" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_slider/root" + parent: "properties_panel/property_slider" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_slider/text_name" + parent: "properties_panel/property_slider/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_slider/E_Anchor" + parent: "properties_panel/property_slider/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_slider/slider" + parent: "properties_panel/property_slider/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_slider/slider_back" + parent: "properties_panel/property_slider/slider" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_slider/slider_pin" + parent: "properties_panel/property_slider/slider" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_slider/button" + parent: "properties_panel/property_slider/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_slider/selected" + parent: "properties_panel/property_slider/button" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_slider/text_value" + parent: "properties_panel/property_slider/button" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "properties_panel/property_checkbox" + parent: "properties_panel/properties" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_checkbox/root" + parent: "properties_panel/property_checkbox" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_checkbox/text_name" + parent: "properties_panel/property_checkbox/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_checkbox/E_Anchor" + parent: "properties_panel/property_checkbox/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_checkbox/button" + parent: "properties_panel/property_checkbox/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_checkbox/icon" + parent: "properties_panel/property_checkbox/button" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_checkbox/selected" + parent: "properties_panel/property_checkbox/button" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "properties_panel/property_button" + parent: "properties_panel/properties" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_button/root" + parent: "properties_panel/property_button" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_button/text_name" + parent: "properties_panel/property_button/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_button/E_Anchor" + parent: "properties_panel/property_button/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_button/button" + parent: "properties_panel/property_button/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_button/selected" + parent: "properties_panel/property_button/button" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_button/text_button" + parent: "properties_panel/property_button/button" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "properties_panel/property_input" + parent: "properties_panel/properties" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_input/root" + parent: "properties_panel/property_input" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_input/text_name" + parent: "properties_panel/property_input/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_input/E_Anchor" + parent: "properties_panel/property_input/root" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "properties_panel/property_input/rich_input" + parent: "properties_panel/property_input/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_input/rich_input/root" + parent: "properties_panel/property_input/rich_input" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_input/rich_input/button" + parent: "properties_panel/property_input/rich_input/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_input/rich_input/placeholder_text" + parent: "properties_panel/property_input/rich_input/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_input/rich_input/input_text" + parent: "properties_panel/property_input/rich_input/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_input/rich_input/cursor_node" + parent: "properties_panel/property_input/rich_input/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_input/rich_input/cursor_text" + parent: "properties_panel/property_input/rich_input/cursor_node" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_input/selected" + parent: "properties_panel/property_input/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "properties_panel/property_text" + parent: "properties_panel/properties" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_text/root" + parent: "properties_panel/property_text" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_text/text_name" + parent: "properties_panel/property_text/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_text/text_right" + parent: "properties_panel/property_text/root" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "properties_panel/property_left_right_selector" + parent: "properties_panel/properties" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_left_right_selector/root" + parent: "properties_panel/property_left_right_selector" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_left_right_selector/text_name" + parent: "properties_panel/property_left_right_selector/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_left_right_selector/E_Anchor" + parent: "properties_panel/property_left_right_selector/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_left_right_selector/button_left" + parent: "properties_panel/property_left_right_selector/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_left_right_selector/icon_left" + parent: "properties_panel/property_left_right_selector/button_left" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_left_right_selector/button_right" + parent: "properties_panel/property_left_right_selector/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_left_right_selector/icon_right" + parent: "properties_panel/property_left_right_selector/button_right" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_left_right_selector/selected" + parent: "properties_panel/property_left_right_selector/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_left_right_selector/text_value" + parent: "properties_panel/property_left_right_selector/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "properties_panel/property_vector3" + parent: "properties_panel/properties" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/root" + parent: "properties_panel/property_vector3" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/text_name" + parent: "properties_panel/property_vector3/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/E_Anchor" + parent: "properties_panel/property_vector3/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/field_x" + parent: "properties_panel/property_vector3/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/text_x" + parent: "properties_panel/property_vector3/field_x" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "properties_panel/property_vector3/rich_input_x" + parent: "properties_panel/property_vector3/field_x" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/rich_input_x/root" + parent: "properties_panel/property_vector3/rich_input_x" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/rich_input_x/button" + parent: "properties_panel/property_vector3/rich_input_x/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/rich_input_x/placeholder_text" + parent: "properties_panel/property_vector3/rich_input_x/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/rich_input_x/input_text" + parent: "properties_panel/property_vector3/rich_input_x/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/rich_input_x/cursor_node" + parent: "properties_panel/property_vector3/rich_input_x/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/rich_input_x/cursor_text" + parent: "properties_panel/property_vector3/rich_input_x/cursor_node" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/selected_x" + parent: "properties_panel/property_vector3/field_x" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/field_y" + parent: "properties_panel/property_vector3/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/text_y" + parent: "properties_panel/property_vector3/field_y" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "properties_panel/property_vector3/rich_input_y" + parent: "properties_panel/property_vector3/field_y" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/rich_input_y/root" + parent: "properties_panel/property_vector3/rich_input_y" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/rich_input_y/button" + parent: "properties_panel/property_vector3/rich_input_y/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/rich_input_y/placeholder_text" + parent: "properties_panel/property_vector3/rich_input_y/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/rich_input_y/input_text" + parent: "properties_panel/property_vector3/rich_input_y/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/rich_input_y/cursor_node" + parent: "properties_panel/property_vector3/rich_input_y/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/rich_input_y/cursor_text" + parent: "properties_panel/property_vector3/rich_input_y/cursor_node" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/selected_y" + parent: "properties_panel/property_vector3/field_y" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/field_z" + parent: "properties_panel/property_vector3/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/text_z" + parent: "properties_panel/property_vector3/field_z" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "properties_panel/property_vector3/rich_input_z" + parent: "properties_panel/property_vector3/field_z" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/rich_input_z/root" + parent: "properties_panel/property_vector3/rich_input_z" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/rich_input_z/button" + parent: "properties_panel/property_vector3/rich_input_z/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/rich_input_z/placeholder_text" + parent: "properties_panel/property_vector3/rich_input_z/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/rich_input_z/input_text" + parent: "properties_panel/property_vector3/rich_input_z/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/rich_input_z/cursor_node" + parent: "properties_panel/property_vector3/rich_input_z/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_vector3/rich_input_z/cursor_text" + parent: "properties_panel/property_vector3/rich_input_z/cursor_node" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_vector3/selected_z" + parent: "properties_panel/property_vector3/field_z" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "properties_panel/property_button_small" + parent: "properties_panel/properties" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_button_small/root" + parent: "properties_panel/property_button_small" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_button_small/text_name" + parent: "properties_panel/property_button_small/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_button_small/E_Anchor" + parent: "properties_panel/property_button_small/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_button_small/button" + parent: "properties_panel/property_button_small/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "properties_panel/property_button_small/selected" + parent: "properties_panel/property_button_small/button" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "properties_panel/property_button_small/text_button" + parent: "properties_panel/property_button_small/button" + template_node_child: true +} +layers { + name: "druid" +} +layers { + name: "druid_text_regular" +} +layers { + name: "druid_text_bold" +} +material: "/builtins/materials/gui.material" +adjust_reference: ADJUST_REFERENCE_PARENT diff --git a/example/example.gui_script b/example/example.gui_script new file mode 100644 index 0000000..5e0a892 --- /dev/null +++ b/example/example.gui_script @@ -0,0 +1,61 @@ +local druid = require("druid.druid") +local properties_panel = require("widget.properties_panel.properties_panel") + +local function update_example(self, example_name) + local example_url = "#" .. example_name + msg.post(example_url, "disable") + msg.post(example_url, "final") + msg.post(example_url, "unload") +end + + +local function load_example(self, example_name) + if self._example_name then + update_example(self, self._example_name) + end + + self._example_name = example_name + msg.post("#" .. example_name, "load") +end + +function init(self) + self.druid = druid.new(self) + self.properties_panel = self.druid:new_widget(properties_panel, "properties_panel") + self.properties_panel:add_left_right_selector(function(selector) + selector:set_array_type({ + "grid", + "hex", + "hex_pointy", + "iso", + "iso_staggered", + }, true) + selector:set_value("grid") + selector:set_text("Example") + selector.on_change_value:subscribe(function(value) + load_example(self, value) + end) + end) + + load_example(self, "grid") +end + +function final(self) + self.druid:final() +end + +function update(self, dt) + self.druid:update(dt) +end + +function on_message(self, message_id, message, sender) + self.druid:on_message(message_id, message, sender) + + if message_id == hash("proxy_loaded") then + msg.post(sender, "init") + msg.post(sender, "enable") + end +end + +function on_input(self, action_id, action) + return self.druid:on_input(action_id, action) +end diff --git a/game.project b/game.project index 61cc479..beec2ea 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example_hexgrid/example_hexgrid.collectionc +main_collection = /example/example.collectionc [script] shared_state = 1 @@ -15,11 +15,10 @@ input_method = HiddenInputField title = Detiled version = 2 custom_resources = /tiled/maps,/tiled/tilesets -dependencies#0 = https://github.com/Insality/decore/archive/refs/tags/3.zip -dependencies#1 = https://github.com/britzl/deftest/archive/master.zip -dependencies#2 = https://github.com/Insality/defold-event/archive/refs/tags/13.zip -dependencies#3 = https://github.com/Insality/asset-store/archive/refs/heads/main.zip -dependencies#4 = https://github.com/Insality/druid/archive/refs/tags/1.1.6.zip +dependencies#0 = https://github.com/britzl/deftest/archive/master.zip +dependencies#1 = https://github.com/Insality/defold-event/archive/refs/tags/14.zip +dependencies#2 = https://github.com/Insality/asset-store/archive/refs/heads/main.zip +dependencies#3 = https://github.com/Insality/druid/archive/refs/heads/develop.zip [library] include_dirs = detiled diff --git a/test/test.script b/test/test.script index c6acf17..c94c4dc 100644 --- a/test/test.script +++ b/test/test.script @@ -1,8 +1,7 @@ local deftest = require("deftest.deftest") function init(self) - deftest.add(require("test.test_detiled")) - + -- deftest.add(require("test.test_detiled")) local is_report = (sys.get_config("test.report") == "1") deftest.run({ coverage = { enabled = is_report } }) end diff --git a/widget/properties_panel/properties/property_button.gui b/widget/properties_panel/properties/property_button.gui new file mode 100644 index 0000000..e2c9973 --- /dev/null +++ b/widget/properties_panel/properties/property_button.gui @@ -0,0 +1,166 @@ +fonts { + name: "druid_text_bold" + font: "/druid/fonts/druid_text_bold.font" +} +textures { + name: "druid" + texture: "/druid/druid.atlas" +} +nodes { + size { + x: 400.0 + y: 40.0 + } + type: TYPE_BOX + texture: "druid/empty" + id: "root" + adjust_mode: ADJUST_MODE_STRETCH + layer: "druid" + inherit_alpha: true + visible: false +} +nodes { + position { + x: -200.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 350.0 + y: 40.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_TEXT + text: "Button" + font: "druid_text_bold" + id: "text_name" + pivot: PIVOT_W + outline { + x: 1.0 + y: 1.0 + z: 1.0 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + adjust_mode: ADJUST_MODE_STRETCH + parent: "root" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + position { + x: 200.0 + } + size { + x: 200.0 + y: 40.0 + } + type: TYPE_BOX + id: "E_Anchor" + pivot: PIVOT_E + parent: "root" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO + visible: false +} +nodes { + position { + x: -100.0 + } + size { + x: 200.0 + y: 40.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_BOX + texture: "druid/rect_round2_width2" + id: "button" + parent: "E_Anchor" + layer: "druid" + inherit_alpha: true + slice9 { + x: 5.0 + y: 5.0 + z: 5.0 + w: 5.0 + } +} +nodes { + position { + y: -20.0 + } + size { + x: 200.0 + y: 4.0 + } + color { + x: 0.894 + y: 0.506 + z: 0.333 + } + type: TYPE_BOX + texture: "druid/pixel" + id: "selected" + pivot: PIVOT_S + adjust_mode: ADJUST_MODE_STRETCH + parent: "button" + layer: "druid" + inherit_alpha: true +} +nodes { + scale { + x: 0.5 + y: 0.5 + } + size { + x: 380.0 + y: 50.0 + } + color { + x: 0.722 + y: 0.741 + z: 0.761 + } + type: TYPE_TEXT + text: "Button" + font: "druid_text_bold" + id: "text_button" + outline { + x: 1.0 + y: 1.0 + z: 1.0 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "button" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +layers { + name: "druid" +} +layers { + name: "druid_text_bold" +} +material: "/builtins/materials/gui.material" +adjust_reference: ADJUST_REFERENCE_PARENT diff --git a/widget/properties_panel/properties/property_button.lua b/widget/properties_panel/properties/property_button.lua new file mode 100644 index 0000000..175995e --- /dev/null +++ b/widget/properties_panel/properties/property_button.lua @@ -0,0 +1,66 @@ +local color = require("druid.color") + +---@class widget.property_button: druid.widget +---@field root node +---@field container druid.container +---@field text_name druid.text +---@field button druid.button +---@field text_button druid.text +local M = {} + + +function M:init() + self.root = self:get_node("root") + self.text_name = self.druid:new_text("text_name") + :set_text_adjust("scale_then_trim", 0.3) + + self.selected = self:get_node("selected") + gui.set_alpha(self.selected, 0) + + self.button = self.druid:new_button("button", self.on_click) + self.text_button = self.druid:new_text("text_button") + + self.container = self.druid:new_container(self.root) + self.container:add_container("text_name", nil, function(_, size) + self.text_button:set_size(size) + end) + self.container:add_container("E_Anchor") +end + + +function M:on_click() + gui.set_alpha(self.selected, 1) + gui.animate(self.selected, "color.w", 0, gui.EASING_INSINE, 0.16) +end + + +---@param text string +---@return widget.property_button +function M:set_text_property(text) + self.text_name:set_text(text) + return self +end + + +---@param text string +---@return widget.property_button +function M:set_text_button(text) + self.text_button:set_text(text) + return self +end + + +---@param enabled boolean +---@return widget.property_button +function M:set_enabled(enabled) + self.button:set_enabled(enabled) + return self +end + + +function M:set_color(color_value) + color.set_color(self:get_node("button"), color_value) +end + + +return M diff --git a/widget/properties_panel/properties/property_checkbox.gui b/widget/properties_panel/properties/property_checkbox.gui new file mode 100644 index 0000000..843cbf7 --- /dev/null +++ b/widget/properties_panel/properties/property_checkbox.gui @@ -0,0 +1,145 @@ +fonts { + name: "druid_text_bold" + font: "/druid/fonts/druid_text_bold.font" +} +textures { + name: "druid" + texture: "/druid/druid.atlas" +} +nodes { + size { + x: 400.0 + y: 40.0 + } + type: TYPE_BOX + texture: "druid/empty" + id: "root" + adjust_mode: ADJUST_MODE_STRETCH + layer: "druid" + inherit_alpha: true + visible: false +} +nodes { + position { + x: -200.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 360.0 + y: 40.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_TEXT + text: "Checkbox" + font: "druid_text_bold" + id: "text_name" + pivot: PIVOT_W + outline { + x: 1.0 + y: 1.0 + z: 1.0 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "root" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + position { + x: 200.0 + } + size { + x: 200.0 + y: 40.0 + } + type: TYPE_BOX + id: "E_Anchor" + pivot: PIVOT_E + parent: "root" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO + visible: false +} +nodes { + position { + x: -180.0 + } + size { + x: 40.0 + y: 40.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_BOX + texture: "druid/rect_round2_width2" + id: "button" + parent: "E_Anchor" + layer: "druid" + inherit_alpha: true + slice9 { + x: 5.0 + y: 5.0 + z: 5.0 + w: 5.0 + } +} +nodes { + color { + x: 0.722 + y: 0.741 + z: 0.761 + } + type: TYPE_BOX + texture: "druid/ui_circle_16" + id: "icon" + parent: "button" + layer: "druid" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO +} +nodes { + position { + y: -20.0 + } + size { + x: 40.0 + y: 4.0 + } + color { + x: 0.894 + y: 0.506 + z: 0.333 + } + type: TYPE_BOX + texture: "druid/pixel" + id: "selected" + pivot: PIVOT_S + adjust_mode: ADJUST_MODE_STRETCH + parent: "button" + layer: "druid" + inherit_alpha: true +} +layers { + name: "druid" +} +layers { + name: "druid_text_bold" +} +material: "/builtins/materials/gui.material" +adjust_reference: ADJUST_REFERENCE_PARENT diff --git a/widget/properties_panel/properties/property_checkbox.lua b/widget/properties_panel/properties/property_checkbox.lua new file mode 100644 index 0000000..4dd9af9 --- /dev/null +++ b/widget/properties_panel/properties/property_checkbox.lua @@ -0,0 +1,83 @@ +local event = require("event.event") + +---@class widget.property_checkbox: druid.widget +---@field root node +---@field druid druid.instance +---@field text_name druid.text +---@field button druid.button +---@field selected node +local M = {} + + +function M:init() + self.root = self:get_node("root") + + self.icon = self:get_node("icon") + gui.set_enabled(self.icon, false) + + self.selected = self:get_node("selected") + gui.set_alpha(self.selected, 0) + + self.text_name = self.druid:new_text("text_name") + :set_text_adjust("scale_then_trim", 0.3) + + self.button = self.druid:new_button("button", self.on_click) + + self.container = self.druid:new_container(self.root) + self.container:add_container("text_name") + self.container:add_container("E_Anchor") + + self.on_change_value = event.create() +end + + +---@param value boolean +function M:set_value(value, is_instant) + if self._value == value then + return + end + + self._value = value + gui.set_enabled(self.icon, value) + self.on_change_value:trigger(value) + + if not is_instant then + gui.set_alpha(self.selected, 1) + gui.animate(self.selected, "color.w", 0, gui.EASING_INSINE, 0.16) + end +end + + +---@return boolean +function M:get_value() + return self._value +end + + +function M:on_click() + self:set_value(not self:get_value()) +end + + +---Set the text property of the checkbox +---@param text string +function M:set_text_property(text) + self.text_name:set_text(text) +end + + +---Set the callback function for when the checkbox value changes +---@param callback function +function M:on_change(callback) + self.on_change_value:subscribe(callback) +end + + +---Set the enabled state of the checkbox +---@param enabled boolean +function M:set_enabled(enabled) + self.button:set_enabled(enabled) +end + + +return M diff --git a/widget/properties_panel/properties/property_input.gui b/widget/properties_panel/properties/property_input.gui new file mode 100644 index 0000000..71737ed --- /dev/null +++ b/widget/properties_panel/properties/property_input.gui @@ -0,0 +1,152 @@ +fonts { + name: "druid_text_bold" + font: "/druid/fonts/druid_text_bold.font" +} +textures { + name: "druid" + texture: "/druid/druid.atlas" +} +nodes { + size { + x: 400.0 + y: 40.0 + } + type: TYPE_BOX + texture: "druid/empty" + id: "root" + adjust_mode: ADJUST_MODE_STRETCH + layer: "druid" + inherit_alpha: true + visible: false +} +nodes { + position { + x: -200.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 350.0 + y: 50.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_TEXT + text: "Input" + font: "druid_text_bold" + id: "text_name" + pivot: PIVOT_W + outline { + x: 1.0 + y: 1.0 + z: 1.0 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "root" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + position { + x: 200.0 + } + size { + x: 200.0 + y: 40.0 + } + type: TYPE_BOX + id: "E_Anchor" + pivot: PIVOT_E + parent: "root" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO + visible: false +} +nodes { + position { + x: -100.0 + } + type: TYPE_TEMPLATE + id: "rich_input" + parent: "E_Anchor" + inherit_alpha: true + template: "/widget/rich_input/rich_input.gui" +} +nodes { + type: TYPE_BOX + id: "rich_input/root" + parent: "rich_input" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "rich_input/button" + parent: "rich_input/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "rich_input/placeholder_text" + parent: "rich_input/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "rich_input/input_text" + parent: "rich_input/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "rich_input/cursor_node" + parent: "rich_input/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "rich_input/cursor_text" + parent: "rich_input/cursor_node" + template_node_child: true +} +nodes { + position { + x: -100.0 + y: -20.0 + } + size { + x: 200.0 + y: 4.0 + } + color { + x: 0.894 + y: 0.506 + z: 0.333 + } + type: TYPE_BOX + texture: "druid/pixel" + id: "selected" + pivot: PIVOT_S + adjust_mode: ADJUST_MODE_STRETCH + parent: "E_Anchor" + layer: "druid" + inherit_alpha: true +} +layers { + name: "druid" +} +layers { + name: "druid_text_bold" +} +material: "/builtins/materials/gui.material" +adjust_reference: ADJUST_REFERENCE_PARENT diff --git a/widget/properties_panel/properties/property_input.lua b/widget/properties_panel/properties/property_input.lua new file mode 100644 index 0000000..29e98ab --- /dev/null +++ b/widget/properties_panel/properties/property_input.lua @@ -0,0 +1,57 @@ +local event = require("event.event") + +---@class widget.property_input: druid.widget +---@field root node +---@field container druid.container +---@field text_name druid.text +---@field button druid.button +---@field druid druid.instance +---@field on_change_value event fun(text: string) +local M = {} + +function M:init() + self.root = self:get_node("root") + self.text_name = self.druid:new_text("text_name") + :set_text_adjust("scale_then_trim", 0.3) + + self.selected = self:get_node("selected") + gui.set_alpha(self.selected, 0) + + self.rich_input = self.druid:new_rich_input("rich_input") + + self.container = self.druid:new_container(self.root) + self.container:add_container("text_name") + self.container:add_container("E_Anchor") + + self.on_change_value = event.create() + + self.rich_input.input.on_input_unselect:subscribe(function(_, text) + self.on_change_value:trigger(text) + end) +end + + +---@param text string +---@return widget.property_input +function M:set_text_property(text) + self.text_name:set_text(text) + return self +end + + +---@param text string|number +---@return widget.property_input +function M:set_text_value(text) + self.rich_input:set_text(tostring(text)) + return self +end + + +---@param callback fun(self: widget.property_input, text: string) +---@param callback_context any +function M:on_change(callback, callback_context) + self.rich_input.input.on_input_unselect:subscribe(callback, callback_context) +end + + +return M diff --git a/widget/properties_panel/properties/property_left_right_selector.gui b/widget/properties_panel/properties/property_left_right_selector.gui new file mode 100644 index 0000000..19c6a3d --- /dev/null +++ b/widget/properties_panel/properties/property_left_right_selector.gui @@ -0,0 +1,226 @@ +fonts { + name: "druid_text_bold" + font: "/druid/fonts/druid_text_bold.font" +} +textures { + name: "druid" + texture: "/druid/druid.atlas" +} +nodes { + size { + x: 400.0 + y: 40.0 + } + type: TYPE_BOX + texture: "druid/empty" + id: "root" + adjust_mode: ADJUST_MODE_STRETCH + layer: "druid" + inherit_alpha: true + visible: false +} +nodes { + position { + x: -200.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 360.0 + y: 40.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_TEXT + text: "Left Right Selector" + font: "druid_text_bold" + id: "text_name" + pivot: PIVOT_W + outline { + x: 1.0 + y: 1.0 + z: 1.0 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "root" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + position { + x: 200.0 + } + size { + x: 200.0 + y: 40.0 + } + type: TYPE_BOX + id: "E_Anchor" + pivot: PIVOT_E + parent: "root" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO + visible: false +} +nodes { + position { + x: -180.0 + } + size { + x: 40.0 + y: 40.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_BOX + texture: "druid/rect_round2_width2" + id: "button_left" + parent: "E_Anchor" + layer: "druid" + inherit_alpha: true + slice9 { + x: 5.0 + y: 5.0 + z: 5.0 + w: 5.0 + } +} +nodes { + rotation { + z: 180.0 + } + color { + x: 0.722 + y: 0.741 + z: 0.761 + } + type: TYPE_BOX + texture: "druid/icon_arrow" + id: "icon_left" + parent: "button_left" + layer: "druid" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO +} +nodes { + position { + x: -20.0 + } + size { + x: 40.0 + y: 40.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_BOX + texture: "druid/rect_round2_width2" + id: "button_right" + parent: "E_Anchor" + layer: "druid" + inherit_alpha: true + slice9 { + x: 5.0 + y: 5.0 + z: 5.0 + w: 5.0 + } +} +nodes { + color { + x: 0.722 + y: 0.741 + z: 0.761 + } + type: TYPE_BOX + texture: "druid/icon_arrow" + id: "icon_right" + parent: "button_right" + layer: "druid" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO +} +nodes { + position { + x: -100.0 + y: -20.0 + } + size { + x: 120.0 + y: 4.0 + } + color { + x: 0.894 + y: 0.506 + z: 0.333 + } + type: TYPE_BOX + texture: "druid/pixel" + id: "selected" + pivot: PIVOT_S + adjust_mode: ADJUST_MODE_STRETCH + parent: "E_Anchor" + layer: "druid" + inherit_alpha: true +} +nodes { + position { + x: -100.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 220.0 + y: 40.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_TEXT + text: "42" + font: "druid_text_bold" + id: "text_value" + outline { + x: 1.0 + y: 1.0 + z: 1.0 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "E_Anchor" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +layers { + name: "druid" +} +layers { + name: "druid_text_bold" +} +material: "/builtins/materials/gui.material" +adjust_reference: ADJUST_REFERENCE_PARENT diff --git a/widget/properties_panel/properties/property_left_right_selector.lua b/widget/properties_panel/properties/property_left_right_selector.lua new file mode 100644 index 0000000..fda5f01 --- /dev/null +++ b/widget/properties_panel/properties/property_left_right_selector.lua @@ -0,0 +1,211 @@ +local event = require("event.event") + +---@class widget.property_left_right_selector: druid.widget +---@field root node +---@field druid druid.instance +---@field text_name druid.text +---@field button druid.button +---@field selected node +---@field value string|number +---@field on_change_value event fun(value: string|number) +local M = {} + + +function M:init() + self.root = self:get_node("root") + self.selected = self:get_node("selected") + gui.set_alpha(self.selected, 0) + + self.text_name = self.druid:new_text("text_name") + :set_text_adjust("scale_then_trim", 0.3) + + self.text_value = self.druid:new_text("text_value") + self.button_left = self.druid:new_button("button_left", self.on_button_left) + self.button_left.on_repeated_click:subscribe(self.on_button_left, self) + + self.button_right = self.druid:new_button("button_right", self.on_button_right) + self.button_right.on_repeated_click:subscribe(self.on_button_right, self) + + self.on_change_value = event.create() + + self.container = self.druid:new_container(self.root) + self.container:add_container("text_name") + self.container:add_container("E_Anchor") +end + + +function M:set_text(text) + self.text_name:set_text(text) + return self +end + + +---Helper to cycle number in range +---@param value number Current value +---@param min number Min range value +---@param max number Max range value +---@param step number Step size +---@param is_loop boolean Is looped +---@return number Cycled value +local function step_number(value, min, max, step, is_loop) + local range = max - min + 1 + if is_loop then + -- Normalize step within range + local effective_step = step + if math.abs(step) >= range then + effective_step = step % range + if effective_step == 0 then + effective_step = step > 0 and range or -range + end + end + + value = value + effective_step + -- Handle wrapping + if max then + while value > max do + value = min + (value - max - 1) + end + end + if min then + while value < min do + value = max - (min - value - 1) + end + end + else + -- Clamp values + value = value + step + if max and value > max then + return max + elseif min and value < min then + return min + end + end + return value +end + + +---Helper to cycle array index with proper step wrapping +---@param array table Array to cycle through +---@param current_value any Current value to find index for +---@param step number Step direction +---@param is_loop boolean If true, cycle values. If false, clamp at ends +---@return any Next value in cycle +local function step_array(array, current_value, step, is_loop) + local index = 1 + for i, v in ipairs(array) do + if v == current_value then + index = i + break + end + end + + if is_loop then + -- Normalize step within array length + local range = #array + local effective_step = step + if math.abs(step) >= range then + effective_step = step % range + if effective_step == 0 then + effective_step = step > 0 and range or -range + end + end + + index = index + effective_step + -- Handle wrapping + while index > range do + index = 1 + (index - range - 1) + end + while index < 1 do + index = range - (1 - index - 1) + end + else + -- Clamp values + index = index + step + if index > #array then + index = #array + elseif index < 1 then + index = 1 + end + end + + return array[index] +end + + +function M:on_button_left() + self:add_step(-1) +end + +function M:on_button_right() + self:add_step(1) +end + + +---@param koef number -1 0 1, on 0 will not move +function M:add_step(koef) + local array_type = self.array_type + if array_type then + local value = self.value + local new_value = step_array(array_type.array, value, koef * array_type.steps, array_type.is_loop) + self:set_value(new_value) + return + end + + + local number_type = self.number_type + if number_type then + local value = tonumber(self.value) --[[@as number]] + local new_value = step_number(value, number_type.min, number_type.max, koef * number_type.steps, number_type.is_loop) + self:set_value(new_value) + return + end +end + + +function M:set_number_type(min, max, is_loop, steps) + self.number_type = { + min = min, + max = max, + steps = steps or 1, + is_loop = is_loop, + } + + return self +end + + +function M:set_array_type(array, is_loop, steps) + self.array_type = { + array = array, + steps = steps or 1, + is_loop = is_loop, + } + + return self +end + + +---@param value string|number +function M:set_value(value, is_instant) + if self.value == value then + return + end + + self.value = value + self.text_value:set_text(tostring(value)) + self.on_change_value:trigger(value) + + if not is_instant then + gui.set_alpha(self.selected, 1) + gui.animate(self.selected, "color.w", 0, gui.EASING_INSINE, 0.16) + end +end + + +---@return string|number +function M:get_value() + return self.value +end + + +return M diff --git a/widget/properties_panel/properties/property_slider.gui b/widget/properties_panel/properties/property_slider.gui new file mode 100644 index 0000000..22b5b3b --- /dev/null +++ b/widget/properties_panel/properties/property_slider.gui @@ -0,0 +1,236 @@ +fonts { + name: "druid_text_bold" + font: "/druid/fonts/druid_text_bold.font" +} +textures { + name: "druid" + texture: "/druid/druid.atlas" +} +nodes { + size { + x: 400.0 + y: 40.0 + } + type: TYPE_BOX + texture: "druid/empty" + id: "root" + adjust_mode: ADJUST_MODE_STRETCH + layer: "druid" + inherit_alpha: true + visible: false +} +nodes { + position { + x: -200.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 380.0 + y: 40.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_TEXT + text: "Slider" + font: "druid_text_bold" + id: "text_name" + pivot: PIVOT_W + outline { + x: 1.0 + y: 1.0 + z: 1.0 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "root" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + position { + x: 200.0 + } + size { + x: 200.0 + y: 40.0 + } + type: TYPE_BOX + id: "E_Anchor" + pivot: PIVOT_E + adjust_mode: ADJUST_MODE_STRETCH + parent: "root" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO + visible: false +} +nodes { + position { + x: -133.0 + } + size { + x: 134.0 + y: 40.0 + } + color { + x: 0.129 + y: 0.141 + z: 0.157 + } + type: TYPE_BOX + texture: "druid/empty" + id: "slider" + parent: "E_Anchor" + layer: "druid" + inherit_alpha: true +} +nodes { + size { + x: 134.0 + y: 8.0 + } + color { + x: 0.129 + y: 0.141 + z: 0.157 + } + type: TYPE_BOX + texture: "druid/ui_circle_8" + id: "slider_back" + parent: "slider" + layer: "druid" + inherit_alpha: true + slice9 { + x: 4.0 + y: 4.0 + z: 4.0 + w: 4.0 + } +} +nodes { + position { + x: -55.0 + } + size { + x: 24.0 + y: 24.0 + } + color { + x: 0.722 + y: 0.741 + z: 0.761 + } + type: TYPE_BOX + texture: "druid/ui_circle_8" + id: "slider_pin" + parent: "slider" + layer: "druid" + inherit_alpha: true + slice9 { + x: 4.0 + y: 4.0 + z: 4.0 + w: 4.0 + } +} +nodes { + size { + x: 60.0 + y: 40.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_BOX + texture: "druid/rect_round2_width2" + id: "button" + pivot: PIVOT_E + parent: "E_Anchor" + layer: "druid" + inherit_alpha: true + slice9 { + x: 4.0 + y: 4.0 + z: 4.0 + w: 4.0 + } +} +nodes { + position { + y: -20.0 + } + size { + x: 60.0 + y: 4.0 + } + color { + x: 0.894 + y: 0.506 + z: 0.333 + } + type: TYPE_BOX + texture: "druid/pixel" + id: "selected" + pivot: PIVOT_SE + adjust_mode: ADJUST_MODE_STRETCH + parent: "button" + layer: "druid" + inherit_alpha: true +} +nodes { + position { + x: -30.0 + } + scale { + x: 0.55 + y: 0.55 + } + size { + x: 100.0 + y: 40.0 + } + color { + x: 0.722 + y: 0.741 + z: 0.761 + } + type: TYPE_TEXT + text: "25 %" + font: "druid_text_bold" + id: "text_value" + outline { + x: 1.0 + y: 1.0 + z: 1.0 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "button" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +layers { + name: "druid" +} +layers { + name: "druid_text_bold" +} +material: "/builtins/materials/gui.material" +adjust_reference: ADJUST_REFERENCE_PARENT diff --git a/widget/properties_panel/properties/property_slider.lua b/widget/properties_panel/properties/property_slider.lua new file mode 100644 index 0000000..780f469 --- /dev/null +++ b/widget/properties_panel/properties/property_slider.lua @@ -0,0 +1,126 @@ +local event = require("event.event") +local helper = require("druid.helper") + +---@class widget.property_slider: druid.widget +---@field root node +---@field container druid.container +---@field druid druid.instance +---@field text_name druid.text +---@field text_value druid.text +---@field slider druid.slider +---@field on_change_value event fun(value:number) +local M = {} + + +function M:init() + self.root = self:get_node("root") + self.selected = self:get_node("selected") + gui.set_alpha(self.selected, 0) + self._value = 0 + + self.min = 0 + self.max = 1 + self.step = 0.01 + + self.text_name = self.druid:new_text("text_name") + :set_text_adjust("scale_then_trim", 0.3) + + self.text_value = self.druid:new_text("text_value") + self.slider = self.druid:new_slider("slider_pin", vmath.vector3(55, 0, 0), self.update_value) --[[@as druid.slider]] + self.slider:set_input_node("slider") + + self:set_text_function(function(value) + return math.floor(value * 100) .. "%" + end) + + self.container = self.druid:new_container(self.root) + self.container:add_container("text_name") + self.container:add_container("E_Anchor") + + self.on_change_value = event.create() +end + + +---@param callback fun(value:number):string +function M:set_text_function(callback) + self._text_function = callback + self.text_value:set_text(self._text_function(self._value)) +end + + +---Sets the text property of the slider +---@param text string +function M:set_text_property(text) + self.text_name:set_text(text) +end + + +---Sets the callback function for when the slider value changes +---@param callback fun(value:number) +function M:on_change(callback) + self.on_change_value:subscribe(callback) +end + + +---@param value number +function M:set_value(value, is_instant) + local diff = math.abs(self.max - self.min) + self.slider:set((value - self.min) / diff, true) + + local is_changed = self._value ~= value + if not is_changed then + return + end + + self._value = value + self.text_value:set_text(self._text_function(value)) + self.on_change_value:trigger(value) + + if not is_instant then + gui.set_alpha(self.selected, 1) + gui.animate(self.selected, "color.w", 0, gui.EASING_INSINE, 0.16) + end +end + + +---@return number +function M:get_value() + return self._value +end + + +function M:update_value(value) + local current_value = self._value + + local diff = math.abs(self.max - self.min) + -- [0..1] To range + value = value * diff + self.min + + -- Round to steps value (0.1, or 5. Should be divided on this value) + value = math.floor(value / self.step + 0.5) * self.step + + value = helper.clamp(value, self.min, self.max) + + self:set_value(value) +end + + +function M:set_number_type(min, max, step) + self.min = min or 0 + self.max = max or 1 + self.step = step + + self:set_text_function(function(value) + return tostring(value) + end) + + self:set_value(self._value, true) +end + + +function M:_on_slider_change_by_user(value) + self:set_value(value) +end + + +return M diff --git a/widget/properties_panel/properties/property_text.gui b/widget/properties_panel/properties/property_text.gui new file mode 100644 index 0000000..f1a8937 --- /dev/null +++ b/widget/properties_panel/properties/property_text.gui @@ -0,0 +1,105 @@ +fonts { + name: "druid_text_bold" + font: "/druid/fonts/druid_text_bold.font" +} +textures { + name: "druid" + texture: "/druid/druid.atlas" +} +nodes { + size { + x: 400.0 + y: 40.0 + } + type: TYPE_BOX + texture: "druid/empty" + id: "root" + adjust_mode: ADJUST_MODE_STRETCH + layer: "druid" + inherit_alpha: true + visible: false +} +nodes { + position { + x: -200.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 400.0 + y: 50.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_TEXT + text: "Text" + font: "druid_text_bold" + id: "text_name" + pivot: PIVOT_W + outline { + x: 1.0 + y: 1.0 + z: 1.0 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "root" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + position { + x: 200.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 350.0 + y: 50.0 + } + color { + x: 0.722 + y: 0.741 + z: 0.761 + } + type: TYPE_TEXT + text: "Text" + font: "druid_text_bold" + id: "text_right" + pivot: PIVOT_E + outline { + x: 1.0 + y: 1.0 + z: 1.0 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "root" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +layers { + name: "druid" +} +layers { + name: "druid_text_bold" +} +material: "/builtins/materials/gui.material" +adjust_reference: ADJUST_REFERENCE_PARENT diff --git a/widget/properties_panel/properties/property_text.lua b/widget/properties_panel/properties/property_text.lua new file mode 100644 index 0000000..9a3d2a7 --- /dev/null +++ b/widget/properties_panel/properties/property_text.lua @@ -0,0 +1,42 @@ +---@class widget.property_text: druid.widget +---@field root node +---@field container druid.container +---@field text_name druid.text +---@field text_right druid.text +local M = {} + +function M:init() + self.root = self:get_node("root") + self.text_name = self.druid:new_text("text_name") + :set_text_adjust("scale_then_trim_left", 0.3) + + self.text_right = self.druid:new_text("text_right", "") + --:set_text_adjust("scale_then_trim_left", 0.3) -- TODO: not works? why? + + self.container = self.druid:new_container(self.root) + self.container:add_container("text_name", nil, function(_, size) + self.text_name:set_size(size) + end) + self.container:add_container("text_right", nil, function(_, size) + self.text_right:set_size(size) + end) +end + + +---@param text string +---@return widget.property_text +function M:set_text_property(text) + self.text_name:set_text(text) + return self +end + + +---@param text string|nil +---@return widget.property_text +function M:set_text_value(text) + self.text_right:set_text(text or "") + return self +end + + +return M diff --git a/widget/properties_panel/properties/property_vector3.gui b/widget/properties_panel/properties/property_vector3.gui new file mode 100644 index 0000000..b350a92 --- /dev/null +++ b/widget/properties_panel/properties/property_vector3.gui @@ -0,0 +1,510 @@ +fonts { + name: "druid_text_bold" + font: "/druid/fonts/druid_text_bold.font" +} +fonts { + name: "druid_text_regular" + font: "/druid/fonts/druid_text_regular.font" +} +textures { + name: "druid" + texture: "/druid/druid.atlas" +} +nodes { + size { + x: 400.0 + y: 40.0 + } + type: TYPE_BOX + texture: "druid/empty" + id: "root" + adjust_mode: ADJUST_MODE_STRETCH + layer: "druid" + inherit_alpha: true + visible: false +} +nodes { + position { + x: -200.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 350.0 + y: 50.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_TEXT + text: "Vector3" + font: "druid_text_bold" + id: "text_name" + pivot: PIVOT_W + outline { + x: 1.0 + y: 1.0 + z: 1.0 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "root" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + position { + x: 200.0 + } + size { + x: 200.0 + y: 40.0 + } + type: TYPE_BOX + id: "E_Anchor" + pivot: PIVOT_E + parent: "root" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO + visible: false +} +nodes { + position { + x: -200.0 + } + size { + x: 66.0 + y: 40.0 + } + type: TYPE_BOX + id: "field_x" + pivot: PIVOT_W + parent: "E_Anchor" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO + visible: false +} +nodes { + position { + x: 6.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 30.0 + y: 40.0 + } + color { + x: 0.31 + y: 0.318 + z: 0.322 + } + type: TYPE_TEXT + text: "X" + font: "druid_text_regular" + id: "text_x" + parent: "field_x" + layer: "druid_text_regular" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + position { + x: 40.0 + } + type: TYPE_TEMPLATE + id: "rich_input_x" + parent: "field_x" + inherit_alpha: true + template: "/widget/rich_input/rich_input.gui" +} +nodes { + size { + x: 45.0 + y: 40.0 + } + type: TYPE_BOX + id: "rich_input_x/root" + parent: "rich_input_x" + overridden_fields: 4 + template_node_child: true +} +nodes { + size { + x: 45.0 + y: 40.0 + } + type: TYPE_BOX + id: "rich_input_x/button" + parent: "rich_input_x/root" + overridden_fields: 4 + template_node_child: true +} +nodes { + size { + x: 60.0 + y: 50.0 + } + type: TYPE_TEXT + text: "..." + id: "rich_input_x/placeholder_text" + parent: "rich_input_x/root" + overridden_fields: 4 + overridden_fields: 8 + template_node_child: true +} +nodes { + size { + x: 70.0 + y: 50.0 + } + type: TYPE_TEXT + text: "10" + id: "rich_input_x/input_text" + parent: "rich_input_x/root" + overridden_fields: 4 + overridden_fields: 8 + template_node_child: true +} +nodes { + position { + x: 15.0 + } + type: TYPE_BOX + id: "rich_input_x/cursor_node" + parent: "rich_input_x/root" + overridden_fields: 1 + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "rich_input_x/cursor_text" + parent: "rich_input_x/cursor_node" + template_node_child: true +} +nodes { + position { + x: 40.0 + y: -20.0 + } + size { + x: 45.0 + y: 4.0 + } + color { + x: 0.894 + y: 0.506 + z: 0.333 + } + type: TYPE_BOX + texture: "druid/pixel" + id: "selected_x" + pivot: PIVOT_S + adjust_mode: ADJUST_MODE_STRETCH + parent: "field_x" + layer: "druid" + inherit_alpha: true +} +nodes { + position { + x: -132.0 + } + size { + x: 66.0 + y: 40.0 + } + type: TYPE_BOX + id: "field_y" + pivot: PIVOT_W + parent: "E_Anchor" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO + visible: false +} +nodes { + position { + x: 6.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 30.0 + y: 40.0 + } + color { + x: 0.31 + y: 0.318 + z: 0.322 + } + type: TYPE_TEXT + text: "Y" + font: "druid_text_regular" + id: "text_y" + parent: "field_y" + layer: "druid_text_regular" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + position { + x: 40.0 + } + type: TYPE_TEMPLATE + id: "rich_input_y" + parent: "field_y" + inherit_alpha: true + template: "/widget/rich_input/rich_input.gui" +} +nodes { + size { + x: 45.0 + y: 40.0 + } + type: TYPE_BOX + id: "rich_input_y/root" + parent: "rich_input_y" + overridden_fields: 4 + template_node_child: true +} +nodes { + size { + x: 45.0 + y: 40.0 + } + type: TYPE_BOX + id: "rich_input_y/button" + parent: "rich_input_y/root" + overridden_fields: 4 + template_node_child: true +} +nodes { + size { + x: 60.0 + y: 50.0 + } + type: TYPE_TEXT + text: "..." + id: "rich_input_y/placeholder_text" + parent: "rich_input_y/root" + overridden_fields: 4 + overridden_fields: 8 + template_node_child: true +} +nodes { + size { + x: 70.0 + y: 50.0 + } + type: TYPE_TEXT + text: "10" + id: "rich_input_y/input_text" + parent: "rich_input_y/root" + overridden_fields: 4 + overridden_fields: 8 + template_node_child: true +} +nodes { + position { + x: 15.0 + } + type: TYPE_BOX + id: "rich_input_y/cursor_node" + parent: "rich_input_y/root" + overridden_fields: 1 + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "rich_input_y/cursor_text" + parent: "rich_input_y/cursor_node" + template_node_child: true +} +nodes { + position { + x: 40.0 + y: -20.0 + } + size { + x: 45.0 + y: 4.0 + } + color { + x: 0.894 + y: 0.506 + z: 0.333 + } + type: TYPE_BOX + texture: "druid/pixel" + id: "selected_y" + pivot: PIVOT_S + adjust_mode: ADJUST_MODE_STRETCH + parent: "field_y" + layer: "druid" + inherit_alpha: true +} +nodes { + position { + x: -66.0 + } + size { + x: 66.0 + y: 40.0 + } + type: TYPE_BOX + id: "field_z" + pivot: PIVOT_W + parent: "E_Anchor" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO + visible: false +} +nodes { + position { + x: 6.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 30.0 + y: 40.0 + } + color { + x: 0.31 + y: 0.318 + z: 0.322 + } + type: TYPE_TEXT + text: "Z" + font: "druid_text_regular" + id: "text_z" + parent: "field_z" + layer: "druid_text_regular" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + position { + x: 40.0 + } + type: TYPE_TEMPLATE + id: "rich_input_z" + parent: "field_z" + inherit_alpha: true + template: "/widget/rich_input/rich_input.gui" +} +nodes { + size { + x: 45.0 + y: 40.0 + } + type: TYPE_BOX + id: "rich_input_z/root" + parent: "rich_input_z" + overridden_fields: 4 + template_node_child: true +} +nodes { + size { + x: 45.0 + y: 40.0 + } + type: TYPE_BOX + id: "rich_input_z/button" + parent: "rich_input_z/root" + overridden_fields: 4 + template_node_child: true +} +nodes { + size { + x: 60.0 + y: 50.0 + } + type: TYPE_TEXT + text: "..." + id: "rich_input_z/placeholder_text" + parent: "rich_input_z/root" + overridden_fields: 4 + overridden_fields: 8 + template_node_child: true +} +nodes { + size { + x: 70.0 + y: 50.0 + } + type: TYPE_TEXT + text: "10" + id: "rich_input_z/input_text" + parent: "rich_input_z/root" + overridden_fields: 4 + overridden_fields: 8 + template_node_child: true +} +nodes { + position { + x: 15.0 + } + type: TYPE_BOX + id: "rich_input_z/cursor_node" + parent: "rich_input_z/root" + overridden_fields: 1 + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "rich_input_z/cursor_text" + parent: "rich_input_z/cursor_node" + template_node_child: true +} +nodes { + position { + x: 40.0 + y: -20.0 + } + size { + x: 45.0 + y: 4.0 + } + color { + x: 0.894 + y: 0.506 + z: 0.333 + } + type: TYPE_BOX + texture: "druid/pixel" + id: "selected_z" + pivot: PIVOT_S + adjust_mode: ADJUST_MODE_STRETCH + parent: "field_z" + layer: "druid" + inherit_alpha: true +} +layers { + name: "druid" +} +layers { + name: "druid_text_regular" +} +layers { + name: "druid_text_bold" +} +material: "/builtins/materials/gui.material" +adjust_reference: ADJUST_REFERENCE_PARENT diff --git a/widget/properties_panel/properties/property_vector3.lua b/widget/properties_panel/properties/property_vector3.lua new file mode 100644 index 0000000..ed59fe2 --- /dev/null +++ b/widget/properties_panel/properties/property_vector3.lua @@ -0,0 +1,75 @@ +local event = require("event.event") + + +---@class widget.property_vector3: druid.widget +---@field root node +---@field container druid.container +---@field text_name druid.text +---@field button druid.button +---@field druid druid.instance +local M = {} + +function M:init() + self.root = self:get_node("root") + self.text_name = self.druid:new_text("text_name") + :set_text_adjust("scale_then_trim", 0.3) + + self.selected_x = self:get_node("selected_x") + gui.set_alpha(self.selected_x, 0) + + self.selected_y = self:get_node("selected_y") + gui.set_alpha(self.selected_y, 0) + + self.selected_z = self:get_node("selected_z") + gui.set_alpha(self.selected_z, 0) + + self.rich_input_x = self.druid:new_rich_input("rich_input_x") + self.rich_input_y = self.druid:new_rich_input("rich_input_y") + self.rich_input_z = self.druid:new_rich_input("rich_input_z") + + self.value = vmath.vector3(0) + + self.rich_input_x.input.on_input_unselect:subscribe(function() + self.value.x = tonumber(self.rich_input_x.input:get_text()) or 0 + self.on_change:trigger(self.value) + end) + + self.rich_input_y.input.on_input_unselect:subscribe(function() + self.value.y = tonumber(self.rich_input_y.input:get_text()) or 0 + self.on_change:trigger(self.value) + end) + + self.rich_input_z.input.on_input_unselect:subscribe(function() + self.value.z = tonumber(self.rich_input_z.input:get_text()) or 0 + self.on_change:trigger(self.value) + end) + + self.container = self.druid:new_container(self.root) + self.container:add_container("text_name") + self.container:add_container("E_Anchor") + + self.on_change = event.create() +end + + +---@param text string +---@return widget.property_vector3 +function M:set_text_property(text) + self.text_name:set_text(text) + return self +end + + +---@param x number +---@param y number +---@param z number +---@return widget.property_vector3 +function M:set_value(x, y, z) + self.rich_input_x:set_text(tostring(x)) + self.rich_input_y:set_text(tostring(y)) + self.rich_input_z:set_text(tostring(z)) + return self +end + + +return M diff --git a/widget/properties_panel/properties_panel.gui b/widget/properties_panel/properties_panel.gui new file mode 100644 index 0000000..6737993 --- /dev/null +++ b/widget/properties_panel/properties_panel.gui @@ -0,0 +1,846 @@ +fonts { + name: "druid_text_regular" + font: "/druid/fonts/druid_text_regular.font" +} +fonts { + name: "druid_text_bold" + font: "/druid/fonts/druid_text_bold.font" +} +textures { + name: "druid" + texture: "/druid/druid.atlas" +} +nodes { + size { + x: 400.0 + y: 400.0 + } + color { + x: 0.173 + y: 0.184 + z: 0.204 + } + type: TYPE_BOX + texture: "druid/ui_circle_16" + id: "root" + pivot: PIVOT_N + layer: "druid" + inherit_alpha: true + slice9 { + x: 8.0 + y: 8.0 + z: 8.0 + w: 8.0 + } +} +nodes { + position { + x: 200.0 + } + size { + x: 400.0 + y: 40.0 + } + color { + x: 0.173 + y: 0.184 + z: 0.204 + } + type: TYPE_BOX + texture: "druid/ui_circle_16" + id: "header" + pivot: PIVOT_NE + parent: "root" + layer: "druid" + inherit_alpha: true + slice9 { + x: 8.0 + y: 8.0 + z: 8.0 + w: 8.0 + } +} +nodes { + position { + x: -392.0 + y: -8.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 500.0 + y: 50.0 + } + color { + x: 0.463 + y: 0.475 + z: 0.49 + } + type: TYPE_TEXT + text: "Properties" + font: "druid_text_regular" + id: "text_header" + pivot: PIVOT_NW + outline { + x: 1.0 + y: 1.0 + z: 1.0 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "header" + layer: "druid_text_regular" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + position { + x: -8.0 + y: -4.0 + } + color { + x: 0.306 + y: 0.31 + z: 0.314 + } + type: TYPE_BOX + texture: "druid/icon_drag" + id: "icon_drag" + pivot: PIVOT_NE + parent: "header" + layer: "druid" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO +} +nodes { + position { + x: -48.0 + y: -4.0 + } + color { + x: 0.306 + y: 0.31 + z: 0.314 + } + type: TYPE_BOX + texture: "druid/icon_refresh" + id: "icon_refresh" + pivot: PIVOT_NE + parent: "header" + layer: "druid" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO +} +nodes { + position { + x: -88.0 + y: -4.0 + } + scale { + x: -1.0 + } + color { + x: 0.306 + y: 0.31 + z: 0.314 + } + type: TYPE_BOX + texture: "druid/icon_arrow" + id: "icon_back" + pivot: PIVOT_NW + parent: "header" + layer: "druid" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO +} +nodes { + position { + y: -50.0 + } + size { + x: 400.0 + y: 350.0 + } + type: TYPE_BOX + id: "content" + pivot: PIVOT_N + parent: "root" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO + visible: false +} +nodes { + position { + x: -200.0 + } + size { + x: 400.0 + y: 350.0 + } + type: TYPE_BOX + texture: "druid/empty" + id: "scroll_view" + xanchor: XANCHOR_LEFT + pivot: PIVOT_NW + adjust_mode: ADJUST_MODE_STRETCH + parent: "content" + layer: "druid" + inherit_alpha: true +} +nodes { + size { + x: 400.0 + y: 350.0 + } + type: TYPE_BOX + texture: "druid/pixel" + id: "scroll_content" + pivot: PIVOT_NW + adjust_mode: ADJUST_MODE_STRETCH + parent: "scroll_view" + layer: "druid" + inherit_alpha: true + slice9 { + x: 8.0 + y: 8.0 + w: 6.0 + } + visible: false +} +nodes { + position { + y: -10.0 + } + type: TYPE_BOX + texture: "druid/empty" + id: "properties" + parent: "content" + layer: "druid" + inherit_alpha: true + size_mode: SIZE_MODE_AUTO + visible: false +} +nodes { + type: TYPE_TEMPLATE + id: "property_slider" + parent: "properties" + inherit_alpha: true + template: "/widget/properties_panel/properties/property_slider.gui" +} +nodes { + type: TYPE_BOX + id: "property_slider/root" + parent: "property_slider" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_slider/text_name" + parent: "property_slider/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_slider/E_Anchor" + parent: "property_slider/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_slider/slider" + parent: "property_slider/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_slider/slider_back" + parent: "property_slider/slider" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_slider/slider_pin" + parent: "property_slider/slider" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_slider/button" + parent: "property_slider/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_slider/selected" + parent: "property_slider/button" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_slider/text_value" + parent: "property_slider/button" + template_node_child: true +} +nodes { + position { + y: -50.0 + } + type: TYPE_TEMPLATE + id: "property_checkbox" + parent: "properties" + inherit_alpha: true + template: "/widget/properties_panel/properties/property_checkbox.gui" +} +nodes { + type: TYPE_BOX + id: "property_checkbox/root" + parent: "property_checkbox" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_checkbox/text_name" + parent: "property_checkbox/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_checkbox/E_Anchor" + parent: "property_checkbox/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_checkbox/button" + parent: "property_checkbox/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_checkbox/icon" + parent: "property_checkbox/button" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_checkbox/selected" + parent: "property_checkbox/button" + template_node_child: true +} +nodes { + position { + y: -100.0 + } + type: TYPE_TEMPLATE + id: "property_button" + parent: "properties" + inherit_alpha: true + template: "/widget/properties_panel/properties/property_button.gui" +} +nodes { + type: TYPE_BOX + id: "property_button/root" + parent: "property_button" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_button/text_name" + parent: "property_button/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_button/E_Anchor" + parent: "property_button/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_button/button" + parent: "property_button/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_button/selected" + parent: "property_button/button" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_button/text_button" + parent: "property_button/button" + template_node_child: true +} +nodes { + position { + y: -150.0 + } + type: TYPE_TEMPLATE + id: "property_input" + parent: "properties" + inherit_alpha: true + template: "/widget/properties_panel/properties/property_input.gui" +} +nodes { + type: TYPE_BOX + id: "property_input/root" + parent: "property_input" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_input/text_name" + parent: "property_input/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_input/E_Anchor" + parent: "property_input/root" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "property_input/rich_input" + parent: "property_input/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_input/rich_input/root" + parent: "property_input/rich_input" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_input/rich_input/button" + parent: "property_input/rich_input/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_input/rich_input/placeholder_text" + parent: "property_input/rich_input/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_input/rich_input/input_text" + parent: "property_input/rich_input/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_input/rich_input/cursor_node" + parent: "property_input/rich_input/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_input/rich_input/cursor_text" + parent: "property_input/rich_input/cursor_node" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_input/selected" + parent: "property_input/E_Anchor" + template_node_child: true +} +nodes { + position { + y: -200.0 + } + type: TYPE_TEMPLATE + id: "property_text" + parent: "properties" + inherit_alpha: true + template: "/widget/properties_panel/properties/property_text.gui" +} +nodes { + type: TYPE_BOX + id: "property_text/root" + parent: "property_text" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_text/text_name" + parent: "property_text/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_text/text_right" + parent: "property_text/root" + template_node_child: true +} +nodes { + position { + y: -250.0 + } + type: TYPE_TEMPLATE + id: "property_left_right_selector" + parent: "properties" + inherit_alpha: true + template: "/widget/properties_panel/properties/property_left_right_selector.gui" +} +nodes { + type: TYPE_BOX + id: "property_left_right_selector/root" + parent: "property_left_right_selector" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_left_right_selector/text_name" + parent: "property_left_right_selector/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_left_right_selector/E_Anchor" + parent: "property_left_right_selector/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_left_right_selector/button_left" + parent: "property_left_right_selector/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_left_right_selector/icon_left" + parent: "property_left_right_selector/button_left" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_left_right_selector/button_right" + parent: "property_left_right_selector/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_left_right_selector/icon_right" + parent: "property_left_right_selector/button_right" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_left_right_selector/selected" + parent: "property_left_right_selector/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_left_right_selector/text_value" + parent: "property_left_right_selector/E_Anchor" + template_node_child: true +} +nodes { + position { + y: -300.0 + } + type: TYPE_TEMPLATE + id: "property_vector3" + parent: "properties" + inherit_alpha: true + template: "/widget/properties_panel/properties/property_vector3.gui" +} +nodes { + type: TYPE_BOX + id: "property_vector3/root" + parent: "property_vector3" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/text_name" + parent: "property_vector3/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/E_Anchor" + parent: "property_vector3/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/field_x" + parent: "property_vector3/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/text_x" + parent: "property_vector3/field_x" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "property_vector3/rich_input_x" + parent: "property_vector3/field_x" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/rich_input_x/root" + parent: "property_vector3/rich_input_x" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/rich_input_x/button" + parent: "property_vector3/rich_input_x/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/rich_input_x/placeholder_text" + parent: "property_vector3/rich_input_x/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/rich_input_x/input_text" + parent: "property_vector3/rich_input_x/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/rich_input_x/cursor_node" + parent: "property_vector3/rich_input_x/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/rich_input_x/cursor_text" + parent: "property_vector3/rich_input_x/cursor_node" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/selected_x" + parent: "property_vector3/field_x" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/field_y" + parent: "property_vector3/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/text_y" + parent: "property_vector3/field_y" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "property_vector3/rich_input_y" + parent: "property_vector3/field_y" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/rich_input_y/root" + parent: "property_vector3/rich_input_y" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/rich_input_y/button" + parent: "property_vector3/rich_input_y/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/rich_input_y/placeholder_text" + parent: "property_vector3/rich_input_y/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/rich_input_y/input_text" + parent: "property_vector3/rich_input_y/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/rich_input_y/cursor_node" + parent: "property_vector3/rich_input_y/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/rich_input_y/cursor_text" + parent: "property_vector3/rich_input_y/cursor_node" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/selected_y" + parent: "property_vector3/field_y" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/field_z" + parent: "property_vector3/E_Anchor" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/text_z" + parent: "property_vector3/field_z" + template_node_child: true +} +nodes { + type: TYPE_TEMPLATE + id: "property_vector3/rich_input_z" + parent: "property_vector3/field_z" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/rich_input_z/root" + parent: "property_vector3/rich_input_z" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/rich_input_z/button" + parent: "property_vector3/rich_input_z/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/rich_input_z/placeholder_text" + parent: "property_vector3/rich_input_z/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/rich_input_z/input_text" + parent: "property_vector3/rich_input_z/root" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/rich_input_z/cursor_node" + parent: "property_vector3/rich_input_z/root" + template_node_child: true +} +nodes { + type: TYPE_TEXT + id: "property_vector3/rich_input_z/cursor_text" + parent: "property_vector3/rich_input_z/cursor_node" + template_node_child: true +} +nodes { + type: TYPE_BOX + id: "property_vector3/selected_z" + parent: "property_vector3/field_z" + template_node_child: true +} +nodes { + position { + y: -100.0 + } + type: TYPE_TEMPLATE + id: "property_button_small" + parent: "properties" + inherit_alpha: true + template: "/widget/properties_panel/properties/property_button.gui" + enabled: false +} +nodes { + type: TYPE_BOX + id: "property_button_small/root" + parent: "property_button_small" + template_node_child: true +} +nodes { + size { + x: 700.0 + y: 40.0 + } + type: TYPE_TEXT + id: "property_button_small/text_name" + parent: "property_button_small/root" + overridden_fields: 4 + template_node_child: true +} +nodes { + size { + x: 40.0 + y: 40.0 + } + type: TYPE_BOX + id: "property_button_small/E_Anchor" + parent: "property_button_small/root" + overridden_fields: 4 + template_node_child: true +} +nodes { + position { + x: -20.0 + } + size { + x: 40.0 + y: 40.0 + } + type: TYPE_BOX + id: "property_button_small/button" + parent: "property_button_small/E_Anchor" + overridden_fields: 1 + overridden_fields: 4 + template_node_child: true +} +nodes { + size { + x: 40.0 + y: 4.0 + } + type: TYPE_BOX + id: "property_button_small/selected" + parent: "property_button_small/button" + overridden_fields: 4 + template_node_child: true +} +nodes { + size { + x: 40.0 + y: 50.0 + } + type: TYPE_TEXT + text: ">" + id: "property_button_small/text_button" + parent: "property_button_small/button" + overridden_fields: 4 + overridden_fields: 8 + template_node_child: true +} +layers { + name: "druid" +} +layers { + name: "druid_text_regular" +} +layers { + name: "druid_text_bold" +} +material: "/builtins/materials/gui.material" +adjust_reference: ADJUST_REFERENCE_PARENT diff --git a/widget/properties_panel/properties_panel.lua b/widget/properties_panel/properties_panel.lua new file mode 100644 index 0000000..55c5cf8 --- /dev/null +++ b/widget/properties_panel/properties_panel.lua @@ -0,0 +1,580 @@ +local event = require("event.event") + +local color = require("druid.color") +local helper = require("druid.helper") +local property_checkbox = require("widget.properties_panel.properties.property_checkbox") +local property_slider = require("widget.properties_panel.properties.property_slider") +local property_button = require("widget.properties_panel.properties.property_button") +local property_input = require("widget.properties_panel.properties.property_input") +local property_text = require("widget.properties_panel.properties.property_text") +local property_left_right_selector = require("widget.properties_panel.properties.property_left_right_selector") +local property_vector3 = require("widget.properties_panel.properties.property_vector3") + +---@class widget.properties_panel: druid.widget +---@field root node +---@field scroll druid.scroll +---@field layout druid.layout +---@field container druid.container +---@field container_content druid.container +---@field container_scroll_view druid.container +---@field container_scroll_content druid.container +---@field button_hidden druid.button +---@field text_header druid.text +---@field paginator widget.property_left_right_selector +---@field properties druid.widget[] List of created properties +---@field properties_constructors fun()[] List of properties functions to create a new widget. Used to not spawn non-visible widgets but keep the reference +local M = {} + +local COLOR_BUTTON = "#4E4F50" +local COLOR_REFRESH_ACTIVE = "#8BD092" + +function M:init() + self.root = self:get_node("root") + self.scale_root = gui.get_scale(self.root) + self.content = self:get_node("content") + + self.container = self.druid:new_container(self.root) + self.container:add_container("header") + self.container_content = self.container:add_container("content") + self.container_scroll_view = self.container_content:add_container("scroll_view") + self.container_scroll_content = self.container_scroll_view:add_container("scroll_content") + + self.default_size = self.container:get_size() + self.header_size = gui.get_size(self:get_node("header")) + + -- To have ability to go back to previous scene, collections of all properties to rebuild + self.scenes = {} + + self.properties = {} + self.properties_constructors = {} + self.current_page = 1 + self.properties_per_page = 15 + + self.text_header = self.druid:new_text("text_header") + self.scroll = self.druid:new_scroll("scroll_view", "scroll_content") + self.layout = self.druid:new_layout("scroll_content", "vertical") + :set_hug_content(false, true) + :set_padding(nil, 0) + + self.layout.on_size_changed:subscribe(self.on_size_changed, self) + + self.druid:new_drag("header", self.on_drag_widget) + self.button_hidden = self.druid:new_button("icon_drag", function() + self:set_hidden(not self._is_hidden) + end):set_style(nil) + + self.button_back = self.druid:new_button("icon_back", function() + self:previous_scene() + end) + gui.set_enabled(self.button_back.node, false) + + self.button_refresh = self.druid:new_button("icon_refresh", function() + self:toggle_auto_refresh() + end) + + -- We not using as a part of properties, since it handled in a way to be paginable + self.paginator = self.druid:new_widget(property_left_right_selector, "property_left_right_selector", "root") + self.paginator:set_text("Page") + self.paginator:set_number_type(1, 1, true) + self.paginator:set_value(self.current_page) + self.paginator.on_change_value:subscribe(function(value) + self:set_page(value) + end) + local width = self.layout:get_content_size() + self.paginator.container:set_size(width) + + gui.set_enabled(self.paginator.root, false) + + gui.set_enabled(self:get_node("property_checkbox/root"), false) + gui.set_enabled(self:get_node("property_slider/root"), false) + gui.set_enabled(self:get_node("property_button/root"), false) + gui.set_enabled(self:get_node("property_button_small/root"), false) + gui.set_enabled(self:get_node("property_input/root"), false) + gui.set_enabled(self:get_node("property_text/root"), false) + gui.set_enabled(self:get_node("property_left_right_selector/root"), false) + gui.set_enabled(self:get_node("property_vector3/root"), false) +end + + +function M:on_remove() + self:clear() +end + + +function M:toggle_auto_refresh() + self._is_auto_refresh = not self._is_auto_refresh + + if self._is_auto_refresh then + self.is_dirty = true + color.set_color(self.button_refresh.node, COLOR_REFRESH_ACTIVE) + self._timer_refresh = timer.delay(1, true, function() + self.is_dirty = true + end) + else + color.set_color(self.button_refresh.node, COLOR_BUTTON) + timer.cancel(self._timer_refresh) + self._timer_refresh = nil + end +end + + +function M:on_drag_widget(dx, dy) + local position = self.container:get_position() + self.container:set_position(position.x + dx * self.scale_root.x, position.y + dy * self.scale_root.y) +end + + +function M:clear_created_properties() + for index = 1, #self.properties do + local property = self.properties[index] + local root = property.root --[[@as node]] + + if root then + -- If prefab used clone nodes we can remove it + if property:get_nodes() then + gui.delete_node(root) + else + -- Probably we have component placed on scene directly + gui.set_enabled(root, false) + end + end + + self.druid:remove(self.properties[index]) + end + self.properties = {} + + self.layout:clear_layout() + + -- Use paginator as "pinned" widget + self.layout:add(self.paginator.root) +end + + +function M:next_scene() + local scene = { + header = self.text_header:get_text(), + current_page = self.current_page, + } + + helper.add_array(scene, self.properties_constructors) + table.insert(self.scenes, scene) + + self:clear() + + self.is_dirty = true + + gui.set_enabled(self.button_back.node, #self.scenes > 0) +end + + +function M:previous_scene() + local scene = table.remove(self.scenes) + self:clear() + helper.add_array(self.properties_constructors, scene) + + self.text_header:set_text(scene.header) + self.current_page = scene.current_page + + self.is_dirty = true + + gui.set_enabled(self.button_back.node, #self.scenes > 0) +end + + +function M:clear() + self:clear_created_properties() + self.properties_constructors = {} + self.current_page = 1 +end + + +function M:on_size_changed(new_size) + self.container_content:set_size(new_size.x, new_size.y, gui.PIVOT_N) + + self.default_size = vmath.vector3(new_size.x, new_size.y + 50, 0) + if not self._is_hidden then + self.container:set_size(self.default_size.x, self.default_size.y, gui.PIVOT_N) + end + + local width = self.layout:get_size().x - self.layout.padding.x - self.layout.padding.z + for index = 1, #self.properties do + local property = self.properties[index] + local container = property.container --[[@as druid.container]] + if container then + container:set_size(width) + end + end + self.paginator.container:set_size(width) +end + + +function M:update(dt) + if not self.is_dirty then + return + end + + self.is_dirty = false + + self:clear_created_properties() + + local properties_count = #self.properties_constructors + + -- Render all current properties + local start_index = (self.current_page - 1) * self.properties_per_page + 1 + local end_index = start_index + self.properties_per_page - 1 + end_index = math.min(end_index, properties_count) + + local is_paginator_visible = properties_count > self.properties_per_page + gui.set_enabled(self.paginator.root, is_paginator_visible) + self.paginator:set_number_type(1, math.ceil(properties_count / self.properties_per_page), true) + self.paginator.text_value:set_text(self.current_page .. " / " .. math.ceil(properties_count / self.properties_per_page)) + + for index = start_index, end_index do + self.properties_constructors[index]() + end +end + + +---@param on_create fun(checkbox: widget.property_checkbox)|nil +---@return widget.properties_panel +function M:add_checkbox(on_create) + return self:add_inner_widget(property_checkbox, "property_checkbox", "root", on_create) +end + + +---@param on_create fun(slider: widget.property_slider)|nil +---@return widget.properties_panel +function M:add_slider(on_create) + return self:add_inner_widget(property_slider, "property_slider", "root", on_create) +end + + +---@param on_create fun(button: widget.property_button)|nil +---@return widget.properties_panel +function M:add_button(on_create) + return self:add_inner_widget(property_button, "property_button", "root", on_create) +end + +---@param on_create fun(button: widget.property_button)|nil +---@return widget.properties_panel +function M:add_button_small(on_create) + return self:add_inner_widget(property_button, "property_button_small", "root", on_create) +end + + +---@param on_create fun(input: widget.property_input)|nil +---@return widget.properties_panel +function M:add_input(on_create) + return self:add_inner_widget(property_input, "property_input", "root", on_create) +end + + +---@param on_create fun(text: widget.property_text)|nil +function M:add_text(on_create) + return self:add_inner_widget(property_text, "property_text", "root", on_create) +end + + +---@param on_create fun(selector: widget.property_left_right_selector)|nil +function M:add_left_right_selector(on_create) + return self:add_inner_widget(property_left_right_selector, "property_left_right_selector", "root", on_create) +end + + +---@param on_create fun(vector3: widget.property_vector3)|nil +function M:add_vector3(on_create) + return self:add_inner_widget(property_vector3, "property_vector3", "root", on_create) +end + + +---@private +---@generic T: druid.widget +---@param widget_class T +---@param template string|nil +---@param nodes table|string|node|nil +---@param on_create fun(widget: T)|nil +---@return widget.properties_panel +function M:add_inner_widget(widget_class, template, nodes, on_create) + table.insert(self.properties_constructors, function() + local widget = self.druid:new_widget(widget_class, template, nodes) + + self:add_property(widget) + if on_create then + on_create(widget) + end + end) + + self.is_dirty = true + + return self +end + + +---@param create_widget_callback fun(): druid.widget +---@return widget.properties_panel +function M:add_widget(create_widget_callback) + table.insert(self.properties_constructors, function() + local widget = create_widget_callback() + self:add_property(widget) + end) + + self.is_dirty = true + + return self +end + + +---@private +function M:create_from_prefab(widget_class, template, nodes) + return self:add_property(self.druid:new_widget(widget_class, template, nodes)) +end + + +---@private +function M:add_property(widget) + gui.set_enabled(widget.root, true) + table.insert(self.properties, widget) + local width = self.layout:get_content_size() + widget.container:set_size(width) + + self.layout:add(widget.root) + + return widget +end + + +function M:remove(widget) + for index = 1, #self.properties do + if self.properties[index] == widget then + self.druid:remove(widget) + self.layout:remove(widget.root) + + -- If prefab used clone nodes we can remove it + if widget:get_nodes() then + gui.delete_node(widget.root) + else + -- Probably we have component placed on scene directly + gui.set_enabled(widget.root, false) + end + + table.remove(self.properties, index) + break + end + end +end + + +---Force to refresh properties next update +function M:set_dirty() + self.is_dirty = true +end + + +function M:set_hidden(is_hidden) + self._is_hidden = is_hidden + local node_header = self:get_node("header") + + local new_size = self._is_hidden and self.header_size or self.default_size + self.container:set_size(new_size.x, new_size.y, gui.PIVOT_N) + + local hidden_width = self.header_size.y + 8 + gui.set(node_header, "size.x", self._is_hidden and hidden_width or self.header_size.x) + + gui.set_visible(node_header, self._is_hidden) + gui.set_visible(self.root, not self._is_hidden) + + gui.set_enabled(self.text_header.node, not self._is_hidden) + gui.set_enabled(self.content, not self._is_hidden) + gui.set_enabled(self.button_refresh.node, not self._is_hidden) + gui.set_visible(self.button_back.node, not self._is_hidden) + + if not self._is_hidden then + self.is_dirty = true + end +end + + +function M:is_hidden() + return self._is_hidden +end + + +function M:load_previous_page() + self.current_page = self.current_page - 1 + self.is_dirty = true +end + + +---@param properties_per_page number +function M:set_properties_per_page(properties_per_page) + self.properties_per_page = properties_per_page +end + + +---Set a page of current scene +---@param page number +function M:set_page(page) + self.current_page = page + self.is_dirty = true +end + + +---Set a text at left top corner of the properties panel +---@param header string +function M:set_header(header) + self.text_header:set_text(header) +end + + +---@param data table +function M:render_lua_table(data) + local component_order = {} + for component_id in pairs(data) do + table.insert(component_order, component_id) + end + table.sort(component_order, function(a, b) + local a_type = type(data[a]) + local b_type = type(data[b]) + if a_type ~= b_type then + return a_type < b_type + end + if type(a) == "number" and type(b) == "number" then + return a < b + end + return tostring(a) < tostring(b) + end) + + for i = 1, #component_order do + local component_id = component_order[i] + self:add_property_component(component_id, data) + end + + local metatable = getmetatable(data) + if metatable and metatable.__index and type(metatable.__index) == "table" then + local metatable_order = {} + for key in pairs(metatable.__index) do + table.insert(metatable_order, key) + end + table.sort(metatable_order) + + for i = 1, #metatable_order do + local component_id = metatable_order[i] + local component = metatable.__index[component_id] + self:add_property_component("M:" .. component_id, data) + end + end +end + + +---@private +---@param component_id string +---@param data table +function M:add_property_component(component_id, data) + local component = data[component_id] + local component_type = type(component) + + if component_type == "table" then + local is_event = event.is_event(component) + if is_event then + self:add_button(function(button) + button:set_text_property(tostring(component_id)) + button:set_text_button("Call Event (" .. #component .. ")") + button.button.on_click:subscribe(function() + component:trigger() + end) + end) + else + self:add_button(function(button) + local is_empty = next(component) == nil + local is_array = component[1] ~= nil + local name = "Inspect" + if is_empty then + name = "Inspect (Empty)" + end + if is_array then + name = "Inspect (" .. #component .. ")" + end + + local button_name = component_id + -- If it's a number or array, try to get the id/name/prefab_id from the component + if type(component) == "table" and type(component_id) == "number" then + local extracted_id = component.name or component.prefab_id or component.node_id or component.id + if extracted_id then + button_name = component_id .. ". " .. extracted_id + end + end + + button:set_text_property(button_name) + button:set_text_button(name) + button.button.on_click:subscribe(function() + self:next_scene() + self:set_header(button_name) + self:render_lua_table(component) + end) + end) + end + end + + if component_type == "string" then + self:add_input(function(input) + input:set_text_property(tostring(component_id)) + input:set_text_value(tostring(data[component_id])) + input:on_change(function(_, value) + data[component_id] = value + end) + end) + end + + if component_type == "number" then + self:add_input(function(input) + input:set_text_property(tostring(component_id)) + input:set_text_value(tostring(helper.round(data[component_id], 3))) + input:on_change(function(_, value) + data[component_id] = tonumber(value) + end) + end) + end + + if component_type == "boolean" then + self:add_checkbox(function(checkbox) + checkbox:set_text_property(tostring(component_id)) + checkbox:set_value(data[component_id]) + checkbox:on_change(function(value) + data[component_id] = value + end) + end) + end + + if component_type == "userdata" then + if types.is_vector3(component) then + ---@cast component vector3 + self:add_vector3(function(vector3) + vector3:set_text_property(tostring(component_id)) + vector3:set_value(data[component_id].x, data[component_id].y, data[component_id].z) + vector3.on_change:subscribe(function(value) + data[component_id].x = value.x + data[component_id].y = value.y + data[component_id].z = value.z + end) + end) + else + self:add_text(function(text) + text:set_text_property(tostring(component_id)) + text:set_text_value(tostring(data[component_id])) + end) + end + end + + if component_type == "function" then + self:add_button(function(button) + button:set_text_property(tostring(component_id)) + button:set_text_button("Call") + button.button.on_click:subscribe(function() + component(data) + end) + end) + end +end + + +return M diff --git a/widget/properties_panel/properties_panel.version b/widget/properties_panel/properties_panel.version new file mode 100644 index 0000000..44cc754 --- /dev/null +++ b/widget/properties_panel/properties_panel.version @@ -0,0 +1 @@ +Insality:properties_panel@1 \ No newline at end of file diff --git a/widget/rich_input/rich_input.gui b/widget/rich_input/rich_input.gui new file mode 100644 index 0000000..da0872e --- /dev/null +++ b/widget/rich_input/rich_input.gui @@ -0,0 +1,171 @@ +fonts { + name: "druid_text_bold" + font: "/druid/fonts/druid_text_bold.font" +} +textures { + name: "druid" + texture: "/druid/druid.atlas" +} +nodes { + size { + x: 200.0 + y: 40.0 + } + type: TYPE_BOX + id: "root" + inherit_alpha: true + visible: false +} +nodes { + size { + x: 200.0 + y: 40.0 + } + color { + x: 0.31 + y: 0.318 + z: 0.322 + } + type: TYPE_BOX + texture: "druid/rect_round2_width2" + id: "button" + parent: "root" + layer: "druid" + inherit_alpha: true + slice9 { + x: 4.0 + y: 4.0 + z: 4.0 + w: 4.0 + } +} +nodes { + scale { + x: 0.5 + y: 0.5 + } + size { + x: 380.0 + y: 50.0 + } + color { + x: 0.31 + y: 0.318 + z: 0.322 + } + type: TYPE_TEXT + text: "Placeholder" + font: "druid_text_bold" + id: "placeholder_text" + outline { + x: 0.4 + y: 0.4 + z: 0.4 + } + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "root" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + scale { + x: 0.5 + y: 0.5 + } + size { + x: 380.0 + y: 50.0 + } + color { + x: 0.722 + y: 0.741 + z: 0.761 + } + type: TYPE_TEXT + text: "User input" + font: "druid_text_bold" + id: "input_text" + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "root" + layer: "druid_text_bold" + inherit_alpha: true + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +nodes { + position { + x: 61.0 + } + scale { + x: 0.5 + y: 0.5 + } + size { + x: 16.0 + y: 50.0 + } + color { + x: 0.631 + y: 0.843 + z: 0.961 + } + type: TYPE_BOX + texture: "druid/ui_circle_16" + id: "cursor_node" + parent: "root" + layer: "druid" + inherit_alpha: true + slice9 { + x: 8.0 + y: 8.0 + z: 8.0 + w: 8.0 + } + alpha: 0.5 +} +nodes { + position { + x: -1.4 + y: 4.0 + } + size { + x: 20.0 + y: 40.0 + } + color { + x: 0.722 + y: 0.741 + z: 0.761 + } + type: TYPE_TEXT + text: "|" + font: "druid_text_bold" + id: "cursor_text" + shadow { + x: 1.0 + y: 1.0 + z: 1.0 + } + parent: "cursor_node" + layer: "druid_text_bold" + outline_alpha: 0.0 + shadow_alpha: 0.0 +} +layers { + name: "druid" +} +layers { + name: "druid_text_bold" +} +material: "/builtins/materials/gui.material" +adjust_reference: ADJUST_REFERENCE_PARENT diff --git a/widget/rich_input/rich_input.lua b/widget/rich_input/rich_input.lua new file mode 100644 index 0000000..a70b807 --- /dev/null +++ b/widget/rich_input/rich_input.lua @@ -0,0 +1,296 @@ +local helper = require("druid.helper") +local const = require("druid.const") +local utf8_lua = require("druid.system.utf8") +local utf8 = utf8 or utf8_lua + +---The widget that handles a rich text input field, it's a wrapper around the druid.input component +---@class widget.rich_input: druid.widget +---@field root node The root node of the rich input +---@field input druid.input The input component +---@field cursor node The cursor node +---@field cursor_text node The cursor text node +---@field cursor_position vector3 The position of the cursor +local M = {} + +local DOUBLE_CLICK_TIME = 0.35 +local TEMP_VECTOR = vmath.vector3(0) + + +function M:init() + self.root = self:get_node("root") + + self._last_touch_info = { + cursor_index = nil, + time = 0, + } + self.is_lshift = false + self.is_lctrl = false + + self.input = self.druid:new_input("button", "input_text") + self.is_button_input_enabled = gui.is_enabled(self.input.button.node) + + self.cursor = self:get_node("cursor_node") + self.cursor_position = gui.get_position(self.cursor) + self.cursor_text = self:get_node("cursor_text") + + self.drag = self.druid:new_drag("button", self._on_drag_callback) + self.drag.on_touch_start:subscribe(self._on_touch_start_callback) + self.drag:set_input_priority(const.PRIORITY_INPUT_MAX + 1) + self.drag:set_enabled(false) + + self.input:set_text("") + self.placeholder = self.druid:new_text("placeholder_text") + self.text_position = gui.get_position(self.input.text.node) + + self.input.on_input_text:subscribe(function() return self:_update_text() end) + self.input.on_input_select:subscribe(function() return self:_on_select() end) + self.input.on_input_unselect:subscribe(function() return self:_on_unselect() end) + self.input.on_select_cursor_change:subscribe(function() return self:_update_selection() end) + + self:_on_unselect() + self:_update_text() +end + + +---@private +---@param action_id hash Action id from on_input +---@param action table Action table from on_input +---@return boolean is_consumed True if input was consumed +function M:on_input(action_id, action) + if action_id == const.ACTION_LSHIFT then + if action.pressed then + self.is_lshift = true + elseif action.released then + self.is_lshift = false + end + end + + if action_id == const.ACTION_LCTRL or action_id == const.ACTION_LCMD then + if action.pressed then + self.is_lctrl = true + elseif action.released then + self.is_lctrl = false + end + end + + if self.input.is_selected then + if action_id == const.ACTION_LEFT and (action.pressed or action.repeated) then + self.input:move_selection(-1, self.is_lshift, self.is_lctrl) + return true + end + + if action_id == const.ACTION_RIGHT and (action.pressed or action.repeated) then + self.input:move_selection(1, self.is_lshift, self.is_lctrl) + return true + end + end + + return false +end + + +---Set placeholder text +---@param placeholder_text string The placeholder text +---@return widget.rich_input self Current instance +function M:set_placeholder(placeholder_text) + self.placeholder:set_text(placeholder_text) + return self +end + + +---Select input field +---@return widget.rich_input self Current instance +function M:select() + self.input:select() + return self +end + + +---Set input field text +---@param text string The input text +---@return widget.rich_input self Current instance +function M:set_text(text) + self.input:set_text(text) + gui.set_enabled(self.placeholder.node, true and #self.input:get_text() == 0) + + return self +end + + +---Set input field font +---@param font hash The font hash +---@return widget.rich_input self Current instance +function M:set_font(font) + gui.set_font(self.input.text.node, font) + gui.set_font(self.placeholder.node, font) + + return self +end + + +---Set input field text +function M:get_text() + return self.input:get_text() +end + + +---Set allowed charaters for input field. +-- See: https://defold.com/ref/stable/string/ +-- ex: [%a%d] for alpha and numeric +---@param characters string Regular expression for validate user input +---@return widget.rich_input self Current instance +function M:set_allowed_characters(characters) + self.input:set_allowed_characters(characters) + + return self +end + + +function M:_animate_cursor() + gui.cancel_animations(self.cursor_text, "color.w") + gui.set_alpha(self.cursor_text, 1) + gui.animate(self.cursor_text, "color.w", 0, gui.EASING_INSINE, 0.8, 0, nil, gui.PLAYBACK_LOOP_PINGPONG) +end + + +function M:_set_selection_width(selection_width) + gui.set_visible(self.cursor, selection_width > 0) + + local width = selection_width / self.input.text.scale.x + local height = gui.get_size(self.cursor).y + gui.set_size(self.cursor, vmath.vector3(width, height, 0)) + + local is_selection_to_right = self.input.cursor_index == self.input.end_index + gui.set_pivot(self.cursor, is_selection_to_right and gui.PIVOT_E or gui.PIVOT_W) +end + + +function M:_update_text() + local full_text = self.input:get_text() + local visible_text = self.input.text:get_text() + + local is_truncated = visible_text ~= full_text + local cursor_index = self.input.cursor_index + if is_truncated then + -- If text is truncated, we need to adjust the cursor index + -- to the last visible character + cursor_index = utf8.len(visible_text) + + end + + local left_text_part = utf8.sub(self.input:get_text(), 0, cursor_index) + local selected_text_part = utf8.sub(self.input:get_text(), self.input.start_index + 1, self.input.end_index) + + local left_part_width = self.input.text:get_text_size(left_text_part) + local selected_part_width = self.input.text:get_text_size(selected_text_part) + + local pivot_text = gui.get_pivot(self.input.text.node) + local pivot_offset = helper.get_pivot_offset(pivot_text) + + self.cursor_position.x = self.text_position.x - self.input.text_width * (0.5 + pivot_offset.x) + left_part_width + + gui.set_position(self.cursor, self.cursor_position) + gui.set_scale(self.cursor, self.input.text.scale) + + self:_set_selection_width(selected_part_width) +end + + +function M:_on_select() + gui.set_enabled(self.cursor, true) + gui.set_enabled(self.placeholder.node, false) + gui.set_enabled(self.input.button.node, true) + + self:_animate_cursor() + self.drag:set_enabled(true) +end + + +function M:_on_unselect() + gui.cancel_animations(self.cursor, gui.PROP_COLOR) + gui.set_enabled(self.cursor, false) + gui.set_enabled(self.input.button.node, self.is_button_input_enabled) + gui.set_enabled(self.placeholder.node, true and #self.input:get_text() == 0) + + self.drag:set_enabled(false) +end + + +---Update selection +function M:_update_selection() + self:_update_text() +end + + +function M:_get_index_by_touch(touch) + local text_node = self.input.text.node + TEMP_VECTOR.x = touch.screen_x + TEMP_VECTOR.y = touch.screen_y + + -- Distance to the text node position + local scene_scale = helper.get_scene_scale(text_node) + local local_pos = gui.screen_to_local(text_node, TEMP_VECTOR) + local_pos.x = local_pos.x / scene_scale.x + + -- Offset to the left side of the text node + local pivot_offset = helper.get_pivot_offset(gui.get_pivot(text_node)) + local_pos.x = local_pos.x + self.input.total_width * (0.5 + pivot_offset.x) + local_pos.x = local_pos.x - self.text_position.x + + local cursor_index = self.input.text:get_text_index_by_width(local_pos.x) + return cursor_index +end + + +function M:_on_touch_start_callback(touch) + local cursor_index = self:_get_index_by_touch(touch) + pprint(touch) + if self._last_touch_info.cursor_index == cursor_index then + local time = socket.gettime() + if time - self._last_touch_info.time < DOUBLE_CLICK_TIME then + local len = utf8.len(self.input:get_text()) + self.input:select_cursor(len, 0, len) + self._last_touch_info.cursor_index = nil + + return + end + end + + self._last_touch_info.cursor_index = cursor_index + self._last_touch_info.time = socket.gettime() + + if self.input.is_lshift then + local start_index = self.input.start_index + local end_index = self.input.end_index + + if cursor_index < start_index then + self.input:select_cursor(cursor_index, cursor_index, end_index) + elseif cursor_index > end_index then + self.input:select_cursor(cursor_index, start_index, cursor_index) + end + else + self.input:select_cursor(cursor_index) + end +end + + +---@param dx number The delta x position +---@param dy number The delta y position +---@param x number The x position +---@param y number The y position +---@param touch table The touch table +function M:_on_drag_callback(dx, dy, x, y, touch) + if not self._last_touch_info.cursor_index then + return + end + + local index = self:_get_index_by_touch(touch) + if self._last_touch_info.cursor_index <= index then + self.input:select_cursor(index, self._last_touch_info.cursor_index, index) + else + self.input:select_cursor(index, index, self._last_touch_info.cursor_index) + end +end + + +return M diff --git a/widget/rich_input/rich_input.version b/widget/rich_input/rich_input.version new file mode 100644 index 0000000..98cbcb8 --- /dev/null +++ b/widget/rich_input/rich_input.version @@ -0,0 +1 @@ +Insality:rich_input@1 \ No newline at end of file From 6475a3b580f73220aa3f0b48231356a79618cc47 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 16 Feb 2026 10:22:58 +0200 Subject: [PATCH 44/71] Update wasd camera --- example/assets/camera_wasd_control.script | 47 ++++++++++++++++------- 1 file changed, 33 insertions(+), 14 deletions(-) diff --git a/example/assets/camera_wasd_control.script b/example/assets/camera_wasd_control.script index 9638ccc..82ed48d 100644 --- a/example/assets/camera_wasd_control.script +++ b/example/assets/camera_wasd_control.script @@ -6,6 +6,7 @@ function init(self) self.move = vmath.vector3() self.zoom_delta = 0 + self.pressed = {} self.move_up = hash("key_w") self.move_down = hash("key_s") self.move_left = hash("key_a") @@ -37,19 +38,37 @@ end function on_input(self, action_id, action) - local v = action.pressed and 1 or (action.released and -1) or 0 - if v == 0 then return end - if action_id == self.move_up then - self.move.y = self.move.y + v - elseif action_id == self.move_down then - self.move.y = self.move.y - v - elseif action_id == self.move_left then - self.move.x = self.move.x - v - elseif action_id == self.move_right then - self.move.x = self.move.x + v - elseif action_id == self.zoom_in then - self.zoom_delta = self.zoom_delta + v - elseif action_id == self.zoom_out then - self.zoom_delta = self.zoom_delta - v + if action.pressed then + if self.pressed[action_id] then return end + self.pressed[action_id] = true + if action_id == self.move_up then + self.move.y = self.move.y + 1 + elseif action_id == self.move_down then + self.move.y = self.move.y - 1 + elseif action_id == self.move_left then + self.move.x = self.move.x - 1 + elseif action_id == self.move_right then + self.move.x = self.move.x + 1 + elseif action_id == self.zoom_in then + self.zoom_delta = self.zoom_delta + 1 + elseif action_id == self.zoom_out then + self.zoom_delta = self.zoom_delta - 1 + end + elseif action.released then + if not self.pressed[action_id] then return end + self.pressed[action_id] = nil + if action_id == self.move_up then + self.move.y = self.move.y - 1 + elseif action_id == self.move_down then + self.move.y = self.move.y + 1 + elseif action_id == self.move_left then + self.move.x = self.move.x + 1 + elseif action_id == self.move_right then + self.move.x = self.move.x - 1 + elseif action_id == self.zoom_in then + self.zoom_delta = self.zoom_delta - 1 + elseif action_id == self.zoom_out then + self.zoom_delta = self.zoom_delta + 1 + end end end From 4a9365d2c9e230c7a4373467c81a4257388808de Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 16 Feb 2026 10:41:07 +0200 Subject: [PATCH 45/71] Entity optimization --- README.md | 2 + api/detiled_api.md | 2 + detiled/detiled.lua | 4 +- detiled/internal/detiled_annotations.lua | 14 +- detiled/internal/detiled_internal.lua | 2 +- detiled/internal/detiled_parser.lua | 156 ++++++++---------- example/example_grid/example_grid.script | 12 +- .../example_grid_game_objects.script | 12 +- .../example_hexgrid/example_hexgrid.script | 12 +- .../example_hexgrid_pointy.script | 14 +- .../example_isogrid/example_isogrid.script | 14 +- .../example_isogrid_staggered.script | 14 +- 12 files changed, 118 insertions(+), 140 deletions(-) diff --git a/README.md b/README.md index 41530a1..5315b1a 100644 --- a/README.md +++ b/README.md @@ -72,6 +72,8 @@ After that, select `Project ▸ Fetch Libraries` to update [library dependencies -- Use result.map_params for coordinate conversion (cell_to_pos, pos_to_cell) ``` + Each entity is a flat table: `prefab_id`, `position_x`, `position_y`, `position_z`, and optionally `scale_x`, `scale_y`, `rotation` (omitted when default), plus `name`, `tiled_id`, `tiled_layer_id`, and any custom properties from Tiled. + ### Prefab ID Resolution Prefab IDs are determined in this order: diff --git a/api/detiled_api.md b/api/detiled_api.md index 1c15301..f4032f8 100644 --- a/api/detiled_api.md +++ b/api/detiled_api.md @@ -32,6 +32,8 @@ detiled.get_entity_from_map(map_or_path) Load a tiled map and return map params and entities. Use `result.entities` to spawn and `result.map_params` for coordinate conversion. +Each entity is a flat table: `prefab_id`, `position_x`, `position_y`, `position_z`; optional `scale_x`, `scale_y`, `rotation` (only set when non-default); optional `name`, `tiled_id`, `tiled_layer_id`, `size_x`, `size_y`; plus any custom properties from Tiled. + - **Parameters:** - `map_or_path` *(string|detiled.map)*: diff --git a/detiled/detiled.lua b/detiled/detiled.lua index 9541444..3471691 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -18,6 +18,7 @@ end ---@param map_or_path detiled.map|string ---@return detiled.get_entity_from_map_result function M.get_entity_from_map(map_or_path) + collectgarbage("stop") local memory = collectgarbage("count") local map = map_or_path @@ -36,7 +37,8 @@ function M.get_entity_from_map(map_or_path) local result = detiled_parser.get_entities(map) - print("Memory after get entities", collectgarbage("count") - memory) + print("Memory after get entities", #result.entities, collectgarbage("count") - memory) + collectgarbage("restart") return result end diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index ddd5a87..287e15c 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -126,8 +126,18 @@ ---@field source string ---@class detiled.entity ----@field prefab_id string ----@field components table +---@field prefab_id string|nil +---@field position_x number +---@field position_y number +---@field position_z number +---@field scale_x number|nil +---@field scale_y number|nil +---@field rotation number|nil +---@field name string|nil +---@field tiled_id string|nil +---@field tiled_layer_id string|nil +---@field size_x number|nil +---@field size_y number|nil ---@class detiled.map_params.tile ---@field width number diff --git a/detiled/internal/detiled_internal.lua b/detiled/internal/detiled_internal.lua index 77b5a01..6935e91 100644 --- a/detiled/internal/detiled_internal.lua +++ b/detiled/internal/detiled_internal.lua @@ -232,7 +232,7 @@ function M.merge_tables(t1, t2) end ----@param entity entity +---@param entity table ---@param components table function M.apply_components(entity, components) for component_id, component_data in pairs(components) do diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 21175e8..9136575 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -14,14 +14,13 @@ local GRID_MODULES = { ---@param layer detiled.map.layer ---@param map detiled.map +---@param grid_module table +---@param map_params detiled.map_params ---@return detiled.entity[] -local function get_entities_from_tile_layer(layer, map) +local function get_entities_from_tile_layer(layer, map, grid_module, map_params) ---@type detiled.entity[] local entities = {} - local grid_module = GRID_MODULES[map.orientation] - local map_params = grid_module.get_map_params_from_tiled(map) - local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 local layer_data = layer.data @@ -54,7 +53,6 @@ local function get_entities_from_tile_layer(layer, map) local prefab_id = tile.class or tile.type if not prefab_id or prefab_id == "" then - -- Take from tile.image as a default prefab_id and strip path + extension local image_path = tile.image if image_path and image_path ~= "" then prefab_id = detiled_internal.get_filename(image_path) @@ -64,24 +62,25 @@ local function get_entities_from_tile_layer(layer, map) local scale_x = flip_h and -1 or 1 local scale_y = flip_v and -1 or 1 local rotation = flip_d and -90 or 0 - local transform = { - position_x = pos_x, - position_y = pos_y, - position_z = position_z, - } - if scale_x ~= 1 then transform.scale_x = scale_x end - if scale_y ~= 1 then transform.scale_y = scale_y end - if rotation ~= 0 then transform.rotation = rotation end ---@type detiled.entity local entity = { prefab_id = prefab_id, - components = { - prefab_id = prefab_id, - tiled_layer_id = layer.name, - transform = transform, - } + position_x = pos_x, + position_y = pos_y, + position_z = position_z, + tiled_layer_id = layer.name, } + if scale_x ~= 1 then entity.scale_x = scale_x end + if scale_y ~= 1 then entity.scale_y = scale_y end + if rotation ~= 0 then entity.rotation = rotation end + + if tile.properties then + local tiled_components = detiled_internal.get_components_property(tile.properties) + if tiled_components then + detiled_internal.apply_components(entity, tiled_components) + end + end table.insert(entities, entity) end @@ -93,14 +92,13 @@ end ---@param layer detiled.map.layer ---@param map detiled.map +---@param grid_module table +---@param map_params detiled.map_params ---@return detiled.entity[] -local function get_entities_from_object_layer(layer, map) +local function get_entities_from_object_layer(layer, map, grid_module, map_params) ---@type detiled.entity[] local entities = {} - local grid_module = GRID_MODULES[map.orientation] - local map_params = grid_module.get_map_params_from_tiled(map) - local map_width = map_params.scene.size_x local map_height = map_params.scene.size_y local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 @@ -110,11 +108,10 @@ local function get_entities_from_object_layer(layer, map) local rotation = -(object.rotation or 0) local object_gid = object.gid - if object_gid then -- If object has a tileset, spawn from tileset + if object_gid then local cleared_gid, flip_h, flip_v, flip_d = detiled_internal.parse_gid_flags(object_gid) local tile, tileset = detiled_internal.get_tile_by_gid(map, cleared_gid) if tile and tileset then - local entity = {} local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, tile, map_width, map_height, map_params) position_x = position_x + (layer.offsetx or 0) position_y = position_y - (layer.offsety or 0) @@ -124,56 +121,48 @@ local function get_entities_from_object_layer(layer, map) if flip_d then rotation = rotation - 90 end local prefab_id = tile.class or tile.type - if not prefab_id or prefab_id == "" then - -- Take from tile.image as a default prefab_id and strip path + extension local image_path = tile.image if image_path and image_path ~= "" then prefab_id = detiled_internal.get_filename(image_path) end end - local components = { - name = object.name ~= "" and object.name or nil, + ---@type detiled.entity + local entity = { prefab_id = prefab_id, + position_x = position_x, + position_y = position_y, + position_z = position_z, + name = object.name ~= "" and object.name or nil, tiled_id = tostring(object.id), tiled_layer_id = layer.name, - - transform = { - position_x = position_x, - position_y = position_y, - position_z = position_z, - size_x = scale_x ~= 1 and object.width or nil, - size_y = scale_y ~= 1 and object.height or nil, - scale_x = scale_x ~= 1 and scale_x or nil, - scale_y = scale_y ~= 1 and scale_y or nil, - rotation = rotation, - } + size_x = object.width, + size_y = object.height, } + if scale_x ~= 1 then entity.scale_x = scale_x end + if scale_y ~= 1 then entity.scale_y = scale_y end + if rotation ~= 0 then entity.rotation = rotation end if tile.properties then local tiled_components = detiled_internal.get_components_property(tile.properties) if tiled_components then - detiled_internal.apply_components(components, tiled_components) + detiled_internal.apply_components(entity, tiled_components) end end if object.properties then local tiled_components = detiled_internal.get_components_property(object.properties) if tiled_components then - -- Unique case if tiled_components.position_z then - components.transform.position_z = components.transform.position_z + tiled_components.position_z + entity.position_z = entity.position_z + tiled_components.position_z tiled_components.position_z = nil end - detiled_internal.apply_components(components, tiled_components) + detiled_internal.apply_components(entity, tiled_components) end end - entity.prefab_id = prefab_id - entity.components = components - table.insert(entities, entity) else logger:warn("Tile is not found in tileset", { @@ -183,88 +172,73 @@ local function get_entities_from_object_layer(layer, map) id = object.id, }) end - elseif object.class and object.class ~= "" then -- If object is map-created-object and has a prefab to spawn instead - local entity = {} + elseif object.class and object.class ~= "" then local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, nil, map_width, map_height, map_params) - --position_y = map_height - position_y position_x = position_x + (layer.offsetx or 0) position_y = position_y - (layer.offsety or 0) position_y = position_y - object.height - local components = { + ---@type detiled.entity + local entity = { + prefab_id = object.class, + position_x = position_x, + position_y = position_y, + position_z = position_z, name = object.name ~= "" and object.name or nil, - prefab_id = object.class ~= "" and object.class or nil, tiled_id = tostring(object.id), tiled_layer_id = layer.name, - - transform = { - position_x = position_x, - position_y = position_y, - position_z = position_z, - size_x = object.width, - size_y = object.height, - scale_x = scale_x ~= 1 and scale_x or nil, - scale_y = scale_y ~= 1 and scale_y or nil, - rotation = rotation, - } + size_x = object.width, + size_y = object.height, } + if scale_x ~= 1 then entity.scale_x = scale_x end + if scale_y ~= 1 then entity.scale_y = scale_y end + if rotation ~= 0 then entity.rotation = rotation end if object.properties then local tiled_components = detiled_internal.get_components_property(object.properties) if tiled_components then - -- Unique case if tiled_components.position_z then - components.transform.position_z = components.transform.position_z + tiled_components.position_z + entity.position_z = entity.position_z + tiled_components.position_z tiled_components.position_z = nil end - detiled_internal.apply_components(components, tiled_components) + detiled_internal.apply_components(entity, tiled_components) end end - entity.prefab_id = object.class - entity.components = components - table.insert(entities, entity) - else -- Empty object from tiled without any prefabs + else local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, nil, map_width, map_height, map_params) position_x = position_x + (layer.offsetx or 0) position_y = position_y - (layer.offsety or 0) position_y = position_y - object.height + ---@type detiled.entity local entity = { - components = { - name = object.name ~= "" and object.name or nil, - prefab_id = object.type ~= "" and object.type or nil, - tiled_id = tostring(object.id), - tiled_layer_id = layer.name, - - transform = { - position_x = position_x, - position_y = position_y, - position_z = position_z, - size_x = object.width, - size_y = object.height, - rotation = rotation, - } - } + prefab_id = object.type ~= "" and object.type or nil, + position_x = position_x, + position_y = position_y, + position_z = position_z, + name = object.name ~= "" and object.name or nil, + tiled_id = tostring(object.id), + tiled_layer_id = layer.name, + size_x = object.width, + size_y = object.height, } + if rotation ~= 0 then entity.rotation = rotation end if object.properties then local tiled_components = detiled_internal.get_components_property(object.properties) if tiled_components then - -- Unique case if tiled_components.position_z then - entity.components.transform.position_z = (entity.components.transform.position_z or 0) + tiled_components.position_z + entity.position_z = entity.position_z + tiled_components.position_z tiled_components.position_z = nil end - detiled_internal.apply_components(entity.components, tiled_components) + detiled_internal.apply_components(entity, tiled_components) end end - entity.prefab_id = entity.components.prefab_id - table.insert(entities, entity) end end @@ -286,14 +260,14 @@ function M.get_entities(tiled_map) local layer = tiled_map.layers[layer_index] if layer.type == "tilelayer" then - local layer_entities = get_entities_from_tile_layer(layer, tiled_map) + local layer_entities = get_entities_from_tile_layer(layer, tiled_map, grid_module, map_params) for index = 1, #layer_entities do table.insert(entities, layer_entities[index]) end end if layer.type == "objectgroup" then - local layer_entities = get_entities_from_object_layer(layer, tiled_map) + local layer_entities = get_entities_from_object_layer(layer, tiled_map, grid_module, map_params) for index = 1, #layer_entities do table.insert(entities, layer_entities[index]) end diff --git a/example/example_grid/example_grid.script b/example/example_grid/example_grid.script index e4a7a07..c77216b 100644 --- a/example/example_grid/example_grid.script +++ b/example/example_grid/example_grid.script @@ -3,13 +3,11 @@ local detiled = require("detiled.detiled") local function spawn_entity(entity) local prefab_id = entity.prefab_id - local components = entity.components - local transform = components.transform - local position_x = transform.position_x - local position_y = transform.position_y - local position_z = transform.position_z - local scale_x = transform.scale_x or 1 - local scale_y = transform.scale_y or 1 + local position_x = entity.position_x + local position_y = entity.position_y + local position_z = entity.position_z + local scale_x = entity.scale_x or 1 + local scale_y = entity.scale_y or 1 local factory_url = "/entities#" .. prefab_id local position = vmath.vector3(position_x, position_y, position_z) diff --git a/example/example_grid_game_objects/example_grid_game_objects.script b/example/example_grid_game_objects/example_grid_game_objects.script index 74684ee..a1ceb7a 100644 --- a/example/example_grid_game_objects/example_grid_game_objects.script +++ b/example/example_grid_game_objects/example_grid_game_objects.script @@ -3,13 +3,11 @@ local detiled = require("detiled.detiled") local function spawn_entity(entity) local prefab_id = entity.prefab_id - local components = entity.components - local transform = components.transform - local position_x = transform.position_x - local position_y = transform.position_y - local position_z = transform.position_z - local scale_x = transform.scale_x or 1 - local scale_y = transform.scale_y or 1 + local position_x = entity.position_x + local position_y = entity.position_y + local position_z = entity.position_z + local scale_x = entity.scale_x or 1 + local scale_y = entity.scale_y or 1 local factory_url = "/entities#" .. prefab_id local position = vmath.vector3(position_x, position_y, position_z) diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index 1c5d99f..d6f41d0 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -6,13 +6,11 @@ end local function spawn_entity(entity) local prefab_id = entity.prefab_id - local components = entity.components - local transform = components.transform - local position_x = transform.position_x - local position_y = transform.position_y - local position_z = transform.position_z + get_z_position(position_x, position_y) - local scale_x = transform.scale_x or 1 - local scale_y = transform.scale_y or 1 + local position_x = entity.position_x + local position_y = entity.position_y + local position_z = entity.position_z + get_z_position(position_x, position_y) + local scale_x = entity.scale_x or 1 + local scale_y = entity.scale_y or 1 local factory_url = "/entities#" .. prefab_id local position = vmath.vector3(position_x, position_y, position_z) diff --git a/example/example_hexgrid_pointy/example_hexgrid_pointy.script b/example/example_hexgrid_pointy/example_hexgrid_pointy.script index afec5b4..22c8e1e 100644 --- a/example/example_hexgrid_pointy/example_hexgrid_pointy.script +++ b/example/example_hexgrid_pointy/example_hexgrid_pointy.script @@ -6,18 +6,16 @@ end local function spawn_entity(entity) local prefab_id = entity.prefab_id - local components = entity.components - local transform = components.transform - local position_x = transform.position_x - local position_y = transform.position_y - local position_z = transform.position_z + get_z_position(position_x, position_y) - local scale_x = transform.scale_x or 1 - local scale_y = transform.scale_y or 1 + local position_x = entity.position_x + local position_y = entity.position_y + local position_z = entity.position_z + get_z_position(position_x, position_y) + local scale_x = entity.scale_x or 1 + local scale_y = entity.scale_y or 1 local factory_url = "/entities#" .. prefab_id local position = vmath.vector3(position_x, position_y, position_z) local scale = vmath.vector3(scale_x, scale_y, 1) - local rot = vmath.quat_rotation_z(math.rad(transform.rotation or 0)) + local rot = vmath.quat_rotation_z(math.rad(entity.rotation or 0)) factory.create(factory_url, position, rot, nil, scale) end diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index b140a88..15c4c43 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -8,14 +8,12 @@ end local function spawn_entity(entity) local prefab_id = entity.prefab_id - local components = entity.components - local transform = components.transform - local position_x = transform.position_x - local position_y = transform.position_y - local position_z = transform.position_z + get_z_position(position_x, position_y) - local scale_x = transform.scale_x or 1 - local scale_y = transform.scale_y or 1 - local rotation = transform.rotation or 0 + local position_x = entity.position_x + local position_y = entity.position_y + local position_z = entity.position_z + get_z_position(position_x, position_y) + local scale_x = entity.scale_x or 1 + local scale_y = entity.scale_y or 1 + local rotation = entity.rotation or 0 local factory_url = "/entities#" .. prefab_id local position = vmath.vector3(position_x, position_y, position_z) diff --git a/example/example_isogrid_staggered/example_isogrid_staggered.script b/example/example_isogrid_staggered/example_isogrid_staggered.script index 1456d45..f6094d2 100644 --- a/example/example_isogrid_staggered/example_isogrid_staggered.script +++ b/example/example_isogrid_staggered/example_isogrid_staggered.script @@ -8,14 +8,12 @@ end local function spawn_entity(entity) local prefab_id = entity.prefab_id - local components = entity.components - local transform = components.transform - local position_x = transform.position_x - local position_y = transform.position_y - local position_z = transform.position_z + get_z_position(position_x, position_y) - local scale_x = transform.scale_x or 1 - local scale_y = transform.scale_y or 1 - local rotation = transform.rotation or 0 + local position_x = entity.position_x + local position_y = entity.position_y + local position_z = entity.position_z + get_z_position(position_x, position_y) + local scale_x = entity.scale_x or 1 + local scale_y = entity.scale_y or 1 + local rotation = entity.rotation or 0 local factory_url = "/entities#" .. prefab_id local position = vmath.vector3(position_x, position_y, position_z) From 0f07e4a7b03c021a5b4eb7992470176789b18437 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 16 Feb 2026 10:49:13 +0200 Subject: [PATCH 46/71] tiled id as number --- detiled/internal/detiled_annotations.lua | 2 +- detiled/internal/detiled_parser.lua | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 287e15c..49d6722 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -134,7 +134,7 @@ ---@field scale_y number|nil ---@field rotation number|nil ---@field name string|nil ----@field tiled_id string|nil +---@field tiled_id number|nil ---@field tiled_layer_id string|nil ---@field size_x number|nil ---@field size_y number|nil diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 9136575..5593bb8 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -135,7 +135,7 @@ local function get_entities_from_object_layer(layer, map, grid_module, map_param position_y = position_y, position_z = position_z, name = object.name ~= "" and object.name or nil, - tiled_id = tostring(object.id), + tiled_id = tonumber(object.id), tiled_layer_id = layer.name, size_x = object.width, size_y = object.height, @@ -185,7 +185,7 @@ local function get_entities_from_object_layer(layer, map, grid_module, map_param position_y = position_y, position_z = position_z, name = object.name ~= "" and object.name or nil, - tiled_id = tostring(object.id), + tiled_id = tonumber(object.id), tiled_layer_id = layer.name, size_x = object.width, size_y = object.height, @@ -220,7 +220,7 @@ local function get_entities_from_object_layer(layer, map, grid_module, map_param position_y = position_y, position_z = position_z, name = object.name ~= "" and object.name or nil, - tiled_id = tostring(object.id), + tiled_id = tonumber(object.id), tiled_layer_id = layer.name, size_x = object.width, size_y = object.height, From da80f51efc7e26c7652bd555fada915891721ddf Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 16 Feb 2026 11:13:33 +0200 Subject: [PATCH 47/71] Refactor --- README.md | 10 +- api/detiled_api.md | 7 +- detiled/detiled.lua | 13 +- detiled/internal/detiled_internal.lua | 63 ++++ detiled/internal/detiled_parser.lua | 332 ++++++------------ example/example_grid/example_grid.script | 6 +- .../example_grid_game_objects.script | 6 +- .../example_hexgrid/example_hexgrid.script | 6 +- .../example_hexgrid_pointy.script | 6 +- .../example_isogrid/example_isogrid.script | 6 +- .../example_isogrid_staggered.script | 6 +- test/test_detiled.lua | 7 +- 12 files changed, 210 insertions(+), 258 deletions(-) diff --git a/README.md b/README.md index 5315b1a..7a1d229 100644 --- a/README.md +++ b/README.md @@ -61,15 +61,15 @@ After that, select `Project ▸ Fetch Libraries` to update [library dependencies 2. Convert Tiled maps to Decore entities: ```lua - -- Get map params and entities from map - local result = detiled.get_entity_from_map("/resources/maps/my_map.json") + -- Get entities and map params from map + local entities, map_params = detiled.get_entity_from_map("/resources/maps/my_map.json") -- Add entities to Decore world - for _, entity in ipairs(result.entities) do + for _, entity in ipairs(entities) do world:addEntity(decore.create(entity)) end - -- Use result.map_params for coordinate conversion (cell_to_pos, pos_to_cell) + -- Use map_params for coordinate conversion (cell_to_pos, pos_to_cell) ``` Each entity is a flat table: `prefab_id`, `position_x`, `position_y`, `position_z`, and optionally `scale_x`, `scale_y`, `rotation` (omitted when default), plus `name`, `tiled_id`, `tiled_layer_id`, and any custom properties from Tiled. @@ -127,7 +127,7 @@ Look at [Shooting Circles](https://github.com/Insality/shooting_circles) or [Cos ```lua detiled.set_logger(logger_instance) detiled.load_tileset(tileset_path_or_data) -detiled.get_entity_from_map(map_path_or_data) -- returns { map_params, entities } +detiled.get_entity_from_map(map_path_or_data) -- returns entities, map_params detiled.cell_to_pos(map_params, i, j) -- returns x, y detiled.pos_to_cell(map_params, x, y) -- returns i, j ``` diff --git a/api/detiled_api.md b/api/detiled_api.md index f4032f8..2d8cb86 100644 --- a/api/detiled_api.md +++ b/api/detiled_api.md @@ -27,10 +27,10 @@ Set a logger instance --- ```lua -detiled.get_entity_from_map(map_or_path) +local entities, map_params = detiled.get_entity_from_map(map_or_path) ``` -Load a tiled map and return map params and entities. Use `result.entities` to spawn and `result.map_params` for coordinate conversion. +Load a tiled map and return entities and map params. Use `entities` to spawn and `map_params` for coordinate conversion. Each entity is a flat table: `prefab_id`, `position_x`, `position_y`, `position_z`; optional `scale_x`, `scale_y`, `rotation` (only set when non-default); optional `name`, `tiled_id`, `tiled_layer_id`, `size_x`, `size_y`; plus any custom properties from Tiled. @@ -38,7 +38,8 @@ Each entity is a flat table: `prefab_id`, `position_x`, `position_y`, `position_ - `map_or_path` *(string|detiled.map)*: - **Returns:** - - *(table)* `{ map_params = table|nil, entities = detiled.entity[] }` + - *(detiled.entity[])* entities + - *(detiled.map_params|nil)* map_params ### load_tileset diff --git a/detiled/detiled.lua b/detiled/detiled.lua index 3471691..2019bf4 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -16,7 +16,7 @@ end ---Load a tiled map as a Decore entity ---You can add this entity with `world:addEntity(entity)` ---@param map_or_path detiled.map|string ----@return detiled.get_entity_from_map_result +---@return detiled.entity[], detiled.map_params|nil function M.get_entity_from_map(map_or_path) collectgarbage("stop") local memory = collectgarbage("count") @@ -26,7 +26,7 @@ function M.get_entity_from_map(map_or_path) map = detiled_internal.load_json(map_or_path) --[[@as detiled.map]] if not map then logger:error("Failed to load map", map_or_path) - return { map_params = nil, entities = {} } + return {}, nil end end @@ -34,13 +34,12 @@ function M.get_entity_from_map(map_or_path) memory = collectgarbage("count") ---@cast map detiled.map + local entities, map_params = detiled_parser.get_entities(map) - local result = detiled_parser.get_entities(map) - - print("Memory after get entities", #result.entities, collectgarbage("count") - memory) + print("Memory after get entities", #entities, collectgarbage("count") - memory) collectgarbage("restart") - return result + return entities, map_params end @@ -72,8 +71,8 @@ function M.load_tileset(tileset_or_path) if type(tileset_or_path) == "string" then tileset = detiled_internal.load_json(tileset_or_path) --[[@as detiled.tileset]] end - ---@cast tileset detiled.tileset + ---@cast tileset detiled.tileset return detiled_internal.load_tileset(tileset) end diff --git a/detiled/internal/detiled_internal.lua b/detiled/internal/detiled_internal.lua index 6935e91..a68338d 100644 --- a/detiled/internal/detiled_internal.lua +++ b/detiled/internal/detiled_internal.lua @@ -1,3 +1,5 @@ +local base64 = require("detiled.internal.base64") + local LOADED_TILESETS = {} local M = {} @@ -246,4 +248,65 @@ function M.apply_components(entity, components) end +---@param entity detiled.entity +---@param tile detiled.tileset.tile|nil +function M.apply_tile_properties_to_entity(entity, tile) + if not tile or not tile.properties then return end + local tiled_components = M.get_components_property(tile.properties) + if tiled_components then + M.apply_components(entity, tiled_components) + end +end + + +---@param tile detiled.tileset.tile +---@return string|nil +function M.get_prefab_id_from_tile(tile) + local prefab_id = tile.class or tile.type + if not prefab_id or prefab_id == "" then + local image_path = tile.image + if image_path and image_path ~= "" then + prefab_id = M.get_filename(image_path) + end + end + return prefab_id +end + + +---@param layer detiled.map.layer +---@return number[]|string layer data as array of GIDs or raw data +function M.unpack_tile_layer_data(layer) + local layer_data = layer.data + if layer.encoding == "base64" then + local decoded_data = base64.decode(layer_data) --[[ @as string ]] + if layer.compression == "zlib" then + local inflated_data = zlib.inflate(decoded_data) + local tiles = {} + for i = 1, #inflated_data, 4 do + local b1, b2, b3, b4 = inflated_data:byte(i, i + 3) + local gid = b1 + b2 * 256 + b3 * 65536 + b4 * 16777216 + table.insert(tiles, gid) + end + layer_data = tiles + end + end + return layer_data +end + + +---Rotated and scaled 2D offset (anchor or anchor relative to origin). +---@param ax number +---@param ay number +---@param scale_x number +---@param scale_y number +---@param cos number +---@param sin number +---@return number, number +function M.rotated_anchor_offset(ax, ay, scale_x, scale_y, cos, sin) + local rx = ax * cos + ay * sin + local ry = -ax * sin + ay * cos + return rx * scale_x, ry * scale_y +end + + return M diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 5593bb8..092a2b8 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -1,6 +1,5 @@ local detiled_internal = require("detiled.internal.detiled_internal") local logger = require("detiled.internal.detiled_logger") -local base64 = require("detiled.internal.base64") local M = {} @@ -12,6 +11,40 @@ local GRID_MODULES = { } +---@param layer detiled.map.layer +---@param position_z number +---@param prefab_id string|nil +---@param position_x number +---@param position_y number +---@param scale_x number +---@param scale_y number +---@param rotation number +---@param object detiled.map.object|nil +---@return detiled.entity +local function make_entity(layer, position_z, prefab_id, position_x, position_y, scale_x, scale_y, rotation, object) + ---@type detiled.entity + local entity = { + prefab_id = prefab_id, + position_x = position_x, + position_y = position_y, + position_z = position_z, + tiled_layer_id = layer.name, + scale_x = scale_x ~= 1 and scale_x or nil, + scale_y = scale_y ~= 1 and scale_y or nil, + rotation = rotation ~= 0 and rotation or nil, + } + + if object then + entity.name = object.name ~= "" and object.name or nil + entity.tiled_id = tonumber(object.id) + entity.size_x = object.width + entity.size_y = object.height + end + + return entity +end + + ---@param layer detiled.map.layer ---@param map detiled.map ---@param grid_module table @@ -22,25 +55,7 @@ local function get_entities_from_tile_layer(layer, map, grid_module, map_params) local entities = {} local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 - - local layer_data = layer.data - - if layer.encoding == "base64" then - local decoded_data = base64.decode(layer_data) --[[ @as string ]] - - if layer.compression == "zlib" then - local inflated_data = zlib.inflate(decoded_data) - local tiles = {} - - for i = 1, #inflated_data, 4 do - local b1, b2, b3, b4 = inflated_data:byte(i, i+3) - local gid = b1 + b2*256 + b3*65536 + b4*16777216 - table.insert(tiles, gid) - end - - layer_data = tiles - end - end + local layer_data = detiled_internal.unpack_tile_layer_data(layer) for tile_index = 1, #layer_data do local tile_gid = layer_data[tile_index] @@ -50,37 +65,13 @@ local function get_entities_from_tile_layer(layer, map, grid_module, map_params) local tile_i = ((tile_index - 1) % map.width) local tile_j = (math.floor((tile_index - 1) / map.width)) local pos_x, pos_y = grid_module.cell_to_pos(tile_i, tile_j, map_params) - - local prefab_id = tile.class or tile.type - if not prefab_id or prefab_id == "" then - local image_path = tile.image - if image_path and image_path ~= "" then - prefab_id = detiled_internal.get_filename(image_path) - end - end + local prefab_id = detiled_internal.get_prefab_id_from_tile(tile) local scale_x = flip_h and -1 or 1 local scale_y = flip_v and -1 or 1 local rotation = flip_d and -90 or 0 - - ---@type detiled.entity - local entity = { - prefab_id = prefab_id, - position_x = pos_x, - position_y = pos_y, - position_z = position_z, - tiled_layer_id = layer.name, - } - if scale_x ~= 1 then entity.scale_x = scale_x end - if scale_y ~= 1 then entity.scale_y = scale_y end - if rotation ~= 0 then entity.rotation = rotation end - - if tile.properties then - local tiled_components = detiled_internal.get_components_property(tile.properties) - if tiled_components then - detiled_internal.apply_components(entity, tiled_components) - end - end + local entity = make_entity(layer, position_z, prefab_id, pos_x, pos_y, scale_x, scale_y, rotation, nil) + detiled_internal.apply_tile_properties_to_entity(entity, tile) table.insert(entities, entity) end @@ -90,6 +81,27 @@ local function get_entities_from_tile_layer(layer, map, grid_module, map_params) end +---@param entity detiled.entity +---@param object detiled.map.object +local function apply_object_properties_to_entity(entity, object) + if not object.properties then + return + end + + local tiled_components = detiled_internal.get_components_property(object.properties) + if not tiled_components then + return + end + + if tiled_components.position_z then + entity.position_z = entity.position_z + tiled_components.position_z + tiled_components.position_z = nil + end + + detiled_internal.apply_components(entity, tiled_components) +end + + ---@param layer detiled.map.layer ---@param map detiled.map ---@param grid_module table @@ -102,143 +114,49 @@ local function get_entities_from_object_layer(layer, map, grid_module, map_param local map_width = map_params.scene.size_x local map_height = map_params.scene.size_y local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 + local offset_x = layer.offsetx or 0 + local offset_y = layer.offsety or 0 for object_index = 1, #layer.objects do local object = layer.objects[object_index] local rotation = -(object.rotation or 0) - local object_gid = object.gid + if object_gid then local cleared_gid, flip_h, flip_v, flip_d = detiled_internal.parse_gid_flags(object_gid) local tile, tileset = detiled_internal.get_tile_by_gid(map, cleared_gid) - if tile and tileset then - local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, tile, map_width, map_height, map_params) - position_x = position_x + (layer.offsetx or 0) - position_y = position_y - (layer.offsety or 0) - - if flip_h then scale_x = -scale_x end - if flip_v then scale_y = -scale_y end - if flip_d then rotation = rotation - 90 end - - local prefab_id = tile.class or tile.type - if not prefab_id or prefab_id == "" then - local image_path = tile.image - if image_path and image_path ~= "" then - prefab_id = detiled_internal.get_filename(image_path) - end - end - - ---@type detiled.entity - local entity = { - prefab_id = prefab_id, - position_x = position_x, - position_y = position_y, - position_z = position_z, - name = object.name ~= "" and object.name or nil, - tiled_id = tonumber(object.id), - tiled_layer_id = layer.name, - size_x = object.width, - size_y = object.height, - } - if scale_x ~= 1 then entity.scale_x = scale_x end - if scale_y ~= 1 then entity.scale_y = scale_y end - if rotation ~= 0 then entity.rotation = rotation end - - if tile.properties then - local tiled_components = detiled_internal.get_components_property(tile.properties) - if tiled_components then - detiled_internal.apply_components(entity, tiled_components) - end - end - - if object.properties then - local tiled_components = detiled_internal.get_components_property(object.properties) - if tiled_components then - if tiled_components.position_z then - entity.position_z = entity.position_z + tiled_components.position_z - tiled_components.position_z = nil - end - - detiled_internal.apply_components(entity, tiled_components) - end - end - - table.insert(entities, entity) - else + if not tile or not tileset then logger:warn("Tile is not found in tileset", { gid = object_gid, class = object.class, name = object.name, id = object.id, }) - end - elseif object.class and object.class ~= "" then - local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, nil, map_width, map_height, map_params) - position_x = position_x + (layer.offsetx or 0) - position_y = position_y - (layer.offsety or 0) - position_y = position_y - object.height - - ---@type detiled.entity - local entity = { - prefab_id = object.class, - position_x = position_x, - position_y = position_y, - position_z = position_z, - name = object.name ~= "" and object.name or nil, - tiled_id = tonumber(object.id), - tiled_layer_id = layer.name, - size_x = object.width, - size_y = object.height, - } - if scale_x ~= 1 then entity.scale_x = scale_x end - if scale_y ~= 1 then entity.scale_y = scale_y end - if rotation ~= 0 then entity.rotation = rotation end - - if object.properties then - local tiled_components = detiled_internal.get_components_property(object.properties) - if tiled_components then - if tiled_components.position_z then - entity.position_z = entity.position_z + tiled_components.position_z - tiled_components.position_z = nil - end - - detiled_internal.apply_components(entity, tiled_components) - end - end + else + local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, tile, map_width, map_height, map_params) + position_x = position_x + offset_x + position_y = position_y - offset_y + if flip_h then scale_x = -scale_x end + if flip_v then scale_y = -scale_y end + if flip_d then rotation = rotation - 90 end + local prefab_id = detiled_internal.get_prefab_id_from_tile(tile) - table.insert(entities, entity) + local entity = make_entity(layer, position_z, prefab_id, position_x, position_y, scale_x, scale_y, rotation, object) + detiled_internal.apply_tile_properties_to_entity(entity, tile) + apply_object_properties_to_entity(entity, object) + table.insert(entities, entity) + end else local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, nil, map_width, map_height, map_params) - position_x = position_x + (layer.offsetx or 0) - position_y = position_y - (layer.offsety or 0) - position_y = position_y - object.height - - ---@type detiled.entity - local entity = { - prefab_id = object.type ~= "" and object.type or nil, - position_x = position_x, - position_y = position_y, - position_z = position_z, - name = object.name ~= "" and object.name or nil, - tiled_id = tonumber(object.id), - tiled_layer_id = layer.name, - size_x = object.width, - size_y = object.height, - } - if rotation ~= 0 then entity.rotation = rotation end - - if object.properties then - local tiled_components = detiled_internal.get_components_property(object.properties) - if tiled_components then - if tiled_components.position_z then - entity.position_z = entity.position_z + tiled_components.position_z - tiled_components.position_z = nil - end - - detiled_internal.apply_components(entity, tiled_components) - end - end - + position_x = position_x + offset_x + position_y = position_y - offset_y - object.height + + local prefab_id = (object.class and object.class ~= "") and object.class or (object.type ~= "" and object.type or nil) + local use_scale = object.class and object.class ~= "" + local entity_scale_x = use_scale and scale_x or 1 + local entity_scale_y = use_scale and scale_y or 1 + local entity = make_entity(layer, position_z, prefab_id, position_x, position_y, entity_scale_x, entity_scale_y, rotation, object) + apply_object_properties_to_entity(entity, object) table.insert(entities, entity) end end @@ -248,7 +166,7 @@ end ---@param tiled_map detiled.map ----@return detiled.get_entity_from_map_result +---@return detiled.entity[], detiled.map_params|nil function M.get_entities(tiled_map) ---@type detiled.entity[] local entities = {} @@ -274,7 +192,7 @@ function M.get_entities(tiled_map) end end - return { map_params = map_params, entities = entities } + return entities, map_params end @@ -348,45 +266,37 @@ function M.get_defold_position_from_tiled_object(object, tile, map_width, map_he anchor_x = base_width / 2 anchor_y = base_height / 2 - do -- Search anchor - -- If object has anchor point, use it instead - if tile and tile.objectgroup then - for index = 1, #tile.objectgroup.objects do - local tile_object = tile.objectgroup.objects[index] - if tile_object.point then - anchor_x = tile_object.x - anchor_y = base_height - tile_object.y - break - end + -- Find the object point in Tiled to sprite anchor + if tile and tile.objectgroup then + for index = 1, #tile.objectgroup.objects do + local tile_object = tile.objectgroup.objects[index] + if tile_object.point then + anchor_x = tile_object.x + anchor_y = base_height - tile_object.y + break end end end - -- Rotate offset in case of rotated object local rotation_rad = math.rad(object.rotation) - local sin = math.sin(rotation_rad) local cos = math.cos(rotation_rad) + local sin = math.sin(rotation_rad) - local rotated_offset_x = anchor_x * cos + anchor_y * sin - local rotated_offset_y = -anchor_x * sin + anchor_y * cos - - rotated_offset_x = rotated_offset_x * scale_x - rotated_offset_y = rotated_offset_y * scale_y - - local position_x = object.x + rotated_offset_x - local position_y = object.y - rotated_offset_y - - if map_params then - local grid = GRID_MODULES[map_params.orientation] - if grid and grid.convert_object_position then - position_x, position_y = grid.convert_object_position(object.x, object.y, map_params) - local bottom_center_x = base_width / 2 - local bottom_center_y = 0 - local offset_x = (anchor_x - bottom_center_x) * cos + (anchor_y - bottom_center_y) * sin - local offset_y = -(anchor_x - bottom_center_x) * sin + (anchor_y - bottom_center_y) * cos - position_x = position_x + offset_x * scale_x - position_y = position_y + offset_y * scale_y - elseif map_params.scene.invert_y then + local position_x, position_y + local grid = map_params and GRID_MODULES[map_params.orientation] + + if grid and grid.convert_object_position and map_params then + position_x, position_y = grid.convert_object_position(object.x, object.y, map_params) + anchor_x = anchor_x - base_width / 2 + + local offset_x, offset_y = detiled_internal.rotated_anchor_offset(anchor_x, anchor_y, scale_x, scale_y, cos, sin) + position_x = position_x + offset_x + position_y = position_y + offset_y + else + local offset_x, offset_y = detiled_internal.rotated_anchor_offset(anchor_x, anchor_y, scale_x, scale_y, cos, sin) + position_x = object.x + offset_x + position_y = object.y - offset_y + if map_params and map_params.scene.invert_y then position_y = map_height - position_y end end @@ -410,25 +320,5 @@ function M.load_tileset(tileset_path) return tileset end ----@param tiled_tileset detiled.tileset ----@return table entities Key is prefab_id -function M.get_decore_entities(tiled_tileset) - ---@type entity[] - local entities = {} - - local tiles = tiled_tileset.tiles - for index = 1, #tiles do - local tile = tiles[index] - local prefab_id = tile.type - ---@type entity - local entity = detiled_internal.get_components_property(tile.properties) or {} - assert(prefab_id, "The class field in entity in tiled tileset should be set") - entities[prefab_id] = entity - end - - return entities -end - - return M diff --git a/example/example_grid/example_grid.script b/example/example_grid/example_grid.script index c77216b..72be5ef 100644 --- a/example/example_grid/example_grid.script +++ b/example/example_grid/example_grid.script @@ -27,9 +27,9 @@ function init(self) detiled.load_tileset("/tiled/tilesets/grid_items.json") detiled.load_tileset("/tiled/tilesets/grid_tileset.json") - local result = detiled.get_entity_from_map("/tiled/maps/grid.json") - spawn_map(result.entities) - self.map_params = result.map_params + local entities, map_params = detiled.get_entity_from_map("/tiled/maps/grid.json") + spawn_map(entities) + self.map_params = map_params msg.post(".", "acquire_input_focus") end diff --git a/example/example_grid_game_objects/example_grid_game_objects.script b/example/example_grid_game_objects/example_grid_game_objects.script index a1ceb7a..af48c7a 100644 --- a/example/example_grid_game_objects/example_grid_game_objects.script +++ b/example/example_grid_game_objects/example_grid_game_objects.script @@ -28,9 +28,9 @@ function init(self) detiled.load_tileset("/tiled/tilesets/grid_items.json") detiled.load_tileset("/tiled/tilesets/grid_tileset.json") - local result = detiled.get_entity_from_map("/tiled/maps/grid_game_objects.json") - spawn_map(result.entities) - self.map_params = result.map_params + local entities, map_params = detiled.get_entity_from_map("/tiled/maps/grid_game_objects.json") + spawn_map(entities) + self.map_params = map_params msg.post(".", "acquire_input_focus") end diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index d6f41d0..35deb1f 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -29,9 +29,9 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_tiles.json") detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") - local result = detiled.get_entity_from_map("/tiled/maps/hexgrid.json") - spawn_map(result.entities) - self.map_params = result.map_params + local entities, map_params = detiled.get_entity_from_map("/tiled/maps/hexgrid.json") + spawn_map(entities) + self.map_params = map_params msg.post(".", "acquire_input_focus") end diff --git a/example/example_hexgrid_pointy/example_hexgrid_pointy.script b/example/example_hexgrid_pointy/example_hexgrid_pointy.script index 22c8e1e..2cab71d 100644 --- a/example/example_hexgrid_pointy/example_hexgrid_pointy.script +++ b/example/example_hexgrid_pointy/example_hexgrid_pointy.script @@ -31,9 +31,9 @@ function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_tiles.json") detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") detiled.load_tileset("/tiled/tilesets/hexgrid_pointy.json") - local result = detiled.get_entity_from_map("/tiled/maps/hexgrid_pointy.json") - spawn_map(result.entities) - self.map_params = result.map_params + local entities, map_params = detiled.get_entity_from_map("/tiled/maps/hexgrid_pointy.json") + spawn_map(entities) + self.map_params = map_params msg.post(".", "acquire_input_focus") end diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index 15c4c43..034a54f 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -33,9 +33,9 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") detiled.load_tileset("/tiled/tilesets/isogrid_tileset.json") - local result = detiled.get_entity_from_map("/tiled/maps/isogrid.json") - spawn_map(result.entities) - self.map_params = result.map_params + local entities, map_params = detiled.get_entity_from_map("/tiled/maps/isogrid.json") + spawn_map(entities) + self.map_params = map_params msg.post(".", "acquire_input_focus") end diff --git a/example/example_isogrid_staggered/example_isogrid_staggered.script b/example/example_isogrid_staggered/example_isogrid_staggered.script index f6094d2..f9c1221 100644 --- a/example/example_isogrid_staggered/example_isogrid_staggered.script +++ b/example/example_isogrid_staggered/example_isogrid_staggered.script @@ -33,9 +33,9 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") detiled.load_tileset("/tiled/tilesets/isogrid_tileset.json") - local result = detiled.get_entity_from_map("/tiled/maps/isogrid_staggered.json") - spawn_map(result.entities) - self.map_params = result.map_params + local entities, map_params = detiled.get_entity_from_map("/tiled/maps/isogrid_staggered.json") + spawn_map(entities) + self.map_params = map_params msg.post(".", "acquire_input_focus") end diff --git a/test/test_detiled.lua b/test/test_detiled.lua index 6830184..848a5e5 100644 --- a/test/test_detiled.lua +++ b/test/test_detiled.lua @@ -9,10 +9,9 @@ return function() it("Should init correclty", function() detiled.load_tileset("/resources/tilesets/shooting_circle.json") - local result = detiled.get_entity_from_map("/resources/maps/game.json") - assert(result) - assert(result.entities) - assert(result.map_params) + local entities, map_params = detiled.get_entity_from_map("/resources/maps/game.json") + assert(entities) + assert(map_params) end) end) end From f0938c99b26a074ac1e881959d51577b8c7067ea Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 16 Feb 2026 11:38:39 +0200 Subject: [PATCH 48/71] Add ellipse point polygon polyline and rectangle object types --- detiled/internal/detiled_annotations.lua | 13 +- detiled/internal/detiled_internal.lua | 28 ++++ detiled/internal/detiled_parser.lua | 98 +++++++------ .../example_hexgrid/example_hexgrid.script | 4 +- .../example_isogrid/example_isogrid.script | 4 + tiled/maps/hexgrid.json | 134 +++++++++++++++++- tiled/maps/isogrid.json | 30 +++- 7 files changed, 264 insertions(+), 47 deletions(-) diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 49d6722..b9aa588 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -108,16 +108,20 @@ ---@class detiled.map.object ---@field class string +---@field ellipse boolean|nil ---@field gid number ---@field height number ---@field id number ---@field name string ----@field type string? +---@field point boolean|nil +---@field polygon table|nil +---@field polyline table|nil +---@field properties detiled.map.property[] +---@field objectgroup any ---@field rotation number +---@field type string? ---@field visible boolean ---@field width number ----@field properties detiled.map.property[] ----@field objectgroup any ---@field x number ---@field y number @@ -134,6 +138,9 @@ ---@field scale_y number|nil ---@field rotation number|nil ---@field name string|nil +---@field object_type "point"|"ellipse"|"polyline"|"polygon"|"rectangle"|nil +---@field polygon table|nil +---@field polyline table|nil ---@field tiled_id number|nil ---@field tiled_layer_id string|nil ---@field size_x number|nil diff --git a/detiled/internal/detiled_internal.lua b/detiled/internal/detiled_internal.lua index a68338d..927b117 100644 --- a/detiled/internal/detiled_internal.lua +++ b/detiled/internal/detiled_internal.lua @@ -259,6 +259,34 @@ function M.apply_tile_properties_to_entity(entity, tile) end +---@param entity detiled.entity +---@param object detiled.map.object +function M.apply_object_properties_to_entity(entity, object) + if not object.properties then return end + local tiled_components = M.get_components_property(object.properties) + if not tiled_components then return end + if tiled_components.position_z then + entity.position_z = entity.position_z + tiled_components.position_z + tiled_components.position_z = nil + end + M.apply_components(entity, tiled_components) +end + + +---@param tiled_map detiled.map +---@param layer_name string +---@return boolean +function M.is_layer_excluded(tiled_map, layer_name) + for index = 1, #tiled_map.layers do + local layer = tiled_map.layers[index] + if layer.name == layer_name then + return M.get_property_value(layer.properties, "exclude") or false + end + end + return false +end + + ---@param tile detiled.tileset.tile ---@return string|nil function M.get_prefab_id_from_tile(tile) diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 092a2b8..2ebe49d 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -1,8 +1,34 @@ local detiled_internal = require("detiled.internal.detiled_internal") local logger = require("detiled.internal.detiled_logger") +local floor = math.floor +local math_rad = math.rad +local math_cos = math.cos +local math_sin = math.sin +local table_insert = table.insert + local M = {} +local function get_object_type(object) + if object.point then + return "point" + end + if object.ellipse then + return "ellipse" + end + if object.polyline and #object.polyline > 0 then + return "polyline" + end + if object.polygon and #object.polygon > 0 then + return "polygon" + end + if not object.gid and (object.width and object.width > 0 or object.height and object.height > 0) then + return "rectangle" + end + return nil +end + + local GRID_MODULES = { ["orthogonal"] = require("detiled.internal.grid.orthogonal"), ["isometric"] = require("detiled.internal.grid.isometric"), @@ -39,6 +65,13 @@ local function make_entity(layer, position_z, prefab_id, position_x, position_y, entity.tiled_id = tonumber(object.id) entity.size_x = object.width entity.size_y = object.height + entity.object_type = get_object_type(object) + if object.polyline then + entity.polyline = object.polyline + end + if object.polygon then + entity.polygon = object.polygon + end end return entity @@ -63,7 +96,7 @@ local function get_entities_from_tile_layer(layer, map, grid_module, map_params) local tile, tileset = detiled_internal.get_tile_by_gid(map, cleared_gid) if tile and tileset then local tile_i = ((tile_index - 1) % map.width) - local tile_j = (math.floor((tile_index - 1) / map.width)) + local tile_j = (floor((tile_index - 1) / map.width)) local pos_x, pos_y = grid_module.cell_to_pos(tile_i, tile_j, map_params) local prefab_id = detiled_internal.get_prefab_id_from_tile(tile) @@ -73,7 +106,7 @@ local function get_entities_from_tile_layer(layer, map, grid_module, map_params) local entity = make_entity(layer, position_z, prefab_id, pos_x, pos_y, scale_x, scale_y, rotation, nil) detiled_internal.apply_tile_properties_to_entity(entity, tile) - table.insert(entities, entity) + table_insert(entities, entity) end end @@ -81,27 +114,6 @@ local function get_entities_from_tile_layer(layer, map, grid_module, map_params) end ----@param entity detiled.entity ----@param object detiled.map.object -local function apply_object_properties_to_entity(entity, object) - if not object.properties then - return - end - - local tiled_components = detiled_internal.get_components_property(object.properties) - if not tiled_components then - return - end - - if tiled_components.position_z then - entity.position_z = entity.position_z + tiled_components.position_z - tiled_components.position_z = nil - end - - detiled_internal.apply_components(entity, tiled_components) -end - - ---@param layer detiled.map.layer ---@param map detiled.map ---@param grid_module table @@ -143,8 +155,8 @@ local function get_entities_from_object_layer(layer, map, grid_module, map_param local entity = make_entity(layer, position_z, prefab_id, position_x, position_y, scale_x, scale_y, rotation, object) detiled_internal.apply_tile_properties_to_entity(entity, tile) - apply_object_properties_to_entity(entity, object) - table.insert(entities, entity) + detiled_internal.apply_object_properties_to_entity(entity, object) + table_insert(entities, entity) end else local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, nil, map_width, map_height, map_params) @@ -156,8 +168,8 @@ local function get_entities_from_object_layer(layer, map, grid_module, map_param local entity_scale_x = use_scale and scale_x or 1 local entity_scale_y = use_scale and scale_y or 1 local entity = make_entity(layer, position_z, prefab_id, position_x, position_y, entity_scale_x, entity_scale_y, rotation, object) - apply_object_properties_to_entity(entity, object) - table.insert(entities, entity) + detiled_internal.apply_object_properties_to_entity(entity, object) + table_insert(entities, entity) end end @@ -180,14 +192,14 @@ function M.get_entities(tiled_map) if layer.type == "tilelayer" then local layer_entities = get_entities_from_tile_layer(layer, tiled_map, grid_module, map_params) for index = 1, #layer_entities do - table.insert(entities, layer_entities[index]) + table_insert(entities, layer_entities[index]) end end if layer.type == "objectgroup" then local layer_entities = get_entities_from_object_layer(layer, tiled_map, grid_module, map_params) for index = 1, #layer_entities do - table.insert(entities, layer_entities[index]) + table_insert(entities, layer_entities[index]) end end end @@ -219,14 +231,7 @@ end ---@param tiled_map detiled.map ---@param layer_name string function M.is_layer_excluded(tiled_map, layer_name) - for index = 1, #tiled_map.layers do - local layer = tiled_map.layers[index] - if layer.name == layer_name then - return detiled_internal.get_property_value(layer.properties, "exclude") or false - end - end - - return false + return detiled_internal.is_layer_excluded(tiled_map, layer_name) end @@ -240,6 +245,19 @@ function M.get_defold_position_from_tiled_object(object, tile, map_width, map_he map_height = map_height or 0 map_width = map_width or 0 + if not tile and (not object.width or object.width == 0 or not object.height or object.height == 0) then + local grid = map_params and GRID_MODULES[map_params.orientation] + if grid and grid.convert_object_position and map_params then + local position_x, position_y = grid.convert_object_position(object.x, object.y, map_params) + return position_x, position_y, 1, 1 + end + local position_y = object.y + if map_params and map_params.scene.invert_y then + position_y = map_height - position_y + end + return object.x, position_y, 1, 1 + end + -- Offset from object point in Tiled to sprite anchor (default center). Origin (0,0) at map left bottom. local base_width = tile and tile.imagewidth or object.width local base_height = tile and tile.imageheight or object.height @@ -278,9 +296,9 @@ function M.get_defold_position_from_tiled_object(object, tile, map_width, map_he end end - local rotation_rad = math.rad(object.rotation) - local cos = math.cos(rotation_rad) - local sin = math.sin(rotation_rad) + local rotation_rad = math_rad(object.rotation) + local cos = math_cos(rotation_rad) + local sin = math_sin(rotation_rad) local position_x, position_y local grid = map_params and GRID_MODULES[map_params.orientation] diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index 35deb1f..64b6988 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -21,7 +21,9 @@ end local function spawn_map(entities) for _, entity in ipairs(entities) do - spawn_entity(entity) + if entity.prefab_id then + spawn_entity(entity) + end end end diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index 034a54f..8cd02c9 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -7,6 +7,10 @@ end local function spawn_entity(entity) + if not entity.prefab_id then + return + end + local prefab_id = entity.prefab_id local position_x = entity.position_x local position_y = entity.position_y diff --git a/tiled/maps/hexgrid.json b/tiled/maps/hexgrid.json index a05ab91..1d92bbc 100644 --- a/tiled/maps/hexgrid.json +++ b/tiled/maps/hexgrid.json @@ -471,9 +471,139 @@ "visible":true, "x":0, "y":0 + }, + { + "draworder":"topdown", + "id":4, + "name":"strange_objects", + "objects":[ + { + "height":400.597163473501, + "id":40, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":609.604379198806, + "x":1161.98059218711, + "y":2388.65389400348 + }, + { + "height":0, + "id":41, + "name":"", + "point":true, + "rotation":0, + "type":"", + "visible":true, + "width":0, + "x":1950.73401343618, + "y":2764.36924608111 + }, + { + "ellipse":true, + "height":398.108982333914, + "id":42, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":470.266235381936, + "x":2139.83578004479, + "y":2373.72480716596 + }, + { + "height":0, + "id":43, + "name":"", + "polyline":[ + { + "x":0, + "y":0 + }, + { + "x":333.416272704653, + "y":-201.542672306544 + }, + { + "x":-4.97636227917383, + "y":-325.951729285892 + }, + { + "x":350.833540681761, + "y":-594.675292361284 + }, + { + "x":666.832545409306, + "y":-609.604379198806 + }, + { + "x":669.320726548893, + "y":-186.613585469022 + }, + { + "x":768.847972132371, + "y":-920.627021647176 + }, + { + "x":99.5272455834784, + "y":-848.469768599154 + }, + { + "x":99.5272455834784, + "y":-845.981587459567 + }, + { + "x":-34.8345359542177, + "y":-405.573525752675 + }], + "rotation":0, + "type":"", + "visible":true, + "width":0, + "x":2928.58920129385, + "y":2682.25926847475 + }, + { + "height":0, + "id":44, + "name":"", + "polygon":[ + { + "x":0, + "y":0 + }, + { + "x":0, + "y":233.889027121174 + }, + { + "x":82.1099776063697, + "y":211.495396864892 + }, + { + "x":52.2518039313259, + "y":-256.282657377457 + }, + { + "x":-94.5508833043045, + "y":-179.149042050261 + }], + "rotation":0, + "type":"", + "visible":true, + "width":0, + "x":2739.48743468525, + "y":2530.48021895994 + }], + "opacity":1, + "type":"objectgroup", + "visible":true, + "x":0, + "y":0 }], - "nextlayerid":3, - "nextobjectid":40, + "nextlayerid":5, + "nextobjectid":45, "orientation":"hexagonal", "renderorder":"right-down", "staggeraxis":"x", diff --git a/tiled/maps/isogrid.json b/tiled/maps/isogrid.json index afba06e..4971b00 100644 --- a/tiled/maps/isogrid.json +++ b/tiled/maps/isogrid.json @@ -133,6 +133,34 @@ "width":66.1909, "x":897.387573631402, "y":471.297715460655 + }, + { + "height":0, + "id":44, + "name":"", + "polygon":[ + { + "x":0, + "y":0 + }, + { + "x":-1.54117905333844, + "y":952.907895325105 + }, + { + "x":1444.99077106636, + "y":955.006951538289 + }, + { + "x":1441.18242197652, + "y":0.945712195948921 + }], + "rotation":0, + "type":"", + "visible":true, + "width":0, + "x":0.327832840141114, + "y":-0.069391499864323 }], "opacity":1, "properties":[ @@ -147,7 +175,7 @@ "y":0 }], "nextlayerid":3, - "nextobjectid":44, + "nextobjectid":45, "orientation":"isometric", "renderorder":"right-down", "tiledversion":"1.11.2", From 20cc8f1ffbe7d12824b250fd4843aff02639b7c3 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 16 Feb 2026 11:41:24 +0200 Subject: [PATCH 49/71] Use layer excluded --- detiled/internal/detiled_parser.lua | 28 +++++++++++----------------- 1 file changed, 11 insertions(+), 17 deletions(-) diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 2ebe49d..eab8383 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -188,18 +188,19 @@ function M.get_entities(tiled_map) for layer_index = 1, #tiled_map.layers do local layer = tiled_map.layers[layer_index] - - if layer.type == "tilelayer" then - local layer_entities = get_entities_from_tile_layer(layer, tiled_map, grid_module, map_params) - for index = 1, #layer_entities do - table_insert(entities, layer_entities[index]) + if not detiled_internal.is_layer_excluded(tiled_map, layer.name) then + if layer.type == "tilelayer" then + local layer_entities = get_entities_from_tile_layer(layer, tiled_map, grid_module, map_params) + for index = 1, #layer_entities do + table_insert(entities, layer_entities[index]) + end end - end - if layer.type == "objectgroup" then - local layer_entities = get_entities_from_object_layer(layer, tiled_map, grid_module, map_params) - for index = 1, #layer_entities do - table_insert(entities, layer_entities[index]) + if layer.type == "objectgroup" then + local layer_entities = get_entities_from_object_layer(layer, tiled_map, grid_module, map_params) + for index = 1, #layer_entities do + table_insert(entities, layer_entities[index]) + end end end end @@ -228,13 +229,6 @@ function M.pos_to_cell(map_params, x, y) end ----@param tiled_map detiled.map ----@param layer_name string -function M.is_layer_excluded(tiled_map, layer_name) - return detiled_internal.is_layer_excluded(tiled_map, layer_name) -end - - ---@param object detiled.map.object ---@param tile detiled.tileset.tile|nil ---@param map_width number|nil From bb36e975c7e7d32d0dcc319c5f5b706f4c7588c4 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 16 Feb 2026 11:46:15 +0200 Subject: [PATCH 50/71] Refactor hex grids --- detiled/internal/grid/hexagonal_flattop.lua | 80 ++++++++++ detiled/internal/grid/hexagonal_pointytop.lua | 80 ++++++++++ detiled/internal/grid/hexagonal_staggered.lua | 11 +- .../internal/grid/hexgrid_convertations.lua | 146 ------------------ 4 files changed, 166 insertions(+), 151 deletions(-) create mode 100644 detiled/internal/grid/hexagonal_flattop.lua create mode 100644 detiled/internal/grid/hexagonal_pointytop.lua delete mode 100644 detiled/internal/grid/hexgrid_convertations.lua diff --git a/detiled/internal/grid/hexagonal_flattop.lua b/detiled/internal/grid/hexagonal_flattop.lua new file mode 100644 index 0000000..0a10186 --- /dev/null +++ b/detiled/internal/grid/hexagonal_flattop.lua @@ -0,0 +1,80 @@ +local M = {} + + +local function round(x) + return math.floor(x + 0.5) +end + + +local function stagger_offset(idx, stagger_index) + if stagger_index == "even" then + return 0.5 * (1 - bit.band(idx, 1)) + end + return 0.5 * bit.band(idx, 1) +end + + +function M.cell_to_pos(i, j, data) + local part_size = data.tile.width - data.tile.side + local two_hex_width = data.tile.side * 2 + part_size + local stagger_index = data.scene.stagger_index or "odd" + + local x = two_hex_width / 2 * i + local y = data.tile.height * (j + stagger_offset(i, stagger_index)) + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + x = x + part_size + y = y + (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) + + return x, y +end + + +function M.pos_to_cell(x, y, map_params) + local data = map_params + local stagger_index = data.scene.stagger_index or "odd" + + local part_size = data.tile.width - data.tile.side + local two_hex_width = data.tile.side * 2 + part_size + + x = x - part_size + y = y - (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + local i = round(2 * x / two_hex_width) + local j = round(y / data.tile.height - stagger_offset(i, stagger_index)) + + return i, j +end + + +function M.cell_cube_to_pos(i, j, k, map_params) + local offset_i, offset_j = M.cube_to_offset(i, j, k, map_params) + return M.cell_to_pos(offset_i, offset_j, map_params) +end + + +function M.pos_to_cell_cube(x, y, map_params) + local offset_i, offset_j = M.pos_to_cell(x, y, map_params) + return M.offset_to_cube(offset_i, offset_j, map_params) +end + + +function M.cube_to_offset(i, j, k, map_params) + return i, k + (i - bit.band(i, 1)) / 2 +end + + +function M.offset_to_cube(i, j, map_params) + local z = j - (i - bit.band(i, 1)) / 2 + return i, -i - z, z +end + + +return M diff --git a/detiled/internal/grid/hexagonal_pointytop.lua b/detiled/internal/grid/hexagonal_pointytop.lua new file mode 100644 index 0000000..af0825d --- /dev/null +++ b/detiled/internal/grid/hexagonal_pointytop.lua @@ -0,0 +1,80 @@ +local M = {} + + +local function round(x) + return math.floor(x + 0.5) +end + + +local function stagger_offset(idx, stagger_index) + if stagger_index == "even" then + return 0.5 * (1 - bit.band(idx, 1)) + end + return 0.5 * bit.band(idx, 1) +end + + +function M.cell_to_pos(i, j, data) + local part_size = data.tile.height - data.tile.side + local two_hex_height = data.tile.side * 2 + part_size + local stagger_index = data.scene.stagger_index or "odd" + + local x = data.tile.width * (i + stagger_offset(j, stagger_index)) + local y = two_hex_height / 2 * j + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + x = x + data.tile.width/2 + y = y + (data.scene.invert_y and -part_size or part_size) + + return x, y +end + + +function M.pos_to_cell(x, y, map_params) + local data = map_params + local stagger_index = data.scene.stagger_index or "odd" + + local part_size = data.tile.height - data.tile.side + local two_hex_height = data.tile.side * 2 + part_size + + x = x - data.tile.width/2 + y = y - (data.scene.invert_y and -part_size or part_size) + + if data.scene.invert_y then + y = data.scene.size_y - y + end + + local j = round(2 * y / two_hex_height) + local i = round(x / data.tile.width - stagger_offset(j, stagger_index)) + + return i, j +end + + +function M.cell_cube_to_pos(i, j, k, map_params) + local offset_i, offset_j = M.cube_to_offset(i, j, k, map_params) + return M.cell_to_pos(offset_i, offset_j, map_params) +end + + +function M.pos_to_cell_cube(x, y, map_params) + local offset_i, offset_j = M.pos_to_cell(x, y, map_params) + return M.offset_to_cube(offset_i, offset_j, map_params) +end + + +function M.cube_to_offset(i, j, k, map_params) + return i + (k - bit.band(k, 1)) / 2, k +end + + +function M.offset_to_cube(i, j, map_params) + local x = i - (j - bit.band(j, 1)) / 2 + return x, -x - j, j +end + + +return M diff --git a/detiled/internal/grid/hexagonal_staggered.lua b/detiled/internal/grid/hexagonal_staggered.lua index b591573..c035dcf 100644 --- a/detiled/internal/grid/hexagonal_staggered.lua +++ b/detiled/internal/grid/hexagonal_staggered.lua @@ -1,4 +1,5 @@ -local hexgrid_convert = require("detiled.internal.grid.hexgrid_convertations") +local hexagonal_pointytop = require("detiled.internal.grid.hexagonal_pointytop") +local hexagonal_flattop = require("detiled.internal.grid.hexagonal_flattop") local M = {} @@ -92,10 +93,10 @@ end ---@return number, number function M.cell_to_pos(i, j, map_params) if map_params.scene.hexmap_type == HEXMAP_TYPE.POINTYTOP then - return hexgrid_convert.cell_to_pos_pointytop(i, j, map_params) + return hexagonal_pointytop.cell_to_pos(i, j, map_params) end if map_params.scene.hexmap_type == HEXMAP_TYPE.FLATTOP then - return hexgrid_convert.cell_to_pos_flattop(i, j, map_params) + return hexagonal_flattop.cell_to_pos(i, j, map_params) end return 0, 0 @@ -108,10 +109,10 @@ end ---@return number, number function M.pos_to_cell(x, y, map_params) if map_params.scene.hexmap_type == HEXMAP_TYPE.POINTYTOP then - return hexgrid_convert.pos_to_cell_pointytop(x, y, map_params) + return hexagonal_pointytop.pos_to_cell(x, y, map_params) end if map_params.scene.hexmap_type == HEXMAP_TYPE.FLATTOP then - return hexgrid_convert.pos_to_cell_flattop(x, y, map_params) + return hexagonal_flattop.pos_to_cell(x, y, map_params) end return 0, 0 diff --git a/detiled/internal/grid/hexgrid_convertations.lua b/detiled/internal/grid/hexgrid_convertations.lua deleted file mode 100644 index 0573d59..0000000 --- a/detiled/internal/grid/hexgrid_convertations.lua +++ /dev/null @@ -1,146 +0,0 @@ -local M = {} - - -local function round(x) - return math.floor(x + 0.5) -end - - -local function stagger_offset(idx, stagger_index) - if stagger_index == "even" then - return 0.5 * (1 - bit.band(idx, 1)) - end - return 0.5 * bit.band(idx, 1) -end - - -function M.cell_to_pos_flattop(i, j, data) - local part_size = data.tile.width - data.tile.side - local two_hex_width = data.tile.side * 2 + part_size - local stagger_index = data.scene.stagger_index or "odd" - - local x = two_hex_width / 2 * i - local y = data.tile.height * (j + stagger_offset(i, stagger_index)) - - if data.scene.invert_y then - y = data.scene.size_y - y - end - - x = x + part_size - y = y + (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) - - return x, y -end - - -function M.pos_to_cell_flattop(x, y, map_params) - local data = map_params - local stagger_index = data.scene.stagger_index or "odd" - - local part_size = data.tile.width - data.tile.side - local two_hex_width = data.tile.side * 2 + part_size - - x = x - part_size - y = y - (data.scene.invert_y and -data.tile.height/2 or data.tile.height/2) - - if data.scene.invert_y then - y = data.scene.size_y - y - end - - local i = round(2 * x / two_hex_width) - local j = round(y / data.tile.height - stagger_offset(i, stagger_index)) - - return i, j -end - - -function M.cell_to_pos_pointytop(i, j, data) - local part_size = data.tile.height - data.tile.side - local two_hex_height = data.tile.side * 2 + part_size - local stagger_index = data.scene.stagger_index or "odd" - - local x = data.tile.width * (i + stagger_offset(j, stagger_index)) - local y = two_hex_height / 2 * j - - if data.scene.invert_y then - y = data.scene.size_y - y - end - - x = x + data.tile.width/2 - y = y + (data.scene.invert_y and -part_size or part_size) - - return x, y -end - - -function M.pos_to_cell_pointytop(x, y, map_params) - local data = map_params - local stagger_index = data.scene.stagger_index or "odd" - - local part_size = data.tile.height - data.tile.side - local two_hex_height = data.tile.side * 2 + part_size - - x = x - data.tile.width/2 - y = y - (data.scene.invert_y and -part_size or part_size) - - if data.scene.invert_y then - y = data.scene.size_y - y - end - - local j = round(2 * y / two_hex_height) - local i = round(x / data.tile.width - stagger_offset(j, stagger_index)) - - return i, j -end - - -function M.cell_cube_to_pos_pointytop(i, j, k, map_params) - local offset_i, offset_j = M.cube_to_offset_pointytop(i, j, k, map_params) - return M.cell_to_pos_pointytop(offset_i, offset_j, map_params) -end - - -function M.cell_cube_to_pos_flattop(i, j, k, map_params) - local offset_i, offset_j = M.cube_to_offset_flattop(i, j, k, map_params) - return M.cell_to_pos_flattop(offset_i, offset_j, map_params) -end - - -function M.pos_to_cell_cube_pointytop(x, y, map_params) - local offset_i, offset_j = M.pos_to_cell_pointytop(x, y, map_params) - return M.offset_to_cube_pointytop(offset_i, offset_j, map_params) -end - - -function M.pos_to_cell_cube_flattop(x, y, map_params) - local offset_i, offset_j = M.pos_to_cell_flattop(x, y, map_params) - return M.offset_to_cube_flattop(offset_i, offset_j, map_params) -end - - -function M.cube_to_offset_pointytop(i, j, k, map_params) - return i + (k - bit.band(k, 1)) / 2, k -end - - -function M.cube_to_offset_flattop(i, j, k, map_params) - return i, k + (i - bit.band(i, 1)) / 2 -end - - -function M.offset_to_cube_pointytop(i, j, map_params) - local x = i - (j - bit.band(j, 1)) / 2 - - return x, -x - j, j -end - - -function M.offset_to_cube_flattop(i, j, map_params) - local z = j - (i - bit.band(i, 1)) / 2 - - return i, -i - z, z -end - - -return M - From 21ca219a362cb946a416e0c79c15156d1f072daa Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 16 Feb 2026 12:02:06 +0200 Subject: [PATCH 51/71] Update --- detiled/internal/detiled_parser.lua | 23 ++++++--- tiled/maps/isogrid_staggered.json | 78 +++++++++++++++++++++++------ 2 files changed, 78 insertions(+), 23 deletions(-) diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index eab8383..b3717ba 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -9,6 +9,17 @@ local table_insert = table.insert local M = {} + +local GRID_MODULES = { + ["orthogonal"] = require("detiled.internal.grid.orthogonal"), + ["isometric"] = require("detiled.internal.grid.isometric"), + ["staggered"] = require("detiled.internal.grid.isometric_staggered"), + ["hexagonal"] = require("detiled.internal.grid.hexagonal_staggered"), +} + + +---@param object detiled.map.object +---@return "point"|"ellipse"|"polyline"|"polygon"|"rectangle"|nil local function get_object_type(object) if object.point then return "point" @@ -29,14 +40,6 @@ local function get_object_type(object) end -local GRID_MODULES = { - ["orthogonal"] = require("detiled.internal.grid.orthogonal"), - ["isometric"] = require("detiled.internal.grid.isometric"), - ["staggered"] = require("detiled.internal.grid.isometric_staggered"), - ["hexagonal"] = require("detiled.internal.grid.hexagonal_staggered"), -} - - ---@param layer detiled.map.layer ---@param position_z number ---@param prefab_id string|nil @@ -88,6 +91,8 @@ local function get_entities_from_tile_layer(layer, map, grid_module, map_params) local entities = {} local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 + local offset_x = layer.offsetx or 0 + local offset_y = layer.offsety or 0 local layer_data = detiled_internal.unpack_tile_layer_data(layer) for tile_index = 1, #layer_data do @@ -98,6 +103,8 @@ local function get_entities_from_tile_layer(layer, map, grid_module, map_params) local tile_i = ((tile_index - 1) % map.width) local tile_j = (floor((tile_index - 1) / map.width)) local pos_x, pos_y = grid_module.cell_to_pos(tile_i, tile_j, map_params) + pos_x = pos_x + offset_x + pos_y = pos_y - offset_y local prefab_id = detiled_internal.get_prefab_id_from_tile(tile) local scale_x = flip_h and -1 or 1 diff --git a/tiled/maps/isogrid_staggered.json b/tiled/maps/isogrid_staggered.json index f40f69d..a5d6c81 100644 --- a/tiled/maps/isogrid_staggered.json +++ b/tiled/maps/isogrid_staggered.json @@ -5,19 +5,19 @@ { "data":[31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 1, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 1, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 1, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 76, 76, 76, 76, 76, 1, 1, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 31, 31, 31, 76, 76, 76, 76, 31, 76, 76, 76, 31, 31, 76, 76, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 31, 31, 76, 76, 76, 31, 31, 76, 76, 76, 31, 44, 31, 76, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 31, 31, 31, 76, 76, 31, 31, 31, 76, 76, 31, 45, 42, 31, 76, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 31, 31, 31, 76, 76, 31, 31, 31, 76, 76, 31, 31, 20, 75, 31, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 31, 31, 31, 76, 31, 31, 31, 31, 76, 31, 31, 68, 72, 24, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 31, 31, 31, 76, 31, 31, 31, 31, 76, 31, 31, 63, 31, 84, 76, 76, 76, 1, 1, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 31, 31, 31, 76, 31, 31, 31, 31, 81, 31, 67, 31, 85, 76, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 31, 31, 76, 31, 31, 31, 31, 76, 81, 23, 31, 31, 79, 76, 76, 76, 1, 1, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 31, 31, 76, 31, 31, 31, 76, 76, 81, 31, 31, 83, 76, 76, 76, 76, 1, 1, 76, 76, 76, 76, 76, 76, 76, - 76, 76, 76, 76, 76, 31, 31, 76, 76, 31, 31, 76, 76, 76, 81, 31, 83, 76, 76, 76, 76, 76, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 80, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 86, 79, 76, 76, 76, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 31, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 77, 2147483730, 76, 76, 76, 1, 1, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 31, 31, 31, 76, 76, 76, 76, 31, 76, 76, 76, 31, 31, 2147483733, 79, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 31, 31, 76, 76, 76, 31, 31, 76, 76, 76, 31, 44, 31, 85, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 31, 31, 31, 76, 76, 31, 31, 31, 76, 76, 31, 45, 42, 31, 88, 76, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 31, 31, 31, 76, 76, 31, 31, 31, 76, 76, 75, 31, 20, 75, 31, 79, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 31, 31, 31, 76, 31, 31, 31, 31, 76, 63, 2147483711, 64, 72, 24, 83, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 31, 31, 31, 76, 31, 31, 31, 31, 76, 62, 31, 16, 31, 84, 85, 76, 76, 1, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 31, 31, 31, 76, 31, 31, 31, 31, 81, 73, 67, 74, 85, 81, 79, 76, 1, 1, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 31, 31, 76, 31, 31, 31, 31, 76, 81, 18, 2147483722, 31, 79, 78, 76, 76, 1, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 31, 31, 76, 31, 31, 31, 76, 76, 81, 73, 74, 83, 76, 76, 76, 76, 1, 1, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 31, 31, 76, 76, 31, 31, 76, 76, 76, 81, 72, 83, 76, 76, 76, 76, 76, 1, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 31, 76, 76, 76, 76, 76, 76, 76, 76, 81, 83, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 78, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, 76, @@ -85,6 +85,54 @@ "width":169, "x":2130.14706811718, "y":114.611249040762 + }, + { + "gid":90, + "height":51.0859828054432, + "id":29, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":35.448254275545, + "x":1762.7588109643, + "y":84.4788853927294 + }, + { + "gid":90, + "height":51.086, + "id":30, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":35.4483, + "x":1745.5521200663, + "y":92.7762274074232 + }, + { + "gid":90, + "height":51.086, + "id":31, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":35.4483, + "x":1727.43115731021, + "y":101.090551495512 + }, + { + "gid":90, + "height":51.086, + "id":32, + "name":"", + "rotation":0, + "type":"", + "visible":true, + "width":35.4483, + "x":1710.37613353977, + "y":110.257626772124 }], "opacity":1, "properties":[ @@ -98,8 +146,8 @@ "x":0, "y":0 }], - "nextlayerid":3, - "nextobjectid":29, + "nextlayerid":4, + "nextobjectid":33, "orientation":"staggered", "renderorder":"right-down", "staggeraxis":"y", From 9c4acc0ed281fd35166321e72b98d70492a63cf6 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 16 Feb 2026 12:23:33 +0200 Subject: [PATCH 52/71] Update annotations --- detiled/internal/detiled_annotations.lua | 9 +++-- detiled/internal/detiled_parser.lua | 2 +- detiled/internal/grid/hexagonal_flattop.lua | 32 ++++++++++++++++++ detiled/internal/grid/hexagonal_pointytop.lua | 33 ++++++++++++++++++- detiled/internal/grid/hexagonal_staggered.lua | 7 ++++ detiled/internal/grid/isometric.lua | 13 ++++---- detiled/internal/grid/isometric_staggered.lua | 6 ++++ detiled/internal/grid/orthogonal.lua | 4 ++- .../example_isogrid/example_isogrid.script | 1 - 9 files changed, 94 insertions(+), 13 deletions(-) diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index b9aa588..bc58c60 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -166,6 +166,9 @@ ---@field tile detiled.map_params.tile ---@field scene detiled.map_params.scene ----@class detiled.get_entity_from_map_result ----@field map_params detiled.map_params|nil ----@field entities detiled.entity[] +---@class detiled.grid +---@field get_map_params_from_tiled fun(tiled_data: detiled.map): detiled.map_params +---@field cell_to_pos fun(i: number, j: number, map_params: detiled.map_params): number, number +---@field pos_to_cell fun(x: number, y: number, map_params: detiled.map_params): number, number +---@field get_tile_pos fun(i: number, j: number, z_layer: number|nil, map_params: detiled.map_params): number, number, number +---@field convert_object_position? fun(x: number, y: number, map_params: detiled.map_params): number, number diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index b3717ba..4d25144 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -9,7 +9,7 @@ local table_insert = table.insert local M = {} - +---@type table local GRID_MODULES = { ["orthogonal"] = require("detiled.internal.grid.orthogonal"), ["isometric"] = require("detiled.internal.grid.isometric"), diff --git a/detiled/internal/grid/hexagonal_flattop.lua b/detiled/internal/grid/hexagonal_flattop.lua index 0a10186..558a86b 100644 --- a/detiled/internal/grid/hexagonal_flattop.lua +++ b/detiled/internal/grid/hexagonal_flattop.lua @@ -1,11 +1,17 @@ +---@class detiled.grid.hexagonal_flattop: detiled.grid local M = {} +---@param x number +---@return number local function round(x) return math.floor(x + 0.5) end +---@param idx number +---@param stagger_index string +---@return number local function stagger_offset(idx, stagger_index) if stagger_index == "even" then return 0.5 * (1 - bit.band(idx, 1)) @@ -14,6 +20,10 @@ local function stagger_offset(idx, stagger_index) end +---@param i number +---@param j number +---@param data detiled.map_params +---@return number, number function M.cell_to_pos(i, j, data) local part_size = data.tile.width - data.tile.side local two_hex_width = data.tile.side * 2 + part_size @@ -33,6 +43,10 @@ function M.cell_to_pos(i, j, data) end +---@param x number +---@param y number +---@param map_params detiled.map_params +---@return number, number function M.pos_to_cell(x, y, map_params) local data = map_params local stagger_index = data.scene.stagger_index or "odd" @@ -54,23 +68,41 @@ function M.pos_to_cell(x, y, map_params) end +---@param i number +---@param j number +---@param k number +---@param map_params detiled.map_params +---@return number, number function M.cell_cube_to_pos(i, j, k, map_params) local offset_i, offset_j = M.cube_to_offset(i, j, k, map_params) return M.cell_to_pos(offset_i, offset_j, map_params) end +---@param x number +---@param y number +---@param map_params detiled.map_params +---@return number, number, number function M.pos_to_cell_cube(x, y, map_params) local offset_i, offset_j = M.pos_to_cell(x, y, map_params) return M.offset_to_cube(offset_i, offset_j, map_params) end +---@param i number +---@param j number +---@param k number +---@param map_params detiled.map_params +---@return number, number function M.cube_to_offset(i, j, k, map_params) return i, k + (i - bit.band(i, 1)) / 2 end +---@param i number +---@param j number +---@param map_params detiled.map_params +---@return number, number, number function M.offset_to_cube(i, j, map_params) local z = j - (i - bit.band(i, 1)) / 2 return i, -i - z, z diff --git a/detiled/internal/grid/hexagonal_pointytop.lua b/detiled/internal/grid/hexagonal_pointytop.lua index af0825d..38b5063 100644 --- a/detiled/internal/grid/hexagonal_pointytop.lua +++ b/detiled/internal/grid/hexagonal_pointytop.lua @@ -1,11 +1,16 @@ +---@class detiled.grid.hexagonal_pointytop: detiled.grid local M = {} - +---@param x number +---@return number local function round(x) return math.floor(x + 0.5) end +---@param idx number +---@param stagger_index string +---@return number local function stagger_offset(idx, stagger_index) if stagger_index == "even" then return 0.5 * (1 - bit.band(idx, 1)) @@ -14,6 +19,10 @@ local function stagger_offset(idx, stagger_index) end +---@param i number +---@param j number +---@param data detiled.map_params +---@return number, number function M.cell_to_pos(i, j, data) local part_size = data.tile.height - data.tile.side local two_hex_height = data.tile.side * 2 + part_size @@ -33,6 +42,10 @@ function M.cell_to_pos(i, j, data) end +---@param x number +---@param y number +---@param map_params detiled.map_params +---@return number, number function M.pos_to_cell(x, y, map_params) local data = map_params local stagger_index = data.scene.stagger_index or "odd" @@ -54,23 +67,41 @@ function M.pos_to_cell(x, y, map_params) end +---@param i number +---@param j number +---@param k number +---@param map_params detiled.map_params +---@return number, number function M.cell_cube_to_pos(i, j, k, map_params) local offset_i, offset_j = M.cube_to_offset(i, j, k, map_params) return M.cell_to_pos(offset_i, offset_j, map_params) end +---@param x number +---@param y number +---@param map_params detiled.map_params +---@return number, number, number function M.pos_to_cell_cube(x, y, map_params) local offset_i, offset_j = M.pos_to_cell(x, y, map_params) return M.offset_to_cube(offset_i, offset_j, map_params) end +---@param i number +---@param j number +---@param k number +---@param map_params detiled.map_params +---@return number, number function M.cube_to_offset(i, j, k, map_params) return i + (k - bit.band(k, 1)) / 2, k end +---@param i number +---@param j number +---@param map_params detiled.map_params +---@return number, number, number function M.offset_to_cube(i, j, map_params) local x = i - (j - bit.band(j, 1)) / 2 return x, -x - j, j diff --git a/detiled/internal/grid/hexagonal_staggered.lua b/detiled/internal/grid/hexagonal_staggered.lua index c035dcf..39749c3 100644 --- a/detiled/internal/grid/hexagonal_staggered.lua +++ b/detiled/internal/grid/hexagonal_staggered.lua @@ -1,6 +1,7 @@ local hexagonal_pointytop = require("detiled.internal.grid.hexagonal_pointytop") local hexagonal_flattop = require("detiled.internal.grid.hexagonal_flattop") +---@class detiled.grid.hexagonal: detiled.grid local M = {} local HEXMAP_TYPE = { @@ -9,6 +10,8 @@ local HEXMAP_TYPE = { } +---@param data detiled.map_params +---@return number, number local function get_scene_size_pointytop(data) local tile_width = data.tile.width local tile_height = data.tile.height @@ -24,6 +27,8 @@ local function get_scene_size_pointytop(data) end +---@param data detiled.map_params +---@return number, number local function get_scene_size_flattop(data) local tile_width = data.tile.width local tile_height = data.tile.height @@ -41,6 +46,8 @@ local function get_scene_size_flattop(data) end +---@param map_params detiled.map_params +---@return number, number local function get_scene_size(map_params) local data = map_params diff --git a/detiled/internal/grid/isometric.lua b/detiled/internal/grid/isometric.lua index 51c794e..0d01652 100644 --- a/detiled/internal/grid/isometric.lua +++ b/detiled/internal/grid/isometric.lua @@ -1,6 +1,8 @@ +---@class detiled.grid.isometric: detiled.grid local M = {} - +---@param map_params detiled.map_params +---@return number, number local function get_scene_size(map_params) local data = map_params local w = data.scene.tiles_x @@ -88,11 +90,10 @@ function M.pos_to_cell(x, y, map_params) end ---- Get object position from Tiled, convert to defold map position ---- @param x number ---- @param y number ---- @param map_params detiled.map_params ---- @return number, number +---@param x number +---@param y number +---@param map_params detiled.map_params +---@return number, number function M.convert_object_position(x, y, map_params) local tile_count_y = map_params.scene.tiles_y local tile_width = map_params.tile.width diff --git a/detiled/internal/grid/isometric_staggered.lua b/detiled/internal/grid/isometric_staggered.lua index 49a76a0..3927a66 100644 --- a/detiled/internal/grid/isometric_staggered.lua +++ b/detiled/internal/grid/isometric_staggered.lua @@ -1,3 +1,4 @@ +---@class detiled.grid.staggered: detiled.grid local M = {} local STAGGER_AXIS = { @@ -6,6 +7,9 @@ local STAGGER_AXIS = { } +---@param idx number +---@param stagger_index string +---@return number local function stagger_offset(idx, stagger_index) if stagger_index == "even" then return 0.5 * (1 - bit.band(idx, 1)) @@ -14,6 +18,8 @@ local function stagger_offset(idx, stagger_index) end +---@param map_params detiled.map_params +---@return number, number local function get_scene_size(map_params) local data = map_params local tw = data.tile.width diff --git a/detiled/internal/grid/orthogonal.lua b/detiled/internal/grid/orthogonal.lua index bfeb17a..ac4e20f 100644 --- a/detiled/internal/grid/orthogonal.lua +++ b/detiled/internal/grid/orthogonal.lua @@ -1,6 +1,8 @@ +---@class detiled.grid.orthogonal: detiled.grid local M = {} - +---@param map_params detiled.map_params +---@return number, number local function get_scene_size(map_params) local data = map_params diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index 8cd02c9..891a190 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -45,7 +45,6 @@ function init(self) end - function on_input(self, action_id, action) if action_id == hash("touch") and action.pressed then local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) From bb3e8d247b90ef608da8d75a6625b39847e6f477 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 16 Feb 2026 14:13:00 +0200 Subject: [PATCH 53/71] Update --- README.md | 23 ------------- detiled/detiled.lua | 12 +------ .../example_hexgrid.collection | 2 +- input/game.input_binding | 34 ------------------- 4 files changed, 2 insertions(+), 69 deletions(-) delete mode 100644 input/game.input_binding diff --git a/README.md b/README.md index 7a1d229..3b75244 100644 --- a/README.md +++ b/README.md @@ -51,29 +51,6 @@ After that, select `Project ▸ Fetch Libraries` to update [library dependencies ### Workflow -1. Load all tilesets before loading maps: - ```lua - local detiled = require("detiled.detiled") - - -- Load all used tilesets first before loading maps - detiled.load_tileset("/resources/tilesets/my_tileset.json") - ``` - -2. Convert Tiled maps to Decore entities: - ```lua - -- Get entities and map params from map - local entities, map_params = detiled.get_entity_from_map("/resources/maps/my_map.json") - - -- Add entities to Decore world - for _, entity in ipairs(entities) do - world:addEntity(decore.create(entity)) - end - - -- Use map_params for coordinate conversion (cell_to_pos, pos_to_cell) - ``` - - Each entity is a flat table: `prefab_id`, `position_x`, `position_y`, `position_z`, and optionally `scale_x`, `scale_y`, `rotation` (omitted when default), plus `name`, `tiled_id`, `tiled_layer_id`, and any custom properties from Tiled. - ### Prefab ID Resolution Prefab IDs are determined in this order: diff --git a/detiled/detiled.lua b/detiled/detiled.lua index 2019bf4..e9af1d6 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -13,14 +13,10 @@ function M.set_logger(logger_instance) end ----Load a tiled map as a Decore entity ----You can add this entity with `world:addEntity(entity)` +---Get entities and map params from a map ---@param map_or_path detiled.map|string ---@return detiled.entity[], detiled.map_params|nil function M.get_entity_from_map(map_or_path) - collectgarbage("stop") - local memory = collectgarbage("count") - local map = map_or_path if type(map_or_path) == "string" then map = detiled_internal.load_json(map_or_path) --[[@as detiled.map]] @@ -30,15 +26,9 @@ function M.get_entity_from_map(map_or_path) end end - print("Memory after load map", collectgarbage("count") - memory) - memory = collectgarbage("count") - ---@cast map detiled.map local entities, map_params = detiled_parser.get_entities(map) - print("Memory after get entities", #entities, collectgarbage("count") - memory) - collectgarbage("restart") - return entities, map_params end diff --git a/example/example_hexgrid/example_hexgrid.collection b/example/example_hexgrid/example_hexgrid.collection index 1682492..cdde138 100644 --- a/example/example_hexgrid/example_hexgrid.collection +++ b/example/example_hexgrid/example_hexgrid.collection @@ -1,4 +1,4 @@ -name: "examle_hexgrid" +name: "example_hexgrid" instances { id: "entities" prototype: "/example/assets/hexgrid/entities.go" diff --git a/input/game.input_binding b/input/game.input_binding deleted file mode 100644 index 276e70b..0000000 --- a/input/game.input_binding +++ /dev/null @@ -1,34 +0,0 @@ -key_trigger { - input: KEY_W - action: "move_up" -} - -key_trigger { - input: KEY_S - action: "move_down" -} - -key_trigger { - input: KEY_A - action: "move_left" -} - -key_trigger { - input: KEY_D - action: "move_right" -} - -key_trigger { - input: KEY_E - action: "zoom_in" -} - -key_trigger { - input: KEY_Q - action: "zoom_out" -} - -mouse_trigger { - input: MOUSE_BUTTON_1 - action: "touch" -} From bfbb6278744d7e993e4aab43a4a656e82ead6cea Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 17 Feb 2026 10:55:12 +0200 Subject: [PATCH 54/71] Update --- detiled/detiled.lua | 12 ++++++------ detiled/internal/detiled_parser.lua | 8 ++++---- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/detiled/detiled.lua b/detiled/detiled.lua index e9af1d6..1ea8e98 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -34,22 +34,22 @@ end ---Convert cell indices to world position ----@param map_params detiled.map_params ---@param i number ---@param j number +---@param map_params detiled.map_params ---@return number, number -function M.cell_to_pos(map_params, i, j) - return detiled_parser.cell_to_pos(map_params, i, j) +function M.cell_to_pos(i, j, map_params) + return detiled_parser.cell_to_pos(i, j, map_params) end ---Convert world position to cell indices ----@param map_params detiled.map_params ---@param x number ---@param y number +---@param map_params detiled.map_params ---@return number, number -function M.pos_to_cell(map_params, x, y) - return detiled_parser.pos_to_cell(map_params, x, y) +function M.pos_to_cell(x, y, map_params) + return detiled_parser.pos_to_cell(x, y, map_params) end diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 4d25144..c5e7503 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -216,21 +216,21 @@ function M.get_entities(tiled_map) end ----@param map_params detiled.map_params ---@param i number ---@param j number +---@param map_params detiled.map_params ---@return number, number -function M.cell_to_pos(map_params, i, j) +function M.cell_to_pos(i, j, map_params) local grid = GRID_MODULES[map_params.orientation] return grid.cell_to_pos(i, j, map_params) end ----@param map_params detiled.map_params ---@param x number ---@param y number +---@param map_params detiled.map_params ---@return number, number -function M.pos_to_cell(map_params, x, y) +function M.pos_to_cell(x, y, map_params) local grid = GRID_MODULES[map_params.orientation] return grid.pos_to_cell(x, y, map_params) end From 9778cd7764c6bf96bf62c8438ef64a6d55dd3d46 Mon Sep 17 00:00:00 2001 From: Insality Date: Fri, 20 Feb 2026 09:42:11 +0200 Subject: [PATCH 55/71] Update logo imaegs --- media/logo.png | Bin 302638 -> 302525 bytes media/logo_hero.png | Bin 241200 -> 241284 bytes media/logo_thumb.png | Bin 99041 -> 98770 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/media/logo.png b/media/logo.png index 6ccbcb4b43f9e5ba1c44e7fb23ff9ac9b92304ba..c381a034909c07ab07e7a1a202528c9ee3c0d6bf 100644 GIT binary patch delta 47789 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 delta 47902 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 U`^E@z;6Z|8eJbm>2T;bL8#8ZOnbIG(C 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 delta 32938 zcmYhicT^MY^FFMiU`Is(DFUKkLjib`Fz;m77-;efe2_?n4*~@4Nhn`10@w(Vm6g5r$0b^N z{<*kWk=pZ5X}&C)=f)yjioeEfx=rqU9{Pd4i+Ck=SnfzcK};5jeMsW@6yWOB&x*D3 zOkr}p!Zx_{UTUwQWhpo20r!vj{d11vVbgtA66aekxLdx3@I!sPxXslhczLj_*!A zvblT0;iSOUqtExw{-DQ{${t`jp(~o?&0b~9JOEtN_vxXmDLwHvO0%-*kPmZ?`7d8} z=E(gN)M?Yz5EorT9VxD)1PL6Y?reKTA`9-XtR=(=DH;#>^$dN^ z^>S&5g!S>Ps~P74N^%o$2;5|72eG814`wd?+Pp-=Hy?wLwNWJsCV#tC$^XmLrlyLUwtRF-98*wS3k~mM{%Hj z^Yn9u0vz{Yaiz}B>$UX)=(t6}0I9vfw^WIb?1wvtespCSA0t>YsWO!q|K54&L@57w z)7>5i-%gi{J!S<^RSQDpwyovvqKySO3Ir;iaqy$ZZn75^$N(T2 zw7)$_kSPp4e^LYS(x9Y-1lbIE39;Ugl*FwQeCQneMaE-^;3RVyznjvT3H5S8hAsr1Mw-}(+QeX7p%_>ruD z*1B&6jBb0 z-Hg+XY{o6B!9h!Hl?Q%Iz_*?)6M#w(R3`Di>Nd`Z1b|pY_zx$j5xalihNz+O$a&nE zV*F{7a`SlOj@Bi{R*l|}BSY%F_rg`xkETj-Cu!GKS(CMSvxbk>a@QuSuq<>L9Sm}# zhfVj}WjkHTyZYE~y(D;3`mvm2%Z<0fXYVq$^1A=_d%F}xpSnHtCtxY$V}!HQ*3lsg zLLDs)0GFD6Q-8=s)-Z0=ZFD$f+Ly=*@S~zbyyr518h?|4V7)T?@Im*%0ANWQ7<7C) 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�Od2fA)- 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 delta 55503 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 I6fWWa01lKPK>z>% From 0ff8971399fdaa7bfc7a255231c5d26c07406d3e Mon Sep 17 00:00:00 2001 From: Insality Date: Fri, 20 Feb 2026 11:54:48 +0200 Subject: [PATCH 56/71] Update deps --- game.project | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/game.project b/game.project index beec2ea..3f8210e 100644 --- a/game.project +++ b/game.project @@ -15,10 +15,10 @@ input_method = HiddenInputField title = Detiled version = 2 custom_resources = /tiled/maps,/tiled/tilesets -dependencies#0 = https://github.com/britzl/deftest/archive/master.zip +dependencies#0 = https://github.com/britzl/deftest/archive/refs/tags/2.8.0.zip dependencies#1 = https://github.com/Insality/defold-event/archive/refs/tags/14.zip -dependencies#2 = https://github.com/Insality/asset-store/archive/refs/heads/main.zip -dependencies#3 = https://github.com/Insality/druid/archive/refs/heads/develop.zip +dependencies#2 = https://github.com/Insality/asset-store/archive/refs/tags/2.zip +dependencies#3 = https://github.com/Insality/druid/archive/refs/tags/1.2.0.zip [library] include_dirs = detiled From fc28c7dee80f2da66ec370c19d5530c5ea872657 Mon Sep 17 00:00:00 2001 From: Insality Date: Fri, 20 Feb 2026 11:57:05 +0200 Subject: [PATCH 57/71] Update examples --- example/example_grid/example_grid.script | 4 ++-- .../example_grid_game_objects.script | 4 ++-- example/example_hexgrid/example_hexgrid.script | 4 ++-- example/example_hexgrid_pointy/example_hexgrid_pointy.script | 4 ++-- example/example_isogrid/example_isogrid.script | 4 ++-- .../example_isogrid_staggered.script | 4 ++-- 6 files changed, 12 insertions(+), 12 deletions(-) diff --git a/example/example_grid/example_grid.script b/example/example_grid/example_grid.script index 72be5ef..0528c2d 100644 --- a/example/example_grid/example_grid.script +++ b/example/example_grid/example_grid.script @@ -38,8 +38,8 @@ end function on_input(self, action_id, action) if action_id == hash("touch") and action.pressed then local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) - local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) - local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) + local cell_i, cell_j = detiled.pos_to_cell(world_pos.x, world_pos.y, self.map_params) + local position_x, position_y = detiled.cell_to_pos(cell_i, cell_j, self.map_params) print("touch cell", cell_i, cell_j, "pos", position_x, position_y) end end diff --git a/example/example_grid_game_objects/example_grid_game_objects.script b/example/example_grid_game_objects/example_grid_game_objects.script index af48c7a..383618c 100644 --- a/example/example_grid_game_objects/example_grid_game_objects.script +++ b/example/example_grid_game_objects/example_grid_game_objects.script @@ -39,8 +39,8 @@ end function on_input(self, action_id, action) if action_id == hash("touch") and action.pressed then local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) - local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) - local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) + local cell_i, cell_j = detiled.pos_to_cell(world_pos.x, world_pos.y, self.map_params) + local position_x, position_y = detiled.cell_to_pos(cell_i, cell_j, self.map_params) print("touch cell", cell_i, cell_j, "pos", position_x, position_y) end end diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index 64b6988..5d9b8c0 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -42,8 +42,8 @@ end function on_input(self, action_id, action) if action_id == hash("touch") and action.pressed then local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) - local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) - local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) + local cell_i, cell_j = detiled.pos_to_cell(world_pos.x, world_pos.y, self.map_params) + local position_x, position_y = detiled.cell_to_pos(cell_i, cell_j, self.map_params) print("touch cell", cell_i, cell_j, "pos", position_x, position_y) end end diff --git a/example/example_hexgrid_pointy/example_hexgrid_pointy.script b/example/example_hexgrid_pointy/example_hexgrid_pointy.script index 2cab71d..59b0dcd 100644 --- a/example/example_hexgrid_pointy/example_hexgrid_pointy.script +++ b/example/example_hexgrid_pointy/example_hexgrid_pointy.script @@ -42,8 +42,8 @@ end function on_input(self, action_id, action) if action_id == hash("touch") and action.pressed then local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) - local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) - local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) + local cell_i, cell_j = detiled.pos_to_cell(world_pos.x, world_pos.y, self.map_params) + local position_x, position_y = detiled.cell_to_pos(cell_i, cell_j, self.map_params) print("touch cell", cell_i, cell_j, "pos", position_x, position_y) end end diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index 891a190..d5c306d 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -48,8 +48,8 @@ end function on_input(self, action_id, action) if action_id == hash("touch") and action.pressed then local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) - local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) - local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) + local cell_i, cell_j = detiled.pos_to_cell(world_pos.x, world_pos.y, self.map_params) + local position_x, position_y = detiled.cell_to_pos(cell_i, cell_j, self.map_params) print("touch cell", cell_i, cell_j, "pos", position_x, position_y) end end diff --git a/example/example_isogrid_staggered/example_isogrid_staggered.script b/example/example_isogrid_staggered/example_isogrid_staggered.script index f9c1221..c263e87 100644 --- a/example/example_isogrid_staggered/example_isogrid_staggered.script +++ b/example/example_isogrid_staggered/example_isogrid_staggered.script @@ -44,8 +44,8 @@ end function on_input(self, action_id, action) if action_id == hash("touch") and action.pressed then local world_pos = camera.screen_xy_to_world(action.screen_x, action.screen_y) - local cell_i, cell_j = detiled.pos_to_cell(self.map_params, world_pos.x, world_pos.y) - local position_x, position_y = detiled.cell_to_pos(self.map_params, cell_i, cell_j) + local cell_i, cell_j = detiled.pos_to_cell(world_pos.x, world_pos.y, self.map_params) + local position_x, position_y = detiled.cell_to_pos(cell_i, cell_j, self.map_params) print("touch cell", cell_i, cell_j, "pos", position_x, position_y) end end From 1ca35dd8d0e877b201b92055bf2a6fb30f129b5a Mon Sep 17 00:00:00 2001 From: Insality Date: Fri, 20 Feb 2026 20:22:31 +0200 Subject: [PATCH 58/71] Add image field to the parsed entities from tilesets --- api/detiled_api.md | 2 +- detiled/internal/detiled_annotations.lua | 2 ++ detiled/internal/detiled_internal.lua | 12 ++++++++ detiled/internal/detiled_parser.lua | 14 +++++---- example/assets/hexgrid/entities.go | 6 ++++ example/assets/hexgrid/entities/tile.go | 14 +++++++++ tiled/tilesets/hexgrid_tiles.json | 36 ++++++++++++++++-------- 7 files changed, 67 insertions(+), 19 deletions(-) create mode 100644 example/assets/hexgrid/entities/tile.go diff --git a/api/detiled_api.md b/api/detiled_api.md index 2d8cb86..6a8665a 100644 --- a/api/detiled_api.md +++ b/api/detiled_api.md @@ -32,7 +32,7 @@ local entities, map_params = detiled.get_entity_from_map(map_or_path) Load a tiled map and return entities and map params. Use `entities` to spawn and `map_params` for coordinate conversion. -Each entity is a flat table: `prefab_id`, `position_x`, `position_y`, `position_z`; optional `scale_x`, `scale_y`, `rotation` (only set when non-default); optional `name`, `tiled_id`, `tiled_layer_id`, `size_x`, `size_y`; plus any custom properties from Tiled. +Each entity is a flat table: `prefab_id`, `position_x`, `position_y`, `position_z`; optional `image`; optional `scale_x`, `scale_y`, `rotation` (only set when non-default); optional `name`, `tiled_id`, `tiled_layer_id`, `size_x`, `size_y`; plus any custom properties from Tiled. - **Parameters:** - `map_or_path` *(string|detiled.map)*: diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index bc58c60..6dca3a5 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -1,6 +1,7 @@ ---@class detiled.tileset ---@field class string ---@field columns number +---@field image string|nil ---@field fillmode string ---@field grid detiled.tileset.grid ---@field margin number @@ -131,6 +132,7 @@ ---@class detiled.entity ---@field prefab_id string|nil +---@field image string|nil ---@field position_x number ---@field position_y number ---@field position_z number diff --git a/detiled/internal/detiled_internal.lua b/detiled/internal/detiled_internal.lua index 927b117..8b62737 100644 --- a/detiled/internal/detiled_internal.lua +++ b/detiled/internal/detiled_internal.lua @@ -301,6 +301,18 @@ function M.get_prefab_id_from_tile(tile) end +---@param tile detiled.tileset.tile +---@param tileset detiled.tileset +---@return string|nil +function M.get_image_name_from_tile(tile, tileset) + local image_path = tile.image or (tileset and tileset["image"]) + if not image_path or image_path == "" then + return nil + end + return M.get_filename(image_path) +end + + ---@param layer detiled.map.layer ---@return number[]|string layer data as array of GIDs or raw data function M.unpack_tile_layer_data(layer) diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index c5e7503..a24af85 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -49,11 +49,13 @@ end ---@param scale_y number ---@param rotation number ---@param object detiled.map.object|nil +---@param image string|nil ---@return detiled.entity -local function make_entity(layer, position_z, prefab_id, position_x, position_y, scale_x, scale_y, rotation, object) +local function make_entity(layer, position_z, prefab_id, position_x, position_y, scale_x, scale_y, rotation, object, image) ---@type detiled.entity local entity = { prefab_id = prefab_id, + image = image, position_x = position_x, position_y = position_y, position_z = position_z, @@ -106,11 +108,11 @@ local function get_entities_from_tile_layer(layer, map, grid_module, map_params) pos_x = pos_x + offset_x pos_y = pos_y - offset_y local prefab_id = detiled_internal.get_prefab_id_from_tile(tile) - + local image = detiled_internal.get_image_name_from_tile(tile, tileset) local scale_x = flip_h and -1 or 1 local scale_y = flip_v and -1 or 1 local rotation = flip_d and -90 or 0 - local entity = make_entity(layer, position_z, prefab_id, pos_x, pos_y, scale_x, scale_y, rotation, nil) + local entity = make_entity(layer, position_z, prefab_id, pos_x, pos_y, scale_x, scale_y, rotation, nil, image) detiled_internal.apply_tile_properties_to_entity(entity, tile) table_insert(entities, entity) @@ -159,8 +161,8 @@ local function get_entities_from_object_layer(layer, map, grid_module, map_param if flip_v then scale_y = -scale_y end if flip_d then rotation = rotation - 90 end local prefab_id = detiled_internal.get_prefab_id_from_tile(tile) - - local entity = make_entity(layer, position_z, prefab_id, position_x, position_y, scale_x, scale_y, rotation, object) + local image = detiled_internal.get_image_name_from_tile(tile, tileset) + local entity = make_entity(layer, position_z, prefab_id, position_x, position_y, scale_x, scale_y, rotation, object, image) detiled_internal.apply_tile_properties_to_entity(entity, tile) detiled_internal.apply_object_properties_to_entity(entity, object) table_insert(entities, entity) @@ -174,7 +176,7 @@ local function get_entities_from_object_layer(layer, map, grid_module, map_param local use_scale = object.class and object.class ~= "" local entity_scale_x = use_scale and scale_x or 1 local entity_scale_y = use_scale and scale_y or 1 - local entity = make_entity(layer, position_z, prefab_id, position_x, position_y, entity_scale_x, entity_scale_y, rotation, object) + local entity = make_entity(layer, position_z, prefab_id, position_x, position_y, entity_scale_x, entity_scale_y, rotation, object, nil) detiled_internal.apply_object_properties_to_entity(entity, object) table_insert(entities, entity) end diff --git a/example/assets/hexgrid/entities.go b/example/assets/hexgrid/entities.go index 13498ee..315db02 100644 --- a/example/assets/hexgrid/entities.go +++ b/example/assets/hexgrid/entities.go @@ -82,3 +82,9 @@ embedded_components { data: "prototype: \"/example/assets/hexgrid/entities/r_tree_round_2.go\"\n" "" } +embedded_components { + id: "tile" + type: "factory" + data: "prototype: \"/example/assets/hexgrid/entities/tile.go\"\n" + "" +} diff --git a/example/assets/hexgrid/entities/tile.go b/example/assets/hexgrid/entities/tile.go new file mode 100644 index 0000000..eb2c2c1 --- /dev/null +++ b/example/assets/hexgrid/entities/tile.go @@ -0,0 +1,14 @@ +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_dirt\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/assets/hexgrid/hexgrid_tiles.atlas\"\n" + "}\n" + "" + position { + y: 22.0 + } +} diff --git a/tiled/tilesets/hexgrid_tiles.json b/tiled/tilesets/hexgrid_tiles.json index fcec4e0..8730893 100644 --- a/tiled/tilesets/hexgrid_tiles.json +++ b/tiled/tilesets/hexgrid_tiles.json @@ -16,73 +16,85 @@ "id":0, "image":"..\/assets\/hexgrid\/tile_dirt_2.png", "imageheight":189, - "imagewidth":192 + "imagewidth":192, + "type":"tile" }, { "id":1, "image":"..\/assets\/hexgrid\/tile_dirt_3.png", "imageheight":189, - "imagewidth":192 + "imagewidth":192, + "type":"tile" }, { "id":2, "image":"..\/assets\/hexgrid\/tile_dirt.png", "imageheight":189, - "imagewidth":192 + "imagewidth":192, + "type":"tile" }, { "id":3, "image":"..\/assets\/hexgrid\/tile_grass_2.png", "imageheight":189, - "imagewidth":192 + "imagewidth":192, + "type":"tile" }, { "id":4, "image":"..\/assets\/hexgrid\/tile_grass_3.png", "imageheight":189, - "imagewidth":192 + "imagewidth":192, + "type":"tile" }, { "id":5, "image":"..\/assets\/hexgrid\/tile_grass.png", "imageheight":189, - "imagewidth":192 + "imagewidth":192, + "type":"tile" }, { "id":6, "image":"..\/assets\/hexgrid\/tile_sand_2.png", "imageheight":189, - "imagewidth":192 + "imagewidth":192, + "type":"tile" }, { "id":7, "image":"..\/assets\/hexgrid\/tile_sand_3.png", "imageheight":189, - "imagewidth":192 + "imagewidth":192, + "type":"tile" }, { "id":8, "image":"..\/assets\/hexgrid\/tile_sand.png", "imageheight":189, - "imagewidth":192 + "imagewidth":192, + "type":"tile" }, { "id":9, "image":"..\/assets\/hexgrid\/tile_stone_2.png", "imageheight":189, - "imagewidth":192 + "imagewidth":192, + "type":"tile" }, { "id":10, "image":"..\/assets\/hexgrid\/tile_stone_3.png", "imageheight":189, - "imagewidth":192 + "imagewidth":192, + "type":"tile" }, { "id":11, "image":"..\/assets\/hexgrid\/tile_stone.png", "imageheight":189, - "imagewidth":192 + "imagewidth":192, + "type":"tile" }], "tilewidth":192, "type":"tileset", From 3ca3fb765234c2df3ea784449c412ea90584bd90 Mon Sep 17 00:00:00 2001 From: Insality Date: Fri, 20 Feb 2026 20:37:11 +0200 Subject: [PATCH 59/71] Update example with one game object multiple sprites --- example/assets/hexgrid/entities.go | 72 ------------------- example/assets/hexgrid/entities/tile.go | 4 ++ example/assets/hexgrid/set_sprite.script | 11 +++ .../example_hexgrid/example_hexgrid.script | 2 +- game.project | 2 +- tiled/maps/grid_game_objects.json | 20 +++--- 6 files changed, 27 insertions(+), 84 deletions(-) create mode 100644 example/assets/hexgrid/set_sprite.script diff --git a/example/assets/hexgrid/entities.go b/example/assets/hexgrid/entities.go index 315db02..30125ca 100644 --- a/example/assets/hexgrid/entities.go +++ b/example/assets/hexgrid/entities.go @@ -1,75 +1,3 @@ -embedded_components { - id: "tile_dirt" - type: "factory" - data: "prototype: \"/example/assets/hexgrid/entities/tile_dirt.go\"\n" - "" -} -embedded_components { - id: "tile_dirt_2" - type: "factory" - data: "prototype: \"/example/assets/hexgrid/entities/tile_dirt_2.go\"\n" - "" -} -embedded_components { - id: "tile_dirt_3" - type: "factory" - data: "prototype: \"/example/assets/hexgrid/entities/tile_dirt_3.go\"\n" - "" -} -embedded_components { - id: "tile_grass" - type: "factory" - data: "prototype: \"/example/assets/hexgrid/entities/tile_grass.go\"\n" - "" -} -embedded_components { - id: "tile_grass_2" - type: "factory" - data: "prototype: \"/example/assets/hexgrid/entities/tile_grass_2.go\"\n" - "" -} -embedded_components { - id: "tile_grass_3" - type: "factory" - data: "prototype: \"/example/assets/hexgrid/entities/tile_grass_3.go\"\n" - "" -} -embedded_components { - id: "tile_sand" - type: "factory" - data: "prototype: \"/example/assets/hexgrid/entities/tile_sand.go\"\n" - "" -} -embedded_components { - id: "tile_sand_2" - type: "factory" - data: "prototype: \"/example/assets/hexgrid/entities/tile_sand_2.go\"\n" - "" -} -embedded_components { - id: "tile_sand_3" - type: "factory" - data: "prototype: \"/example/assets/hexgrid/entities/tile_sand_3.go\"\n" - "" -} -embedded_components { - id: "tile_stone" - type: "factory" - data: "prototype: \"/example/assets/hexgrid/entities/tile_stone.go\"\n" - "" -} -embedded_components { - id: "tile_stone_2" - type: "factory" - data: "prototype: \"/example/assets/hexgrid/entities/tile_stone_2.go\"\n" - "" -} -embedded_components { - id: "tile_stone_3" - type: "factory" - data: "prototype: \"/example/assets/hexgrid/entities/tile_stone_3.go\"\n" - "" -} embedded_components { id: "r_tree_round" type: "factory" diff --git a/example/assets/hexgrid/entities/tile.go b/example/assets/hexgrid/entities/tile.go index eb2c2c1..8b9807f 100644 --- a/example/assets/hexgrid/entities/tile.go +++ b/example/assets/hexgrid/entities/tile.go @@ -1,3 +1,7 @@ +components { + id: "set_sprite" + component: "/example/assets/hexgrid/set_sprite.script" +} embedded_components { id: "sprite" type: "sprite" diff --git a/example/assets/hexgrid/set_sprite.script b/example/assets/hexgrid/set_sprite.script new file mode 100644 index 0000000..368e114 --- /dev/null +++ b/example/assets/hexgrid/set_sprite.script @@ -0,0 +1,11 @@ +go.property("sprite_url", hash("sprite")) +go.property("sprite_animation", hash("")) + +local HASH_EMPTY = hash("") + +function init(self) + if self.sprite_url ~= HASH_EMPTY then + local sprite_url = msg.url(nil, nil, self.sprite_url) + sprite.play_flipbook(sprite_url, self.sprite_animation) + end +end diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index 5d9b8c0..48c856f 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -15,7 +15,7 @@ local function spawn_entity(entity) local factory_url = "/entities#" .. prefab_id local position = vmath.vector3(position_x, position_y, position_z) local scale = vmath.vector3(scale_x, scale_y, 1) - factory.create(factory_url, position, nil, nil, scale) + factory.create(factory_url, position, nil, { sprite_animation = hash(entity.image) }, scale) end diff --git a/game.project b/game.project index 3f8210e..5350dbc 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example.collectionc +main_collection = /example/example_grid_game_objects/example_grid_game_objects.collectionc [script] shared_state = 1 diff --git a/tiled/maps/grid_game_objects.json b/tiled/maps/grid_game_objects.json index 9cb0170..d0d957d 100644 --- a/tiled/maps/grid_game_objects.json +++ b/tiled/maps/grid_game_objects.json @@ -7,12 +7,12 @@ 65, 65, 65, 66, 66, 66, 66, 66, 65, 66, 65, 66, 66, 65, 65, 66, 65, 65, 65, 65, 66, 65, 66, 65, 65, 65, 66, 65, 65, 66, 65, 66, 66, 66, 65, 65, 65, 66, 66, 66, 66, 66, 65, 65, 66, 65, 66, 66, 65, 65, 66, 66, 65, 66, 66, 65, 66, 65, 65, 66, 65, 65, 66, 66, 65, 65, 66, 66, 66, 66, 66, 65, 66, 66, 66, 65, 66, 65, 65, 66, 65, 66, 65, 66, 65, 65, 66, 66, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 65, 65, 66, 66, 65, 65, 65, 65, 66, 65, 66, 66, 65, 66, 66, 66, 66, 65, 66, 66, - 66, 66, 65, 66, 65, 65, 66, 66, 66, 65, 65, 66, 66, 65, 65, 66, 65, 65, 65, 65, 66, 66, 65, 66, 66, 65, 65, 66, 66, 65, - 65, 66, 66, 65, 66, 65, 155, 156, 157, 101, 102, 103, 65, 65, 66, 65, 65, 65, 66, 66, 66, 65, 65, 65, 66, 65, 66, 65, 65, 65, - 65, 66, 65, 65, 66, 65, 173, 174, 175, 119, 120, 121, 65, 66, 65, 65, 65, 66, 65, 66, 66, 66, 66, 65, 65, 65, 66, 65, 66, 66, - 65, 66, 66, 65, 66, 66, 191, 192, 193, 137, 138, 139, 65, 66, 65, 66, 66, 65, 65, 66, 66, 65, 65, 65, 66, 66, 65, 66, 66, 65, - 65, 65, 65, 65, 66, 66, 91, 92, 93, 96, 97, 98, 66, 66, 65, 65, 66, 65, 65, 66, 66, 66, 66, 66, 65, 65, 66, 65, 66, 66, + 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 65, 65, 66, 66, 65, 65, 96, 97, 97, 97, 98, 66, 65, 66, 66, 66, 66, 65, 66, 66, + 66, 66, 65, 66, 65, 65, 66, 66, 66, 65, 65, 66, 66, 65, 65, 66, 114, 115, 115, 115, 116, 66, 65, 66, 66, 65, 65, 66, 66, 65, + 65, 66, 66, 65, 66, 65, 155, 156, 157, 101, 102, 103, 65, 65, 66, 65, 114, 115, 115, 115, 116, 65, 65, 65, 66, 65, 66, 65, 65, 65, + 65, 66, 65, 65, 66, 65, 173, 174, 175, 119, 120, 121, 65, 66, 65, 65, 114, 115, 115, 115, 116, 66, 66, 65, 65, 65, 66, 65, 66, 66, + 65, 66, 66, 65, 66, 66, 191, 192, 193, 137, 138, 139, 65, 66, 65, 66, 132, 133, 133, 133, 134, 65, 65, 65, 66, 66, 65, 66, 66, 65, + 65, 65, 65, 65, 66, 66, 91, 92, 93, 96, 97, 98, 66, 66, 65, 65, 66, 115, 115, 115, 66, 66, 66, 66, 65, 65, 66, 65, 66, 66, 66, 66, 66, 66, 66, 66, 109, 110, 111, 114, 115, 116, 65, 65, 66, 65, 65, 66, 65, 66, 65, 65, 66, 65, 65, 66, 65, 65, 65, 66, 66, 66, 66, 65, 65, 65, 127, 128, 129, 132, 133, 134, 65, 65, 65, 66, 66, 66, 66, 65, 65, 66, 66, 66, 66, 65, 65, 65, 66, 66, 66, 65, 66, 65, 65, 66, 65, 65, 66, 66, 65, 65, 66, 66, 65, 65, 66, 65, 65, 66, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, @@ -43,15 +43,15 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 0, 0, 156, 174, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 156, 156, 156, 156, 156, 156, 174, 174, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 60, 156, 156, 156, 156, 156, 156, 174, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 174, 0, 0, 0, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 173, 174, 175, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, 174, 0, 0, 0, 0, 155, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 155, 156, 0, 173, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 174, 0, 173, 174, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 194, 176, 177, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 194, 176, 177, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "height":20, From f1b50db6ab1eb7f6f21ca8b306cefa11081ae972 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 23 Feb 2026 20:09:42 +0200 Subject: [PATCH 60/71] Add grid game objects example --- example/example.collection | 6 + example/example.gui_script | 1 + .../assets/entities.go | 48 + .../assets/grid_game_objects.atlas | 703 +++ .../assets/objects/tile.go | 15 + .../example_grid_game_objects.collection | 4 +- .../example_grid_game_objects.script | 6 +- game.project | 2 +- tiled/assets/grid_game_objects/tile_0000.png | Bin 0 -> 164 bytes tiled/assets/grid_game_objects/tile_0001.png | Bin 0 -> 178 bytes tiled/assets/grid_game_objects/tile_0002.png | Bin 0 -> 159 bytes tiled/assets/grid_game_objects/tile_0003.png | Bin 0 -> 139 bytes tiled/assets/grid_game_objects/tile_0004.png | Bin 0 -> 129 bytes tiled/assets/grid_game_objects/tile_0005.png | Bin 0 -> 164 bytes tiled/assets/grid_game_objects/tile_0006.png | Bin 0 -> 146 bytes tiled/assets/grid_game_objects/tile_0007.png | Bin 0 -> 160 bytes tiled/assets/grid_game_objects/tile_0008.png | Bin 0 -> 139 bytes tiled/assets/grid_game_objects/tile_0009.png | Bin 0 -> 129 bytes tiled/assets/grid_game_objects/tile_0010.png | Bin 0 -> 183 bytes tiled/assets/grid_game_objects/tile_0011.png | Bin 0 -> 146 bytes tiled/assets/grid_game_objects/tile_0012.png | Bin 0 -> 163 bytes tiled/assets/grid_game_objects/tile_0013.png | Bin 0 -> 113 bytes tiled/assets/grid_game_objects/tile_0014.png | Bin 0 -> 111 bytes tiled/assets/grid_game_objects/tile_0015.png | Bin 0 -> 152 bytes tiled/assets/grid_game_objects/tile_0016.png | Bin 0 -> 146 bytes tiled/assets/grid_game_objects/tile_0017.png | Bin 0 -> 151 bytes tiled/assets/grid_game_objects/tile_0018.png | Bin 0 -> 127 bytes tiled/assets/grid_game_objects/tile_0019.png | Bin 0 -> 133 bytes tiled/assets/grid_game_objects/tile_0020.png | Bin 0 -> 136 bytes tiled/assets/grid_game_objects/tile_0021.png | Bin 0 -> 136 bytes tiled/assets/grid_game_objects/tile_0022.png | Bin 0 -> 132 bytes tiled/assets/grid_game_objects/tile_0023.png | Bin 0 -> 128 bytes tiled/assets/grid_game_objects/tile_0024.png | Bin 0 -> 118 bytes tiled/assets/grid_game_objects/tile_0025.png | Bin 0 -> 121 bytes tiled/assets/grid_game_objects/tile_0026.png | Bin 0 -> 136 bytes tiled/assets/grid_game_objects/tile_0027.png | Bin 0 -> 132 bytes tiled/assets/grid_game_objects/tile_0028.png | Bin 0 -> 110 bytes tiled/assets/grid_game_objects/tile_0029.png | Bin 0 -> 99 bytes tiled/assets/grid_game_objects/tile_0030.png | Bin 0 -> 110 bytes tiled/assets/grid_game_objects/tile_0031.png | Bin 0 -> 116 bytes tiled/assets/grid_game_objects/tile_0032.png | Bin 0 -> 115 bytes tiled/assets/grid_game_objects/tile_0033.png | Bin 0 -> 110 bytes tiled/assets/grid_game_objects/tile_0034.png | Bin 0 -> 99 bytes tiled/assets/grid_game_objects/tile_0035.png | Bin 0 -> 110 bytes tiled/assets/grid_game_objects/tile_0036.png | Bin 0 -> 207 bytes tiled/assets/grid_game_objects/tile_0037.png | Bin 0 -> 178 bytes tiled/assets/grid_game_objects/tile_0038.png | Bin 0 -> 209 bytes tiled/assets/grid_game_objects/tile_0039.png | Bin 0 -> 191 bytes tiled/assets/grid_game_objects/tile_0040.png | Bin 0 -> 127 bytes tiled/assets/grid_game_objects/tile_0041.png | Bin 0 -> 207 bytes tiled/assets/grid_game_objects/tile_0042.png | Bin 0 -> 143 bytes tiled/assets/grid_game_objects/tile_0043.png | Bin 0 -> 202 bytes tiled/assets/grid_game_objects/tile_0044.png | Bin 0 -> 186 bytes tiled/assets/grid_game_objects/tile_0045.png | Bin 0 -> 127 bytes tiled/assets/grid_game_objects/tile_0046.png | Bin 0 -> 180 bytes tiled/assets/grid_game_objects/tile_0047.png | Bin 0 -> 145 bytes tiled/assets/grid_game_objects/tile_0048.png | Bin 0 -> 195 bytes tiled/assets/grid_game_objects/tile_0049.png | Bin 0 -> 194 bytes tiled/assets/grid_game_objects/tile_0050.png | Bin 0 -> 187 bytes tiled/assets/grid_game_objects/tile_0051.png | Bin 0 -> 151 bytes tiled/assets/grid_game_objects/tile_0052.png | Bin 0 -> 142 bytes tiled/assets/grid_game_objects/tile_0053.png | Bin 0 -> 150 bytes tiled/assets/grid_game_objects/tile_0054.png | Bin 0 -> 150 bytes tiled/assets/grid_game_objects/tile_0055.png | Bin 0 -> 129 bytes tiled/assets/grid_game_objects/tile_0056.png | Bin 0 -> 157 bytes tiled/assets/grid_game_objects/tile_0057.png | Bin 0 -> 176 bytes tiled/assets/grid_game_objects/tile_0058.png | Bin 0 -> 195 bytes tiled/assets/grid_game_objects/tile_0059.png | Bin 0 -> 173 bytes tiled/assets/grid_game_objects/tile_0060.png | Bin 0 -> 168 bytes tiled/assets/grid_game_objects/tile_0061.png | Bin 0 -> 168 bytes tiled/assets/grid_game_objects/tile_0062.png | Bin 0 -> 182 bytes tiled/assets/grid_game_objects/tile_0063.png | Bin 0 -> 190 bytes tiled/assets/grid_game_objects/tile_0064.png | Bin 0 -> 99 bytes tiled/assets/grid_game_objects/tile_0065.png | Bin 0 -> 131 bytes tiled/assets/grid_game_objects/tile_0066.png | Bin 0 -> 191 bytes tiled/assets/grid_game_objects/tile_0067.png | Bin 0 -> 139 bytes tiled/assets/grid_game_objects/tile_0068.png | Bin 0 -> 187 bytes tiled/assets/grid_game_objects/tile_0069.png | Bin 0 -> 129 bytes tiled/assets/grid_game_objects/tile_0070.png | Bin 0 -> 99 bytes tiled/assets/grid_game_objects/tile_0071.png | Bin 0 -> 128 bytes tiled/assets/grid_game_objects/tile_0072.png | Bin 0 -> 156 bytes tiled/assets/grid_game_objects/tile_0073.png | Bin 0 -> 126 bytes tiled/assets/grid_game_objects/tile_0074.png | Bin 0 -> 158 bytes tiled/assets/grid_game_objects/tile_0075.png | Bin 0 -> 207 bytes tiled/assets/grid_game_objects/tile_0076.png | Bin 0 -> 204 bytes tiled/assets/grid_game_objects/tile_0077.png | Bin 0 -> 178 bytes tiled/assets/grid_game_objects/tile_0078.png | Bin 0 -> 163 bytes tiled/assets/grid_game_objects/tile_0079.png | Bin 0 -> 158 bytes tiled/assets/grid_game_objects/tile_0080.png | Bin 0 -> 217 bytes tiled/assets/grid_game_objects/tile_0081.png | Bin 0 -> 177 bytes tiled/assets/grid_game_objects/tile_0082.png | Bin 0 -> 166 bytes tiled/assets/grid_game_objects/tile_0083.png | Bin 0 -> 178 bytes tiled/assets/grid_game_objects/tile_0084.png | Bin 0 -> 204 bytes tiled/assets/grid_game_objects/tile_0085.png | Bin 0 -> 176 bytes tiled/assets/grid_game_objects/tile_0086.png | Bin 0 -> 141 bytes tiled/assets/grid_game_objects/tile_0087.png | Bin 0 -> 137 bytes tiled/assets/grid_game_objects/tile_0088.png | Bin 0 -> 114 bytes tiled/assets/grid_game_objects/tile_0089.png | Bin 0 -> 136 bytes tiled/assets/grid_game_objects/tile_0090.png | Bin 0 -> 151 bytes tiled/assets/grid_game_objects/tile_0091.png | Bin 0 -> 145 bytes tiled/assets/grid_game_objects/tile_0092.png | Bin 0 -> 130 bytes tiled/assets/grid_game_objects/tile_0093.png | Bin 0 -> 129 bytes tiled/assets/grid_game_objects/tile_0094.png | Bin 0 -> 136 bytes tiled/assets/grid_game_objects/tile_0095.png | Bin 0 -> 152 bytes tiled/assets/grid_game_objects/tile_0096.png | Bin 0 -> 145 bytes tiled/assets/grid_game_objects/tile_0097.png | Bin 0 -> 130 bytes tiled/assets/grid_game_objects/tile_0098.png | Bin 0 -> 129 bytes tiled/assets/grid_game_objects/tile_0099.png | Bin 0 -> 136 bytes tiled/assets/grid_game_objects/tile_0100.png | Bin 0 -> 172 bytes tiled/assets/grid_game_objects/tile_0101.png | Bin 0 -> 130 bytes tiled/assets/grid_game_objects/tile_0102.png | Bin 0 -> 166 bytes tiled/assets/grid_game_objects/tile_0103.png | Bin 0 -> 134 bytes tiled/assets/grid_game_objects/tile_0104.png | Bin 0 -> 132 bytes tiled/assets/grid_game_objects/tile_0105.png | Bin 0 -> 181 bytes tiled/assets/grid_game_objects/tile_0106.png | Bin 0 -> 197 bytes tiled/assets/grid_game_objects/tile_0107.png | Bin 0 -> 180 bytes tiled/assets/grid_game_objects/tile_0108.png | Bin 0 -> 141 bytes tiled/assets/grid_game_objects/tile_0109.png | Bin 0 -> 99 bytes tiled/assets/grid_game_objects/tile_0110.png | Bin 0 -> 140 bytes tiled/assets/grid_game_objects/tile_0111.png | Bin 0 -> 137 bytes tiled/assets/grid_game_objects/tile_0112.png | Bin 0 -> 139 bytes tiled/assets/grid_game_objects/tile_0113.png | Bin 0 -> 141 bytes tiled/assets/grid_game_objects/tile_0114.png | Bin 0 -> 99 bytes tiled/assets/grid_game_objects/tile_0115.png | Bin 0 -> 140 bytes tiled/assets/grid_game_objects/tile_0116.png | Bin 0 -> 137 bytes tiled/assets/grid_game_objects/tile_0117.png | Bin 0 -> 139 bytes tiled/assets/grid_game_objects/tile_0118.png | Bin 0 -> 118 bytes tiled/assets/grid_game_objects/tile_0119.png | Bin 0 -> 99 bytes tiled/assets/grid_game_objects/tile_0120.png | Bin 0 -> 118 bytes tiled/assets/grid_game_objects/tile_0121.png | Bin 0 -> 140 bytes tiled/assets/grid_game_objects/tile_0122.png | Bin 0 -> 135 bytes tiled/assets/grid_game_objects/tile_0123.png | Bin 0 -> 147 bytes tiled/assets/grid_game_objects/tile_0124.png | Bin 0 -> 173 bytes tiled/assets/grid_game_objects/tile_0125.png | Bin 0 -> 147 bytes tiled/assets/grid_game_objects/tile_0126.png | Bin 0 -> 144 bytes tiled/assets/grid_game_objects/tile_0127.png | Bin 0 -> 136 bytes tiled/assets/grid_game_objects/tile_0128.png | Bin 0 -> 137 bytes tiled/assets/grid_game_objects/tile_0129.png | Bin 0 -> 159 bytes tiled/assets/grid_game_objects/tile_0130.png | Bin 0 -> 164 bytes tiled/assets/grid_game_objects/tile_0131.png | Bin 0 -> 144 bytes tiled/assets/grid_game_objects/tile_0132.png | Bin 0 -> 136 bytes tiled/assets/grid_game_objects/tile_0133.png | Bin 0 -> 136 bytes tiled/assets/grid_game_objects/tile_0134.png | Bin 0 -> 159 bytes tiled/assets/grid_game_objects/tile_0135.png | Bin 0 -> 164 bytes tiled/assets/grid_game_objects/tile_0136.png | Bin 0 -> 175 bytes tiled/assets/grid_game_objects/tile_0137.png | Bin 0 -> 129 bytes tiled/assets/grid_game_objects/tile_0138.png | Bin 0 -> 167 bytes tiled/assets/grid_game_objects/tile_0139.png | Bin 0 -> 117 bytes tiled/assets/grid_game_objects/tile_0140.png | Bin 0 -> 99 bytes tiled/assets/grid_game_objects/tile_0141.png | Bin 0 -> 176 bytes tiled/assets/grid_game_objects/tile_0142.png | Bin 0 -> 154 bytes tiled/assets/grid_game_objects/tile_0143.png | Bin 0 -> 179 bytes tiled/assets/grid_game_objects/tile_0144.png | Bin 0 -> 174 bytes tiled/assets/grid_game_objects/tile_0145.png | Bin 0 -> 158 bytes tiled/assets/grid_game_objects/tile_0146.png | Bin 0 -> 160 bytes tiled/assets/grid_game_objects/tile_0147.png | Bin 0 -> 185 bytes tiled/assets/grid_game_objects/tile_0148.png | Bin 0 -> 168 bytes tiled/assets/grid_game_objects/tile_0149.png | Bin 0 -> 170 bytes tiled/assets/grid_game_objects/tile_0150.png | Bin 0 -> 160 bytes tiled/assets/grid_game_objects/tile_0151.png | Bin 0 -> 157 bytes tiled/assets/grid_game_objects/tile_0152.png | Bin 0 -> 195 bytes tiled/assets/grid_game_objects/tile_0153.png | Bin 0 -> 194 bytes tiled/assets/grid_game_objects/tile_0154.png | Bin 0 -> 147 bytes tiled/assets/grid_game_objects/tile_0155.png | Bin 0 -> 123 bytes tiled/assets/grid_game_objects/tile_0156.png | Bin 0 -> 139 bytes tiled/assets/grid_game_objects/tile_0157.png | Bin 0 -> 123 bytes tiled/assets/grid_game_objects/tile_0158.png | Bin 0 -> 120 bytes tiled/assets/grid_game_objects/tile_0159.png | Bin 0 -> 183 bytes tiled/assets/grid_game_objects/tile_0160.png | Bin 0 -> 175 bytes tiled/assets/grid_game_objects/tile_0161.png | Bin 0 -> 178 bytes tiled/assets/grid_game_objects/tile_0162.png | Bin 0 -> 177 bytes tiled/assets/grid_game_objects/tile_0163.png | Bin 0 -> 171 bytes tiled/assets/grid_game_objects/tile_0164.png | Bin 0 -> 171 bytes tiled/assets/grid_game_objects/tile_0165.png | Bin 0 -> 184 bytes tiled/assets/grid_game_objects/tile_0166.png | Bin 0 -> 180 bytes tiled/assets/grid_game_objects/tile_0167.png | Bin 0 -> 180 bytes tiled/assets/grid_game_objects/tile_0168.png | Bin 0 -> 164 bytes tiled/assets/grid_game_objects/tile_0169.png | Bin 0 -> 166 bytes tiled/assets/grid_game_objects/tile_0170.png | Bin 0 -> 140 bytes tiled/assets/grid_game_objects/tile_0171.png | Bin 0 -> 140 bytes tiled/assets/grid_game_objects/tile_0172.png | Bin 0 -> 117 bytes tiled/assets/grid_game_objects/tile_0173.png | Bin 0 -> 99 bytes tiled/assets/grid_game_objects/tile_0174.png | Bin 0 -> 126 bytes tiled/assets/grid_game_objects/tile_0175.png | Bin 0 -> 126 bytes tiled/assets/grid_game_objects/tile_0176.png | Bin 0 -> 128 bytes tiled/assets/grid_game_objects/tile_0177.png | Bin 0 -> 179 bytes tiled/assets/grid_game_objects/tile_0178.png | Bin 0 -> 193 bytes tiled/assets/grid_game_objects/tile_0179.png | Bin 0 -> 182 bytes tiled/assets/grid_game_objects/tile_0180.png | Bin 0 -> 131 bytes tiled/assets/grid_game_objects/tile_0181.png | Bin 0 -> 161 bytes tiled/assets/grid_game_objects/tile_0182.png | Bin 0 -> 162 bytes tiled/assets/grid_game_objects/tile_0183.png | Bin 0 -> 131 bytes tiled/assets/grid_game_objects/tile_0184.png | Bin 0 -> 171 bytes tiled/assets/grid_game_objects/tile_0185.png | Bin 0 -> 173 bytes tiled/assets/grid_game_objects/tile_0186.png | Bin 0 -> 151 bytes tiled/assets/grid_game_objects/tile_0187.png | Bin 0 -> 151 bytes tiled/assets/grid_game_objects/tile_0188.png | Bin 0 -> 209 bytes tiled/assets/grid_game_objects/tile_0189.png | Bin 0 -> 207 bytes tiled/assets/grid_game_objects/tile_0190.png | Bin 0 -> 135 bytes tiled/assets/grid_game_objects/tile_0191.png | Bin 0 -> 109 bytes tiled/assets/grid_game_objects/tile_0192.png | Bin 0 -> 140 bytes tiled/assets/grid_game_objects/tile_0193.png | Bin 0 -> 159 bytes tiled/assets/grid_game_objects/tile_0194.png | Bin 0 -> 135 bytes tiled/assets/grid_game_objects/tile_0195.png | Bin 0 -> 141 bytes tiled/assets/grid_game_objects/tile_0196.png | Bin 0 -> 176 bytes tiled/assets/grid_game_objects/tile_0197.png | Bin 0 -> 141 bytes tiled/assets/grid_game_objects/tile_0198.png | Bin 0 -> 166 bytes tiled/assets/grid_game_objects/tile_0199.png | Bin 0 -> 125 bytes tiled/assets/grid_game_objects/tile_0200.png | Bin 0 -> 118 bytes tiled/assets/grid_game_objects/tile_0201.png | Bin 0 -> 179 bytes tiled/assets/grid_game_objects/tile_0202.png | Bin 0 -> 189 bytes tiled/assets/grid_game_objects/tile_0203.png | Bin 0 -> 198 bytes tiled/assets/grid_game_objects/tile_0204.png | Bin 0 -> 127 bytes tiled/assets/grid_game_objects/tile_0205.png | Bin 0 -> 127 bytes tiled/assets/grid_game_objects/tile_0206.png | Bin 0 -> 179 bytes tiled/assets/grid_game_objects/tile_0207.png | Bin 0 -> 179 bytes tiled/assets/grid_game_objects/tile_0208.png | Bin 0 -> 178 bytes tiled/assets/grid_game_objects/tile_0209.png | Bin 0 -> 173 bytes tiled/assets/grid_game_objects/tile_0210.png | Bin 0 -> 128 bytes tiled/assets/grid_game_objects/tile_0211.png | Bin 0 -> 164 bytes tiled/assets/grid_game_objects/tile_0212.png | Bin 0 -> 156 bytes tiled/assets/grid_game_objects/tile_0213.png | Bin 0 -> 171 bytes tiled/assets/grid_game_objects/tile_0214.png | Bin 0 -> 151 bytes tiled/assets/grid_game_objects/tile_0215.png | Bin 0 -> 178 bytes tiled/assets/grid_game_objects/tile_0216.png | Bin 0 -> 182 bytes tiled/assets/grid_game_objects/tile_0217.png | Bin 0 -> 193 bytes tiled/assets/grid_game_objects/tile_0218.png | Bin 0 -> 184 bytes tiled/assets/grid_game_objects/tile_0219.png | Bin 0 -> 196 bytes tiled/assets/grid_game_objects/tile_0220.png | Bin 0 -> 182 bytes tiled/assets/grid_game_objects/tile_0221.png | Bin 0 -> 189 bytes tiled/assets/grid_game_objects/tile_0222.png | Bin 0 -> 198 bytes tiled/assets/grid_game_objects/tile_0223.png | Bin 0 -> 165 bytes tiled/assets/grid_game_objects/tile_0224.png | Bin 0 -> 174 bytes tiled/assets/grid_game_objects/tile_0225.png | Bin 0 -> 151 bytes tiled/assets/grid_game_objects/tile_0226.png | Bin 0 -> 145 bytes tiled/assets/grid_game_objects/tile_0227.png | Bin 0 -> 159 bytes tiled/assets/grid_game_objects/tile_0228.png | Bin 0 -> 160 bytes tiled/assets/grid_game_objects/tile_0229.png | Bin 0 -> 169 bytes tiled/assets/grid_game_objects/tile_0230.png | Bin 0 -> 180 bytes tiled/assets/grid_game_objects/tile_0231.png | Bin 0 -> 179 bytes tiled/assets/grid_game_objects/tile_0232.png | Bin 0 -> 177 bytes tiled/assets/grid_game_objects/tile_0233.png | Bin 0 -> 170 bytes tiled/export/grid-grid_items.tilemap | 40 +- tiled/export/grid-grid_tileset.tilemap | 5215 +++++------------ tiled/maps/grid_game_objects.json | 92 +- tiled/tilesets/grid_game_objects.json | 1656 ++++++ 246 files changed, 4085 insertions(+), 3703 deletions(-) create mode 100644 example/example_grid_game_objects/assets/entities.go create mode 100644 example/example_grid_game_objects/assets/grid_game_objects.atlas create mode 100644 example/example_grid_game_objects/assets/objects/tile.go create mode 100644 tiled/assets/grid_game_objects/tile_0000.png create mode 100644 tiled/assets/grid_game_objects/tile_0001.png create mode 100644 tiled/assets/grid_game_objects/tile_0002.png create mode 100644 tiled/assets/grid_game_objects/tile_0003.png create mode 100644 tiled/assets/grid_game_objects/tile_0004.png create mode 100644 tiled/assets/grid_game_objects/tile_0005.png create mode 100644 tiled/assets/grid_game_objects/tile_0006.png create mode 100644 tiled/assets/grid_game_objects/tile_0007.png create mode 100644 tiled/assets/grid_game_objects/tile_0008.png create mode 100644 tiled/assets/grid_game_objects/tile_0009.png create mode 100644 tiled/assets/grid_game_objects/tile_0010.png create mode 100644 tiled/assets/grid_game_objects/tile_0011.png create mode 100644 tiled/assets/grid_game_objects/tile_0012.png create mode 100644 tiled/assets/grid_game_objects/tile_0013.png create mode 100644 tiled/assets/grid_game_objects/tile_0014.png create mode 100644 tiled/assets/grid_game_objects/tile_0015.png create mode 100644 tiled/assets/grid_game_objects/tile_0016.png create mode 100644 tiled/assets/grid_game_objects/tile_0017.png create mode 100644 tiled/assets/grid_game_objects/tile_0018.png create mode 100644 tiled/assets/grid_game_objects/tile_0019.png create mode 100644 tiled/assets/grid_game_objects/tile_0020.png create mode 100644 tiled/assets/grid_game_objects/tile_0021.png create mode 100644 tiled/assets/grid_game_objects/tile_0022.png create mode 100644 tiled/assets/grid_game_objects/tile_0023.png create mode 100644 tiled/assets/grid_game_objects/tile_0024.png create mode 100644 tiled/assets/grid_game_objects/tile_0025.png create mode 100644 tiled/assets/grid_game_objects/tile_0026.png create mode 100644 tiled/assets/grid_game_objects/tile_0027.png create mode 100644 tiled/assets/grid_game_objects/tile_0028.png create mode 100644 tiled/assets/grid_game_objects/tile_0029.png create mode 100644 tiled/assets/grid_game_objects/tile_0030.png create mode 100644 tiled/assets/grid_game_objects/tile_0031.png create mode 100644 tiled/assets/grid_game_objects/tile_0032.png create mode 100644 tiled/assets/grid_game_objects/tile_0033.png create mode 100644 tiled/assets/grid_game_objects/tile_0034.png create mode 100644 tiled/assets/grid_game_objects/tile_0035.png create mode 100644 tiled/assets/grid_game_objects/tile_0036.png create mode 100644 tiled/assets/grid_game_objects/tile_0037.png create mode 100644 tiled/assets/grid_game_objects/tile_0038.png create mode 100644 tiled/assets/grid_game_objects/tile_0039.png create mode 100644 tiled/assets/grid_game_objects/tile_0040.png create mode 100644 tiled/assets/grid_game_objects/tile_0041.png create mode 100644 tiled/assets/grid_game_objects/tile_0042.png create mode 100644 tiled/assets/grid_game_objects/tile_0043.png create mode 100644 tiled/assets/grid_game_objects/tile_0044.png create mode 100644 tiled/assets/grid_game_objects/tile_0045.png create mode 100644 tiled/assets/grid_game_objects/tile_0046.png create mode 100644 tiled/assets/grid_game_objects/tile_0047.png create mode 100644 tiled/assets/grid_game_objects/tile_0048.png create mode 100644 tiled/assets/grid_game_objects/tile_0049.png create mode 100644 tiled/assets/grid_game_objects/tile_0050.png create mode 100644 tiled/assets/grid_game_objects/tile_0051.png create mode 100644 tiled/assets/grid_game_objects/tile_0052.png create mode 100644 tiled/assets/grid_game_objects/tile_0053.png create mode 100644 tiled/assets/grid_game_objects/tile_0054.png create mode 100644 tiled/assets/grid_game_objects/tile_0055.png create mode 100644 tiled/assets/grid_game_objects/tile_0056.png create mode 100644 tiled/assets/grid_game_objects/tile_0057.png create mode 100644 tiled/assets/grid_game_objects/tile_0058.png create mode 100644 tiled/assets/grid_game_objects/tile_0059.png create mode 100644 tiled/assets/grid_game_objects/tile_0060.png create mode 100644 tiled/assets/grid_game_objects/tile_0061.png create mode 100644 tiled/assets/grid_game_objects/tile_0062.png create mode 100644 tiled/assets/grid_game_objects/tile_0063.png create mode 100644 tiled/assets/grid_game_objects/tile_0064.png create mode 100644 tiled/assets/grid_game_objects/tile_0065.png create mode 100644 tiled/assets/grid_game_objects/tile_0066.png create mode 100644 tiled/assets/grid_game_objects/tile_0067.png create mode 100644 tiled/assets/grid_game_objects/tile_0068.png create mode 100644 tiled/assets/grid_game_objects/tile_0069.png create mode 100644 tiled/assets/grid_game_objects/tile_0070.png create mode 100644 tiled/assets/grid_game_objects/tile_0071.png create mode 100644 tiled/assets/grid_game_objects/tile_0072.png create mode 100644 tiled/assets/grid_game_objects/tile_0073.png create mode 100644 tiled/assets/grid_game_objects/tile_0074.png create mode 100644 tiled/assets/grid_game_objects/tile_0075.png create mode 100644 tiled/assets/grid_game_objects/tile_0076.png create mode 100644 tiled/assets/grid_game_objects/tile_0077.png create mode 100644 tiled/assets/grid_game_objects/tile_0078.png create mode 100644 tiled/assets/grid_game_objects/tile_0079.png create mode 100644 tiled/assets/grid_game_objects/tile_0080.png create mode 100644 tiled/assets/grid_game_objects/tile_0081.png create mode 100644 tiled/assets/grid_game_objects/tile_0082.png create mode 100644 tiled/assets/grid_game_objects/tile_0083.png create mode 100644 tiled/assets/grid_game_objects/tile_0084.png create mode 100644 tiled/assets/grid_game_objects/tile_0085.png create mode 100644 tiled/assets/grid_game_objects/tile_0086.png create mode 100644 tiled/assets/grid_game_objects/tile_0087.png create mode 100644 tiled/assets/grid_game_objects/tile_0088.png create mode 100644 tiled/assets/grid_game_objects/tile_0089.png create mode 100644 tiled/assets/grid_game_objects/tile_0090.png create mode 100644 tiled/assets/grid_game_objects/tile_0091.png create mode 100644 tiled/assets/grid_game_objects/tile_0092.png create mode 100644 tiled/assets/grid_game_objects/tile_0093.png create mode 100644 tiled/assets/grid_game_objects/tile_0094.png create mode 100644 tiled/assets/grid_game_objects/tile_0095.png create mode 100644 tiled/assets/grid_game_objects/tile_0096.png create mode 100644 tiled/assets/grid_game_objects/tile_0097.png create mode 100644 tiled/assets/grid_game_objects/tile_0098.png create mode 100644 tiled/assets/grid_game_objects/tile_0099.png create mode 100644 tiled/assets/grid_game_objects/tile_0100.png create mode 100644 tiled/assets/grid_game_objects/tile_0101.png create mode 100644 tiled/assets/grid_game_objects/tile_0102.png create mode 100644 tiled/assets/grid_game_objects/tile_0103.png create mode 100644 tiled/assets/grid_game_objects/tile_0104.png create mode 100644 tiled/assets/grid_game_objects/tile_0105.png create mode 100644 tiled/assets/grid_game_objects/tile_0106.png create mode 100644 tiled/assets/grid_game_objects/tile_0107.png create mode 100644 tiled/assets/grid_game_objects/tile_0108.png create mode 100644 tiled/assets/grid_game_objects/tile_0109.png create mode 100644 tiled/assets/grid_game_objects/tile_0110.png create mode 100644 tiled/assets/grid_game_objects/tile_0111.png create mode 100644 tiled/assets/grid_game_objects/tile_0112.png create mode 100644 tiled/assets/grid_game_objects/tile_0113.png create mode 100644 tiled/assets/grid_game_objects/tile_0114.png create mode 100644 tiled/assets/grid_game_objects/tile_0115.png create mode 100644 tiled/assets/grid_game_objects/tile_0116.png create mode 100644 tiled/assets/grid_game_objects/tile_0117.png create mode 100644 tiled/assets/grid_game_objects/tile_0118.png create mode 100644 tiled/assets/grid_game_objects/tile_0119.png create mode 100644 tiled/assets/grid_game_objects/tile_0120.png create mode 100644 tiled/assets/grid_game_objects/tile_0121.png create mode 100644 tiled/assets/grid_game_objects/tile_0122.png create mode 100644 tiled/assets/grid_game_objects/tile_0123.png create mode 100644 tiled/assets/grid_game_objects/tile_0124.png create mode 100644 tiled/assets/grid_game_objects/tile_0125.png create mode 100644 tiled/assets/grid_game_objects/tile_0126.png create mode 100644 tiled/assets/grid_game_objects/tile_0127.png create mode 100644 tiled/assets/grid_game_objects/tile_0128.png create mode 100644 tiled/assets/grid_game_objects/tile_0129.png create mode 100644 tiled/assets/grid_game_objects/tile_0130.png create mode 100644 tiled/assets/grid_game_objects/tile_0131.png create mode 100644 tiled/assets/grid_game_objects/tile_0132.png create mode 100644 tiled/assets/grid_game_objects/tile_0133.png create mode 100644 tiled/assets/grid_game_objects/tile_0134.png create mode 100644 tiled/assets/grid_game_objects/tile_0135.png create mode 100644 tiled/assets/grid_game_objects/tile_0136.png create mode 100644 tiled/assets/grid_game_objects/tile_0137.png create mode 100644 tiled/assets/grid_game_objects/tile_0138.png create mode 100644 tiled/assets/grid_game_objects/tile_0139.png create mode 100644 tiled/assets/grid_game_objects/tile_0140.png create mode 100644 tiled/assets/grid_game_objects/tile_0141.png create mode 100644 tiled/assets/grid_game_objects/tile_0142.png create mode 100644 tiled/assets/grid_game_objects/tile_0143.png create mode 100644 tiled/assets/grid_game_objects/tile_0144.png create mode 100644 tiled/assets/grid_game_objects/tile_0145.png create mode 100644 tiled/assets/grid_game_objects/tile_0146.png create mode 100644 tiled/assets/grid_game_objects/tile_0147.png create mode 100644 tiled/assets/grid_game_objects/tile_0148.png create mode 100644 tiled/assets/grid_game_objects/tile_0149.png create mode 100644 tiled/assets/grid_game_objects/tile_0150.png create mode 100644 tiled/assets/grid_game_objects/tile_0151.png create mode 100644 tiled/assets/grid_game_objects/tile_0152.png create mode 100644 tiled/assets/grid_game_objects/tile_0153.png create mode 100644 tiled/assets/grid_game_objects/tile_0154.png create mode 100644 tiled/assets/grid_game_objects/tile_0155.png create mode 100644 tiled/assets/grid_game_objects/tile_0156.png create mode 100644 tiled/assets/grid_game_objects/tile_0157.png create mode 100644 tiled/assets/grid_game_objects/tile_0158.png create mode 100644 tiled/assets/grid_game_objects/tile_0159.png create mode 100644 tiled/assets/grid_game_objects/tile_0160.png create mode 100644 tiled/assets/grid_game_objects/tile_0161.png create mode 100644 tiled/assets/grid_game_objects/tile_0162.png create mode 100644 tiled/assets/grid_game_objects/tile_0163.png create mode 100644 tiled/assets/grid_game_objects/tile_0164.png create mode 100644 tiled/assets/grid_game_objects/tile_0165.png create mode 100644 tiled/assets/grid_game_objects/tile_0166.png create mode 100644 tiled/assets/grid_game_objects/tile_0167.png create mode 100644 tiled/assets/grid_game_objects/tile_0168.png create mode 100644 tiled/assets/grid_game_objects/tile_0169.png create mode 100644 tiled/assets/grid_game_objects/tile_0170.png create mode 100644 tiled/assets/grid_game_objects/tile_0171.png create mode 100644 tiled/assets/grid_game_objects/tile_0172.png create mode 100644 tiled/assets/grid_game_objects/tile_0173.png create mode 100644 tiled/assets/grid_game_objects/tile_0174.png create mode 100644 tiled/assets/grid_game_objects/tile_0175.png create mode 100644 tiled/assets/grid_game_objects/tile_0176.png create mode 100644 tiled/assets/grid_game_objects/tile_0177.png create mode 100644 tiled/assets/grid_game_objects/tile_0178.png create mode 100644 tiled/assets/grid_game_objects/tile_0179.png create mode 100644 tiled/assets/grid_game_objects/tile_0180.png create mode 100644 tiled/assets/grid_game_objects/tile_0181.png create mode 100644 tiled/assets/grid_game_objects/tile_0182.png create mode 100644 tiled/assets/grid_game_objects/tile_0183.png create mode 100644 tiled/assets/grid_game_objects/tile_0184.png create mode 100644 tiled/assets/grid_game_objects/tile_0185.png create mode 100644 tiled/assets/grid_game_objects/tile_0186.png create mode 100644 tiled/assets/grid_game_objects/tile_0187.png create mode 100644 tiled/assets/grid_game_objects/tile_0188.png create mode 100644 tiled/assets/grid_game_objects/tile_0189.png create mode 100644 tiled/assets/grid_game_objects/tile_0190.png create mode 100644 tiled/assets/grid_game_objects/tile_0191.png create mode 100644 tiled/assets/grid_game_objects/tile_0192.png create mode 100644 tiled/assets/grid_game_objects/tile_0193.png create mode 100644 tiled/assets/grid_game_objects/tile_0194.png create mode 100644 tiled/assets/grid_game_objects/tile_0195.png create mode 100644 tiled/assets/grid_game_objects/tile_0196.png create mode 100644 tiled/assets/grid_game_objects/tile_0197.png create mode 100644 tiled/assets/grid_game_objects/tile_0198.png create mode 100644 tiled/assets/grid_game_objects/tile_0199.png create mode 100644 tiled/assets/grid_game_objects/tile_0200.png create mode 100644 tiled/assets/grid_game_objects/tile_0201.png create mode 100644 tiled/assets/grid_game_objects/tile_0202.png create mode 100644 tiled/assets/grid_game_objects/tile_0203.png create mode 100644 tiled/assets/grid_game_objects/tile_0204.png create mode 100644 tiled/assets/grid_game_objects/tile_0205.png create mode 100644 tiled/assets/grid_game_objects/tile_0206.png create mode 100644 tiled/assets/grid_game_objects/tile_0207.png create mode 100644 tiled/assets/grid_game_objects/tile_0208.png create mode 100644 tiled/assets/grid_game_objects/tile_0209.png create mode 100644 tiled/assets/grid_game_objects/tile_0210.png create mode 100644 tiled/assets/grid_game_objects/tile_0211.png create mode 100644 tiled/assets/grid_game_objects/tile_0212.png create mode 100644 tiled/assets/grid_game_objects/tile_0213.png create mode 100644 tiled/assets/grid_game_objects/tile_0214.png create mode 100644 tiled/assets/grid_game_objects/tile_0215.png create mode 100644 tiled/assets/grid_game_objects/tile_0216.png create mode 100644 tiled/assets/grid_game_objects/tile_0217.png create mode 100644 tiled/assets/grid_game_objects/tile_0218.png create mode 100644 tiled/assets/grid_game_objects/tile_0219.png create mode 100644 tiled/assets/grid_game_objects/tile_0220.png create mode 100644 tiled/assets/grid_game_objects/tile_0221.png create mode 100644 tiled/assets/grid_game_objects/tile_0222.png create mode 100644 tiled/assets/grid_game_objects/tile_0223.png create mode 100644 tiled/assets/grid_game_objects/tile_0224.png create mode 100644 tiled/assets/grid_game_objects/tile_0225.png create mode 100644 tiled/assets/grid_game_objects/tile_0226.png create mode 100644 tiled/assets/grid_game_objects/tile_0227.png create mode 100644 tiled/assets/grid_game_objects/tile_0228.png create mode 100644 tiled/assets/grid_game_objects/tile_0229.png create mode 100644 tiled/assets/grid_game_objects/tile_0230.png create mode 100644 tiled/assets/grid_game_objects/tile_0231.png create mode 100644 tiled/assets/grid_game_objects/tile_0232.png create mode 100644 tiled/assets/grid_game_objects/tile_0233.png create mode 100644 tiled/tilesets/grid_game_objects.json diff --git a/example/example.collection b/example/example.collection index 8c6a047..f8240b8 100644 --- a/example/example.collection +++ b/example/example.collection @@ -36,5 +36,11 @@ embedded_instances { " data: \"collection: \\\"/example/example_hexgrid_pointy/example_hexgrid_pointy.collection\\\"\\n" "\"\n" "}\n" + "embedded_components {\n" + " id: \"grid_game_objects\"\n" + " type: \"collectionproxy\"\n" + " data: \"collection: \\\"/example/example_grid_game_objects/example_grid_game_objects.collection\\\"\\n" + "\"\n" + "}\n" "" } diff --git a/example/example.gui_script b/example/example.gui_script index 5e0a892..80f8ad5 100644 --- a/example/example.gui_script +++ b/example/example.gui_script @@ -24,6 +24,7 @@ function init(self) self.properties_panel:add_left_right_selector(function(selector) selector:set_array_type({ "grid", + "grid_game_objects", "hex", "hex_pointy", "iso", diff --git a/example/example_grid_game_objects/assets/entities.go b/example/example_grid_game_objects/assets/entities.go new file mode 100644 index 0000000..c2bb279 --- /dev/null +++ b/example/example_grid_game_objects/assets/entities.go @@ -0,0 +1,48 @@ +embedded_components { + id: "cactus" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/cactus.go\"\n" + "" +} +embedded_components { + id: "icon_barrel" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/icon_barrel.go\"\n" + "" +} +embedded_components { + id: "icon_chest" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/icon_chest.go\"\n" + "" +} +embedded_components { + id: "icon_key" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/icon_key.go\"\n" + "" +} +embedded_components { + id: "icon_stop" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/icon_stop.go\"\n" + "" +} +embedded_components { + id: "icon_table" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/icon_table.go\"\n" + "" +} +embedded_components { + id: "tree" + type: "factory" + data: "prototype: \"/example/assets/grid/entities/tree.go\"\n" + "" +} +embedded_components { + id: "tile" + type: "factory" + data: "prototype: \"/example/example_grid_game_objects/assets/objects/tile.go\"\n" + "" +} diff --git a/example/example_grid_game_objects/assets/grid_game_objects.atlas b/example/example_grid_game_objects/assets/grid_game_objects.atlas new file mode 100644 index 0000000..d045124 --- /dev/null +++ b/example/example_grid_game_objects/assets/grid_game_objects.atlas @@ -0,0 +1,703 @@ +images { + image: "/tiled/assets/grid_game_objects/tile_0000.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0001.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0002.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0003.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0004.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0005.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0006.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0007.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0008.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0009.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0010.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0011.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0012.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0013.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0014.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0015.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0016.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0017.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0018.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0019.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0020.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0021.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0022.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0023.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0024.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0025.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0026.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0027.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0028.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0029.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0030.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0031.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0032.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0033.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0034.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0035.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0036.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0037.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0038.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0039.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0040.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0041.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0042.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0043.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0044.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0045.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0046.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0047.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0048.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0049.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0050.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0051.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0052.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0053.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0054.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0055.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0056.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0057.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0058.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0059.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0060.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0061.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0062.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0063.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0064.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0065.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0066.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0067.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0068.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0069.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0070.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0071.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0072.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0073.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0074.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0075.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0076.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0077.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0078.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0079.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0080.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0081.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0082.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0083.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0084.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0085.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0086.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0087.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0088.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0089.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0090.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0091.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0092.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0093.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0094.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0095.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0096.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0097.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0098.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0099.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0100.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0101.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0102.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0103.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0104.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0105.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0106.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0107.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0108.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0109.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0110.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0111.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0112.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0113.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0114.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0115.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0116.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0117.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0118.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0119.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0120.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0121.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0122.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0123.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0124.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0125.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0126.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0127.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0128.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0129.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0130.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0131.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0132.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0133.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0134.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0135.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0136.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0137.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0138.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0139.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0140.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0141.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0142.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0143.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0144.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0145.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0146.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0147.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0148.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0149.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0150.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0151.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0152.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0153.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0154.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0155.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0156.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0157.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0158.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0159.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0160.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0161.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0162.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0163.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0164.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0165.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0166.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0167.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0168.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0169.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0170.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0171.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0172.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0173.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0174.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0175.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0176.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0177.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0178.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0179.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0180.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0181.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0182.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0183.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0184.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0185.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0186.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0187.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0188.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0189.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0190.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0191.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0192.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0193.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0194.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0195.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0196.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0197.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0198.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0199.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0200.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0201.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0202.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0203.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0204.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0205.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0206.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0207.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0208.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0209.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0210.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0211.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0212.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0213.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0214.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0215.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0216.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0217.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0218.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0219.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0220.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0221.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0222.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0223.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0224.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0225.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0226.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0227.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0228.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0229.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0230.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0231.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0232.png" +} +images { + image: "/tiled/assets/grid_game_objects/tile_0233.png" +} +extrude_borders: 2 diff --git a/example/example_grid_game_objects/assets/objects/tile.go b/example/example_grid_game_objects/assets/objects/tile.go new file mode 100644 index 0000000..97e688c --- /dev/null +++ b/example/example_grid_game_objects/assets/objects/tile.go @@ -0,0 +1,15 @@ +components { + id: "set_sprite" + component: "/example/assets/hexgrid/set_sprite.script" +} +embedded_components { + id: "sprite" + type: "sprite" + data: "default_animation: \"tile_0000\"\n" + "material: \"/builtins/materials/sprite.material\"\n" + "textures {\n" + " sampler: \"texture_sampler\"\n" + " texture: \"/example/example_grid_game_objects/assets/grid_game_objects.atlas\"\n" + "}\n" + "" +} diff --git a/example/example_grid_game_objects/example_grid_game_objects.collection b/example/example_grid_game_objects/example_grid_game_objects.collection index b02fbb5..eb270ca 100644 --- a/example/example_grid_game_objects/example_grid_game_objects.collection +++ b/example/example_grid_game_objects/example_grid_game_objects.collection @@ -1,7 +1,7 @@ -name: "example_grid" +name: "example_grid_game_objects" instances { id: "entities" - prototype: "/example/assets/grid/entities.go" + prototype: "/example/example_grid_game_objects/assets/entities.go" } scale_along_z: 0 embedded_instances { diff --git a/example/example_grid_game_objects/example_grid_game_objects.script b/example/example_grid_game_objects/example_grid_game_objects.script index 383618c..687450e 100644 --- a/example/example_grid_game_objects/example_grid_game_objects.script +++ b/example/example_grid_game_objects/example_grid_game_objects.script @@ -13,7 +13,9 @@ local function spawn_entity(entity) local position = vmath.vector3(position_x, position_y, position_z) local scale = vmath.vector3(scale_x, scale_y, 1) print("Spawn entity: ", factory_url, position_x, position_y, position_z) - factory.create(factory_url, position, nil, nil, scale) + factory.create(factory_url, position, nil, { + sprite_animation = hash(entity.image) + }, scale) end @@ -26,7 +28,7 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/grid_items.json") - detiled.load_tileset("/tiled/tilesets/grid_tileset.json") + detiled.load_tileset("/tiled/tilesets/grid_game_objects.json") local entities, map_params = detiled.get_entity_from_map("/tiled/maps/grid_game_objects.json") spawn_map(entities) diff --git a/game.project b/game.project index 5350dbc..3f8210e 100644 --- a/game.project +++ b/game.project @@ -1,5 +1,5 @@ [bootstrap] -main_collection = /example/example_grid_game_objects/example_grid_game_objects.collectionc +main_collection = /example/example.collectionc [script] shared_state = 1 diff --git a/tiled/assets/grid_game_objects/tile_0000.png b/tiled/assets/grid_game_objects/tile_0000.png new file mode 100644 index 0000000000000000000000000000000000000000..c70060d5c74f2ac7ccb1cb7acd494ba4b8fb07d6 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFY60fys?X0Vu3-(10K;CB6Ad**3HOZV|e*OS}U}w*&3*w!PC{xWt~$( F698uuF9ZMp literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0001.png b/tiled/assets/grid_game_objects/tile_0001.png new file mode 100644 index 0000000000000000000000000000000000000000..8b23f3b6fc91f98190ce67732c20f5f7cd392e89 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFD789Cl@0=EmY`$guOCY*(kZ R=}Dkr44$rjF6*2UngCG#FO~oR literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0002.png b/tiled/assets/grid_game_objects/tile_0002.png new file mode 100644 index 0000000000000000000000000000000000000000..9ca917d0410c961c45f3a6635ec0f38ecf3622d2 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFSXYA^>bP0l+XkK8rdqs literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0003.png b/tiled/assets/grid_game_objects/tile_0003.png new file mode 100644 index 0000000000000000000000000000000000000000..2452e84927b8f82ef7849a33be52f1c11844a1f8 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z9l7g|ta#^c!lvI6-$0X`wF z9l7g|ta#^c&%^10w3?osX5v( ZGQ@D0YlaHUbOEYm@O1TaS?83{1OR8@CKvz! literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0005.png b/tiled/assets/grid_game_objects/tile_0005.png new file mode 100644 index 0000000000000000000000000000000000000000..08118c7c1f88398023c0efa1c448301ed376845e GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF=aKq^?Oq%^SP8B@$9CR%$FXlxbxt)Kojcz;Ne})GNRG>O(;744$rjF6*2U FngGoGFna(1 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0006.png b/tiled/assets/grid_game_objects/tile_0006.png new file mode 100644 index 0000000000000000000000000000000000000000..244bb4adf3d07a753e34fefbdaca0e987e5da3e5 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zKzi_!@pqvGk}7{YNq`N6BKgoFrI79Q>vL&<$ z3K(lJHg-+wGHm9Suy~lT;((-9KwAfw-_aHc2H(pv3)?sHoCa!T@O1TaS?83{1OUOM BEl~gf literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0008.png b/tiled/assets/grid_game_objects/tile_0008.png new file mode 100644 index 0000000000000000000000000000000000000000..1886dc1efdfbc4fd9f0d281fd80de49e4ff49ff6 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+K{qe-z$h-Q+k;A1eYk}fgo-U3d9M_Y7{Qv(yoK2yS+v85V@bmnGM;^G?PWZv6 kwvV~<{QdvQT8u&rNtdlZDEf5S0Ch2Vy85}Sb4q9e0G=c*{{R30 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0009.png b/tiled/assets/grid_game_objects/tile_0009.png new file mode 100644 index 0000000000000000000000000000000000000000..cac425d5677d46c541dd04e8f590981c815bf4ef GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+K{qe-z$h-Q+k;A1eYk}elo-U3d9M_XO{{R1Pf4GR_qpZu6>&%^10w3?osX5v( ZGQ@D0YlaHUbOEYm@O1TaS?83{1OSJZCX)aF literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0010.png b/tiled/assets/grid_game_objects/tile_0010.png new file mode 100644 index 0000000000000000000000000000000000000000..7c93da480bcae7e9c86d14a502b4f8fca754baab GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF!lvI6-$0X`wF zK>F~pm+nU1GiM$7H_t~M$Y(4G@(X5gcy=QV$WifhaSY+Oo}BO?>cD{wTpSW%YwNal oDT;7N{QJN5|M?H{93JWno#tluQan{>0@X8ky85}Sb4q9e0A$1}`v3p{ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0012.png b/tiled/assets/grid_game_objects/tile_0012.png new file mode 100644 index 0000000000000000000000000000000000000000..77b8ad30f3671133313e6d993870cb365e771d5e GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_$DvZ)#b7^W2z78V8-7BU&f#7r@eXfkNyKFY%ope}QIwrs#!lvI6;>0X`wF zhmXBxhTQq(Y#eu&0Y-2*>s0h^<*ynb;IAddV^|1TWL@VV!Ks1e9j*boFyt I=akR{0DdDJ4*&oF literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0014.png b/tiled/assets/grid_game_objects/tile_0014.png new file mode 100644 index 0000000000000000000000000000000000000000..8e86c60f01eb1de20802dba4235b3d71371b043c GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zhmXBxhTQq(Y#epr?yt2*>s02T@zIM4bh$axkn?R@r&`%jPPeB!j1`pUXO@ GgeCxWJ|1TP literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0015.png b/tiled/assets/grid_game_objects/tile_0015.png new file mode 100644 index 0000000000000000000000000000000000000000..6848c9a20432cc9fb281bebb85d79ccc4285cbbc GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zK>F~pm+nU1GiM$7H_t~M$Y(4G@(X5gcy=QV$kFn2aSY+Oo}3VMa7&Y8_SIFPJge*0 v{yMtB%*13$V&$Lz6>U%d|NpN(mw`d@v(dwI;il_=x)?lN{an^LB{Ts51^+S+ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0016.png b/tiled/assets/grid_game_objects/tile_0016.png new file mode 100644 index 0000000000000000000000000000000000000000..4aa2234708b8de1f448a6c7035e5fc348d1dd8e0 GIT binary patch literal 146 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zK>F~pm+nU1GiM$7H_t~M$Y(4G@(X5gcy=QV$WifhaSY+Oo_rxIA?n};E)I!n>!ZGQ oD~fPP?ECj${`?1d4i9yPonq!C9G4>x1JyHly85}Sb4q9e09EoTm;e9( literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0017.png b/tiled/assets/grid_game_objects/tile_0017.png new file mode 100644 index 0000000000000000000000000000000000000000..6d8c8f8616bf8b7d707130f493bf044b554af96a GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zK>F~pm+nU1GiM$7H_t~M$Y(4G@(X5gcy=QV$kFt4aSY+Oo_rzeLRLb=)~u^sZC_Vk sTc5!lvI6-$0X`wF z9l7g|ta#^c!lvI6;>0X`wF z9l7g|ta!J$?cAiW3&(+i>Ygr+Asp9}BUo8@0+Li`%wT=g)Tzgo5@|7!Rb^UZXR1Te dMWd8Rh7Lu|@*i@O1TaS?83{1OT)FClUYv literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0020.png b/tiled/assets/grid_game_objects/tile_0020.png new file mode 100644 index 0000000000000000000000000000000000000000..fa3a419024f276c75ced081f7f65425cbed08f47 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z9l7g|ta#^cAe(IEtIB(DHc$(Lr>mdKI;Vst0KYFPX#fBK literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0021.png b/tiled/assets/grid_game_objects/tile_0021.png new file mode 100644 index 0000000000000000000000000000000000000000..4d46da4473d9f4ee3ede8ea3ce0415c049cf42f4 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z9l7h>jl7Snc(=Ii+}z1V(m-)_PZ!4!j_b)k{{R0U%qH?ke8P?Y@*Z#41ot~0Nf-Di h-~5AJ{ojEj3`^fEQA06 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0022.png b/tiled/assets/grid_game_objects/tile_0022.png new file mode 100644 index 0000000000000000000000000000000000000000..c71083d908aecf712f7e8d081750e78155459d46 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z9l7h>jl7Snc(=Ii+}z1V(m-)#PZ!4!j_b)C|Nj5CXKsq%SNiv#S@6BXk>B4P9@%s- ccnhd7I5^k}cb|`33RKSE>FVdQ&MBb@0MF?tHUIzs literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0023.png b/tiled/assets/grid_game_objects/tile_0023.png new file mode 100644 index 0000000000000000000000000000000000000000..14a6a7b26d825dec8a9f8967c5eadfbf52b81bae GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+K{qe-z$h-Q+k;A1eYk}hOo-U3d9M_X0{{8=7&&Kn}x@X6KNsl|MopX;a<7;MM Y_<725<30PM4M3#~p00i_>zopr0G!+@-T(jq literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0024.png b/tiled/assets/grid_game_objects/tile_0024.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b9f845f04e57f3b246abca08cf513faca75017 GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF z$vc+K{qdyw#*tGTm2E&l2~QWt5RU7~5v(jcDMF_Y9MMtOm?0Lz!?37NEAV2OfGAK6 NgQu&X%Q~loCID_|ALIZ4 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0025.png b/tiled/assets/grid_game_objects/tile_0025.png new file mode 100644 index 0000000000000000000000000000000000000000..047c45d5d2176339e1f26531e500fa4b41c07c49 GIT binary patch literal 121 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+K{qe-z$h-Q+k;A1eYk}eto-U3d9M_Y7{Qv)7m(8f-^+$t83igv&7z!3zZNAtR REdx};;OXk;vd$@?2>@&uC9nVh literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0026.png b/tiled/assets/grid_game_objects/tile_0026.png new file mode 100644 index 0000000000000000000000000000000000000000..1ad5306395f3b6f77b20a039254829b990351a2d GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+08+p(D@ud335!s7{LO^kKPZ!4!j_b)k{{R0U%qH?ke8P?Y@*Z#41ot~0Nf-Di h-~5AJ{ojEj3{x{EYtu1 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0027.png b/tiled/assets/grid_game_objects/tile_0027.png new file mode 100644 index 0000000000000000000000000000000000000000..a22cf542f3816236f0e94b1b3430fcc6942c5457 GIT binary patch literal 132 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+08+p(D@ud335!s7{LO^k4PZ!4!j_b)C|Nj5CXKsq%SNiv#S@6BXk>B4P9@%s- ccnhd7I5^k}cb|`33RKSE>FVdQ&MBb@0OY$Uh5!Hn literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0028.png b/tiled/assets/grid_game_objects/tile_0028.png new file mode 100644 index 0000000000000000000000000000000000000000..56a8d9d5a7a9c8f08a7e1024661a1946f5d651df GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|G(24#Lo9le zOUyt0JAdH7fdJ!Fxx-tvw@Z4k`l!5?Fip795Xj87l99nhoJ}lO@bNC79tKZWKbLh* G2~7a#U>_6! literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0029.png b/tiled/assets/grid_game_objects/tile_0029.png new file mode 100644 index 0000000000000000000000000000000000000000..9355b4397386e3f1a5794f134d22950bb175c18e GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le u=UBczQP0N3Agnseomav%;Y!276b1%YerB<*oD?shLIzJ)KbLh*2~7YZMHm|Z literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0030.png b/tiled/assets/grid_game_objects/tile_0030.png new file mode 100644 index 0000000000000000000000000000000000000000..b3fc30531645702bad385514a4c315f94721442d GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zhmXBxhTQq(YDmPZ!4!j_b)0TeCv7nZI%{crVg0^b5DN0Ln3Vy85}Sb4q9e E04jDHbpQYW literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0031.png b/tiled/assets/grid_game_objects/tile_0031.png new file mode 100644 index 0000000000000000000000000000000000000000..ae49f4051dc6a6a16487cb697d7332135f9c4c10 GIT binary patch literal 116 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zhmXBxhTQq(Y#en5Ts0h^<+n+RR)V8C=#VO=e(duGiw&lDKLKPz8gh LtDnm{r-UW|;wl~) literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0032.png b/tiled/assets/grid_game_objects/tile_0032.png new file mode 100644 index 0000000000000000000000000000000000000000..56556e175076d2fda634f38073304a6f294f008d GIT binary patch literal 115 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zhmXBxhTQq(Y#esHcl#2*>qgj;O6!qRdSXm;_g!P-ifR(zscmzi=;50fVQj KpUXO@geCyaUmjNg literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0033.png b/tiled/assets/grid_game_objects/tile_0033.png new file mode 100644 index 0000000000000000000000000000000000000000..56a8d9d5a7a9c8f08a7e1024661a1946f5d651df GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|G(24#Lo9le zOUyt0JAdH7fdJ!Fxx-tvw@Z4k`l!5?Fip795Xj87l99nhoJ}lO@bNC79tKZWKbLh* G2~7a#U>_6! literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0034.png b/tiled/assets/grid_game_objects/tile_0034.png new file mode 100644 index 0000000000000000000000000000000000000000..9355b4397386e3f1a5794f134d22950bb175c18e GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le u=UBczQP0N3Agnseomav%;Y!276b1%YerB<*oD?shLIzJ)KbLh*2~7YZMHm|Z literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0035.png b/tiled/assets/grid_game_objects/tile_0035.png new file mode 100644 index 0000000000000000000000000000000000000000..b3fc30531645702bad385514a4c315f94721442d GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zhmXBxhTQq(YDmPZ!4!j_b)0TeCv7nZI%{crVg0^b5DN0Ln3Vy85}Sb4q9e E04jDHbpQYW literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0036.png b/tiled/assets/grid_game_objects/tile_0036.png new file mode 100644 index 0000000000000000000000000000000000000000..75d41aa60f3e15164bff286a9d9f7a433e9f1580 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFgTe~DWM4fq?<qMLyV5g&vfiF9jv*Y^lM5P|*iYS`54>!`%I#^I*J1}TFBDGUs! Xr4@Jc-8pUzG?u~B)z4*}Q$iB}^|(3f literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0038.png b/tiled/assets/grid_game_objects/tile_0038.png new file mode 100644 index 0000000000000000000000000000000000000000..f70af534c4d8b979b6280e710cce69d2233d85d2 GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFt?Z&RWdxb2*~k+=9dyFWl7#*!evUqqt;fQLlJwnXZGx3TzO}El}MiRl+A*@ jyXH3jWPkND=`(}dL*egBxOa*HO=j?P^>bP0l+XkKKwm=< literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0040.png b/tiled/assets/grid_game_objects/tile_0040.png new file mode 100644 index 0000000000000000000000000000000000000000..1de9c08f608ab57fd796f86b8397cd2451d44978 GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF z?nd5=+s++X@y>#&>jY3x(bL5-gyVX00xvIbf`d}pxj6?8Oq(Wl;J~)5t1OE+cbGBk X^OoW&UvTj%P%(q2tDnm{r-UW|p!Ovn literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0041.png b/tiled/assets/grid_game_objects/tile_0041.png new file mode 100644 index 0000000000000000000000000000000000000000..b720ac91ec45a5608664c80a5dfd2e82c8c33493 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF?!i(?4K_2hsiCN@Wn1cNrF93JMhWPvn;GzKmv m!{*NJZetGP9S)4GJPb>3NXOoM_$3FZjlt8^&t;ucLK6V<&?`Lv literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0043.png b/tiled/assets/grid_game_objects/tile_0043.png new file mode 100644 index 0000000000000000000000000000000000000000..b96d36614e69794f60cfe118567c837403f1f554 GIT binary patch literal 202 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFQz<|d&P=1p` zn8CdRk_tEK|Ib`ya-q6bfL|r&+jq9#Y6==B#V1=yoC#ehc;(ZDjyEM&otAuelw~nv ese1eVH}je4eA%Ct9eD{fl)=;0&t;ucLK6T7zd?xr literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0045.png b/tiled/assets/grid_game_objects/tile_0045.png new file mode 100644 index 0000000000000000000000000000000000000000..584f1cd39a58e5dc94a7ed2c7a8c16aee96d378c GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF z?nd6#H;&Bx@kIQSiXl)?(bL5-gyVX00xvIbf`d}pxj6?8Oq(Wl;J~)5t1OE+cbGBk X^OoW&UvTj%P%(q2tDnm{r-UW|r$;3) literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0046.png b/tiled/assets/grid_game_objects/tile_0046.png new file mode 100644 index 0000000000000000000000000000000000000000..8ad0b6f634f9e4bd586d57325dfaada2395c60a3 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFf-ZN(%xxcdG_?etMpd4dKkY6x^!?PP{K#r%Ui(?4K^<e5oG6OrNGUC>5+U5m$KHbjF~}(2VU-KwA;VfrKee63?D4WfTxB?&v7o mSz$OOkS~$rkSMbxBZJpuLrb~LoP|I`89ZJ6T-G@yGywo7G(HLd literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0049.png b/tiled/assets/grid_game_objects/tile_0049.png new file mode 100644 index 0000000000000000000000000000000000000000..0344112b8e2077fe53e3902d21895f41c0d3622f GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFEal|aXmTV0NbTY z4l2=75-JQkGf$>DG%5OedfxQ#I^4Rc@JyxQjGvh| dLv-sg28M&hvh!2_tppj);OXk;vd$@?2>{piJn#Sj literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0051.png b/tiled/assets/grid_game_objects/tile_0051.png new file mode 100644 index 0000000000000000000000000000000000000000..57e6fb9070bbbe12341c0f07a53a93a1ad7d11e4 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_sm&G8cSz~=}qkdN*Q~)IEHXsPYy6@V_;KdOJ-ve2s0{U{1n@uRG{h8 t)~z7XAkxej*2Xy{F`-HCky4YhIKu{0DOpb5@*bde22WQ%mvv4FO#oCMDK!89 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0052.png b/tiled/assets/grid_game_objects/tile_0052.png new file mode 100644 index 0000000000000000000000000000000000000000..a142c6582b860a149a7df71b88910d1d4370cc81 GIT binary patch literal 142 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zhmXBX46B?u>quki>^ mul;xa!~ZOc2@FhsSQsux7}bd_3_T6h$l&Sf=d#Wzp$Py$R4c#$ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0053.png b/tiled/assets/grid_game_objects/tile_0053.png new file mode 100644 index 0000000000000000000000000000000000000000..25e1994ebeb358b82095d4b326ed98ee85df26fb GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_sm&G8cSz~=}qkdN*Q^&IEHXsPc~>{P-SCFW)lcYGALvG6x*Owpy|`5 tAhAQka7RO^ojEHnTB literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0054.png b/tiled/assets/grid_game_objects/tile_0054.png new file mode 100644 index 0000000000000000000000000000000000000000..7760da965f3063b87b0977bbebc4ce362c13057b GIT binary patch literal 150 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFs01hYa$W;Tn%66XRA rB}gpNK6cn)hB8xn#{$p97fcK(lVxvR{B(5!Py>UftDnm{r-UW|Lo_VZ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0055.png b/tiled/assets/grid_game_objects/tile_0055.png new file mode 100644 index 0000000000000000000000000000000000000000..dd4e95ba0baef8811a952b1cea5009dd7799b1c8 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zpUZ#V5kV YP%o^RvRh?I2v9kLr>mdKI;Vst0F7xOoB#j- literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0056.png b/tiled/assets/grid_game_objects/tile_0056.png new file mode 100644 index 0000000000000000000000000000000000000000..62256e894398ff656a8b62d464e0d3073d0b8554 GIT binary patch literal 157 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFs00!HR^W;TJROPUfS yj2)KDS-_(%ahO$)HMD0wW3W!g!GL2)d<@(U@_!fb?9K=3WAJqKb6Mw<&;$TZN-S*v literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0057.png b/tiled/assets/grid_game_objects/tile_0057.png new file mode 100644 index 0000000000000000000000000000000000000000..9ec6067a1ebcaa20d7adb2e75369cdee9bef62ce GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFNR)sX$T2k|4ie28U-i(tsR)PZ!4!j_baC8+jQNd6+XJ zTGE-1FnIXQSGrd(I^nSQl1+N&G?&^0pX5=oJvhV3G%7rS;a1_p*<1`~LfZ^=|3z2m mI=_gB3VVD{X8y<8MCON9f}c0&L<9qkX7F_Nb6Mw<&;$SmZ9hl= literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0059.png b/tiled/assets/grid_game_objects/tile_0059.png new file mode 100644 index 0000000000000000000000000000000000000000..7258e24c25221983427c0e2721a3354a8001664f GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zM`{Y)jl4gfU2}hBhyJ3vpFnXRPZ!4!j_b)k_*r-alCG}$&vQR)|E%)`xnEbmhRTH`ycYeJ3Bv?v}!lvI6-$0X`wF zM`{W`pIzf_ozZu@V4_;vm7w~}#dZ^fVgkbU*}f1dgo3%wZrsatS}UW+*j PG?Ky7)z4*}Q$iB}Xiq-s literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0061.png b/tiled/assets/grid_game_objects/tile_0061.png new file mode 100644 index 0000000000000000000000000000000000000000..4918b91bdbde297fea754a1105163a19b3022175 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zpU=Oi$z%1s|G5}yewnSDSmV75 PXe5KDtDnm{r-UW|ps+x- literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0062.png b/tiled/assets/grid_game_objects/tile_0062.png new file mode 100644 index 0000000000000000000000000000000000000000..321bfd146168505fc7f565c19eb1dcff1b17d7a9 GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF!lvI6-$0X`wF zKstHHvg#X0+>N|7yWPToe8!R>zhDN3XE)M-oB&T3#}JO|$q5_&A3kv4!+(2b=FjWD zvP;Z}Py5d(_+N5H{Mxwl3IBOK{;+SX+Z)BHlBaw3{D;?BKjhouy)WAv{E3#TYdH8% iYr+F|L7w=>k_aHZj33Il@zD|5F+)l3!lvI6;>0X`wF zzn`AGzp~@=*)>ZGnWKP$s-7;6Asp9}BUo8@43xP13Je!`G<52yX}S0lKr-E0m}1B0ilpUXO@geCwwTqFYk literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0066.png b/tiled/assets/grid_game_objects/tile_0066.png new file mode 100644 index 0000000000000000000000000000000000000000..7aded89989bc3ad563d824d65be9b644c0bbef0d GIT binary patch literal 191 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF;{Uf6Tt z0>g?14VMnn0D(gstVRcl7IrnQ5@?$=Nz0={^b7}UW*H-sz~Q4ejvl!wp~0Ne(IBCy iAjxs~#*HIKB^YFT1U_ASk#-DdEQ6=3pUXO@geCy+Fh70( literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0067.png b/tiled/assets/grid_game_objects/tile_0067.png new file mode 100644 index 0000000000000000000000000000000000000000..af9a5dc3230aead82d3edcea1435267f69675d63 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zK>G99HNT&pbT{%A+gkDf$Y(4G@(X5gcy=QV$dUDQaSY+Oo}8c{DZ?OG?{K7EpxCx! gC)bfVtSL+kbyA#H8GD6J0~IoOy85}Sb4q9e0O^|~=>Px# literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0068.png b/tiled/assets/grid_game_objects/tile_0068.png new file mode 100644 index 0000000000000000000000000000000000000000..0e9e91c35acf352b1e879959d1a48d633c2b7b6e GIT binary patch literal 187 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFs01hYa$W;Tn%66XYt xBuFgOPBRNUl#noEannJAgC@saIWroB7<_VN@OjErS36 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0073.png b/tiled/assets/grid_game_objects/tile_0073.png new file mode 100644 index 0000000000000000000000000000000000000000..a90a68b2af034778362b949ab020d95cc8545031 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zpUA5y8y~Yos00!HR^X10bP0l+XkK%cw5j literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0075.png b/tiled/assets/grid_game_objects/tile_0075.png new file mode 100644 index 0000000000000000000000000000000000000000..fc718030e9eb5dd8a90fe916799b88d6a5ee2bf4 GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF~J^oW}WGt4U}Lk3GxeOaCmkj4akY`ba4#fxE_1vAa8>K z53@u43pQCsF%9Js1_!TuqPctib1V^2Ja~LxduoHp+D;DrTUoa@Ena3HWww;>#G2HG zk^tRF3>6(;zCE|S$057)u}GvH!+b-7Tsd*wZu!}!ENc^ib})Fl`njxgN@xNAPohO4 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0076.png b/tiled/assets/grid_game_objects/tile_0076.png new file mode 100644 index 0000000000000000000000000000000000000000..09bbe035a369f96ca6ba36873cb73a9cba55a980 GIT binary patch literal 204 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFNR)sX$T2k|4ie28U-i(tw-@PZ!4!j_bK+H;OhW2rvh5 zNgfat5I4BA`bgZwH~YKTw=MgnU-|vq&iNHDUrl(b-4OSa-Gf)_z?yA$6jN@8lpCpA wu6@#Sl;Mc7i!-N;r)7Mm#qGZidG+h#WrBsSeqGBS543~9)78&qol`;+0JyS8F#rGn literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0077.png b/tiled/assets/grid_game_objects/tile_0077.png new file mode 100644 index 0000000000000000000000000000000000000000..fa87971db7ed05397c1ea75d079630146abef87d GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF>F1?|#PbQG)_mTdp; zV|#fK|385r3hBA2R{br(tq0c3{2apb`QHPs$1L`H*4y9UPdINF(iiA`vX>!o_WEju Y4{ya=<{VV}05qAw)78&qol`;+09~Iz$^ZZW literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0078.png b/tiled/assets/grid_game_objects/tile_0078.png new file mode 100644 index 0000000000000000000000000000000000000000..bc6aff69eb51ab723eeb604ee36635db7aeededd GIT binary patch literal 163 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFI;uyklz4YWkP6h)G=RoTwZ5H(oVUb<`eN11h z{UU#;Il^z5qZ)UMR)T{}Xa}R*2mT}9ygslUp3WO%@U4`Qp+c;-)=mB+&?p8^S3j3^ HP6##cq$r8FbLfjR}%-zWQ)%r_yKsm;eAirP+hi5m^fSh$;~m zavm_?VQ~;`)Oo}kvxL`;d&vaz4R@uO{(b#CX|a>c|49imubL^m_%`FK!{3WHSd)}i z?zI%V__I_m|JW4cJ_A<=Mx~yjZw(rmk9A+(3gG1k`8%!nPK-QXk$T)&o%PRvRxx!lvI6-$0X`wF zKstHHvg#X0+>N|7yWPToe8!R>zhDN3XE)M-9A{4##}JO|$q5b&|M(pa{o|kTG2ec| z$81~X=DX|u@H-^^m1omdKI;Vst0MF|>qW}N^ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0082.png b/tiled/assets/grid_game_objects/tile_0082.png new file mode 100644 index 0000000000000000000000000000000000000000..83d22af187becadf2786f1693a06bdfa7ed684b1 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zK>GL7lb_G7aX0ez&(b{r{v*4@jQBL>&hXWaM{)$jPbB@=DtD5H!EA%*`!)O8P6N$g@O1Ta JS?83{1OQ&jG@Jkc literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0083.png b/tiled/assets/grid_game_objects/tile_0083.png new file mode 100644 index 0000000000000000000000000000000000000000..ccef1a580ec5332b96ab8882f1cdfd7684391027 GIT binary patch literal 178 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zK>G99HNT&pbT{%A+gkDf$Y(4G@(X5gcy=QV$Z_#>aSY+Oo}BRG{DA`p{`_a2Q1O@D zW6v#qmAbX;T>nn7Z{{;Fu#e?c{Sm+R-+=@2TSYut+L}5%1Ps42Gk?DNftg2vfuZ%F WO#aQTyT5?uF?hQAxvXV*-jYmIV0)GdMiEkp|>Mc)B=-a9poFeUS5j0S~i7 zt&PKiSOpViiOH;8pY<(n)laqB(!X!jbww4A7tfB02;HrXh_rZp;mDhqV%>V!Z literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0086.png b/tiled/assets/grid_game_objects/tile_0086.png new file mode 100644 index 0000000000000000000000000000000000000000..ce21d90e596008a40f92c30b49d5dda1baa53b73 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zK>F~pmosM_aX0eb&-qyc$Y(4G@(X5gcy=QV$dUJSaSY+Oo}94Z_Td8!vwv)t_xN+> jxJunxcf|u;jSLK*m4x-J8u(rTl`?p``njxgN@xNAz``m$ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0087.png b/tiled/assets/grid_game_objects/tile_0087.png new file mode 100644 index 0000000000000000000000000000000000000000..9d50a7a612368fbe064d96c69327560dec18a836 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF!lvI6;>0X`wF zhmXCSIqOJc>FlLmXJ!EfMLb;`LpZJ{N3gQ+ED=r+;9|*OVK6?X)S1*}u@flI;OXk; Jvd$@?2>{LF9e4l$ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0089.png b/tiled/assets/grid_game_objects/tile_0089.png new file mode 100644 index 0000000000000000000000000000000000000000..7b64a4f13c1aa5962d255f4a991a245af7f257a1 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF)VL`pgV*o20*9x10YCsGh;o)z4*}Q$iB}SvV*U literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0090.png b/tiled/assets/grid_game_objects/tile_0090.png new file mode 100644 index 0000000000000000000000000000000000000000..2b9fa2d0be082da122c8e0212ca117d30e977589 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z9l7g|ta$hN?3%@G=L9rZ{{zL%JY5_^IIf2tG2~+q5MVj*_kZv=p?ME9tJXRxrC2UB wINBiX7uFPREum_l**r`ApovZGR`Jqk`D(MxVJaoUKob}|UHx3vIVCg!02}r#>;M1& literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0091.png b/tiled/assets/grid_game_objects/tile_0091.png new file mode 100644 index 0000000000000000000000000000000000000000..3f9f843913fea779faf06d50b99bb35af0669276 GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z9l7g|ta$hN?3%@G=L9rZ{{zJhJY5_^IIbs0u(I$3Bwg2P`}+U<|D+%P|G%$S2;^4E qayU}&^T>L_4?eXn$2(OkSQsk4S;}sCDZUM;m%-E3&t;ucLK6VJf-x@u literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0092.png b/tiled/assets/grid_game_objects/tile_0092.png new file mode 100644 index 0000000000000000000000000000000000000000..b016776b485a1ea92ef32de3482f51d5da2529c4 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF z9l7g2pIx)K?cD2U{gFUH6;Bt(5RU7~9IQ-i9EQRkE}D#;p{u7gbxc)A5^b8%HN9a4 aGsE)>N=H8y+KK?xGkCiCxvX!lvI6-$0X`wF z9l7g|ta$hN?3%@G=L9rZ{{zJpJY5_^IIbuE;Ai1+5xn1cq}(8o=h3xh)qjm0;RQ*e Z4A(8~M43Xmt^(CEc)I$ztaD0e0svs|CYJyJ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0094.png b/tiled/assets/grid_game_objects/tile_0094.png new file mode 100644 index 0000000000000000000000000000000000000000..0be28e359bbd4ad94ff7fa0065d5dbccf3601a59 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z9l7g|ta$hN?3%@G=L9rZ{{zLzopr0I9etoB#j- literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0095.png b/tiled/assets/grid_game_objects/tile_0095.png new file mode 100644 index 0000000000000000000000000000000000000000..e27ae9961d4fc4ee11150779a6462f04092fd077 GIT binary patch literal 152 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+K{qf}U*)`QSjvRiJeHbWi?&;zf!f`$H$U$BP0Rh*8_v!lvI6-$0X`wF z$vc+K{qf}U*)`QSjvRiJeHbWi;OXKR!f`!0f|Z3QAnCeR+t>f+|0n(U|NnixLLj$N qmcx;HpGVdce(!lvI6;>0X`wF z$vc*PKD(y+#*y>W13G|$DxNNmAsp9}Iarz4I1Gh7Tr?RwLsw60>X@pKB-%8iYkI>9 aW`^e%l#YHZv=srWXYh3Ob6Mw<&;$S;VkJ)i literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0098.png b/tiled/assets/grid_game_objects/tile_0098.png new file mode 100644 index 0000000000000000000000000000000000000000..5af45ff26adfb9b0e9b5d3679f3ad2ddacc8cd6d GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+K{qf}U*)`QSjvRiJeHbXN;OXKR!f`$M2R{psi{SmnBjpBxJddt5tNv^32rozy ZWw>r>C(0Dkbrq!lvI6-$0X`wF z$vc+K{qf}U*)`QSjvRiJeHbXN?&;zf!f`$M2R{psMd$khCZ%t(K3AG|I3)eA|NWn5 hwWCl%lIR2mhW+X`OGI9TKLToD@O1TaS?83{1OP3rERO&H literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0100.png b/tiled/assets/grid_game_objects/tile_0100.png new file mode 100644 index 0000000000000000000000000000000000000000..78fcfa5b22825151db57d66dd307c1b843d0b59f GIT binary patch literal 172 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&XUfOl&4?6OAT3eDvtinghQgHDL2_xezFz^N1sj!Bxg}L6AV(Bq6KjK*2K%44!S0mn7=l Rt^>_v@O1TaS?83{1OPLEHhBO5 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0101.png b/tiled/assets/grid_game_objects/tile_0101.png new file mode 100644 index 0000000000000000000000000000000000000000..940db3ff561bceaf10b994719d39a01592f14905 GIT binary patch literal 130 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zhmXB%ES>%N?3$Ugj&v9WJp+m>db&7wD5iWxjz{an^LB{Ts5&7LSU literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0102.png b/tiled/assets/grid_game_objects/tile_0102.png new file mode 100644 index 0000000000000000000000000000000000000000..62964183f4e74aa8c42203f43a7d3522a6236a1a GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&XUfOl%g1JtR*R1Qiw<7BU)5IdDKy z>Cq#W6pJngNj<$6Jc90y7S2bGo|I5w4dDxHJ`)h+l+M8^!OSpASeo_roPbiGX$+pO KelF{r5}E*yN;35T literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0103.png b/tiled/assets/grid_game_objects/tile_0103.png new file mode 100644 index 0000000000000000000000000000000000000000..a29e8dbe5ed91950984969bfd08a252d75dedb5c GIT binary patch literal 134 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zhmXDde0EJ^>Fk-aj+hD_r~!(rdb&7!lvI6-$0X`wF zhmXDde0EJ^>Fk-aj+hD_r~!&Ad%8G=a9mIR!Oy~Tqa$|pwdRhi3h%N*m^4l^q}^oh cED&L0a85Q4iZpkK0xDPkbt)cvtf+$k)XpJ=^QKB93=vZW1Jhx7#X~T Wq^%Y^luH3kV(@hJb6Mw<&;$TSwloF+ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0106.png b/tiled/assets/grid_game_objects/tile_0106.png new file mode 100644 index 0000000000000000000000000000000000000000..092a63c4e9d03616d77ee886a29312ee78f32b6b GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF=}Bm5W81l7MO&MZ%1TurLv^L$lD0;Pm5DBfKFz%` lF;je-1)njjEi7adVvuf8W@!Dj^eE6|22WQ%mvv4FO#quOKBWKv literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0107.png b/tiled/assets/grid_game_objects/tile_0107.png new file mode 100644 index 0000000000000000000000000000000000000000..60a8e2e2b2518d644ce3fb61f0f3653c2c878f4e GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF!lvI6-$0X`wF z9l7g|ta$hN?3%@G=L9rZ{{zK!JY5_^IIbs0eEt8wzAg0s|9|NbfB(O)Rro0H^XItZ m73R+O2~0=+@=T6kRc3e{V=4P)(P}%OJ_b)$KbLh*2~7Z-h%!F_ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0109.png b/tiled/assets/grid_game_objects/tile_0109.png new file mode 100644 index 0000000000000000000000000000000000000000..2851d30da767103b5a4894586b93a4a5833f269f GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le uWA2o_vu9>)=oC7;n5{?3AnQPa5d(uOKeJf%8ZQx`LIzJ)KbLh*2~7Yy))=1v literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0110.png b/tiled/assets/grid_game_objects/tile_0110.png new file mode 100644 index 0000000000000000000000000000000000000000..c95ffb68671910ec3c7a3a2e760fd0884e81a781 GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z9l7g|ta$hN?3%@G=L9rZ{{zLfJzX3_IIbuE`2YXER@?ut4v(t;{txH5|DU<@zeVT% lghzHA+-m2PQ^FfL89ZaH-!5EzybY+0!PC{xWt~$(698e`F{J!lvI6-$0X`wF z9l7g|ta$hN?3%@G=L9rZ{{zJ}JY5_^IIbuE`2YXE7MsFHE{`kC9iQqQ9{sLY_$cY} i=eXmQ!<^MAoD8{^HmO~eCmsOxFnGH9xvX!lvI6-$0X`wF z9l7g|ta$hN?3%@G=L9rZ{{zLfJY5_^IIbs0eEt8wzU^v3l6}XI|NreK?BG{=H;-MY k{$SDy7uz`-+@~=xM6a?D*yNNX1k}ag>FVdQ&MBb@0LYpy4FCWD literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0113.png b/tiled/assets/grid_game_objects/tile_0113.png new file mode 100644 index 0000000000000000000000000000000000000000..efcadab7667614e8597b30aabbbe7df61e54b530 GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+K{qf}U*)`QSjvRiJeHbXN!lvI6-$0X`wF z$vc+K{qf}U*)`QSjvRiJeHbXN?djqe!f`$M$N&HTwc7rFb$C?$_kTFg{r}9J|1CQA lCp@z2;8r`QoD$y1$>14l{dVE%<844~44$rjF6*2UngH#NGnfDX literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0116.png b/tiled/assets/grid_game_objects/tile_0116.png new file mode 100644 index 0000000000000000000000000000000000000000..618ea755a60ccb79472d7ca248d02ad5789e9202 GIT binary patch literal 137 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+K{qf}U*)`QSjvRiJeHbXN;pyTS!f`$M$N&HTwb&Fsa(P^7?)X&i@aT8F!beG$ iKgS)f9OkS};bh3Qv`Ou%Jn;aihr!d;&t;ucLK6V`O)#MV literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0117.png b/tiled/assets/grid_game_objects/tile_0117.png new file mode 100644 index 0000000000000000000000000000000000000000..1c6135cc3e08e4cf3f33cfeb8dfc8c01da06dd5c GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+K{qf}U*)`QSjvRiJeHbXN<>}%W!f`!0;_Lta^=(%RlI%Nv{Qqw^VF$m`yLs$F k^#_wyxY*9w;69CkA$paKz$T|8A)qb>Pgg&ebxsLQ08(i%00000 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0118.png b/tiled/assets/grid_game_objects/tile_0118.png new file mode 100644 index 0000000000000000000000000000000000000000..ded08d3e7ba197e088e05fcc073172c6f6d8a48d GIT binary patch literal 118 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zhmXB%ES>%N?3$Ugj&v9WJp+o1db&7!lvI6-$0X`wF zhmXB%ES>%N?3$Ugj&v9WJp+o1db&7!lvI6-$0X`wF zhmXDde0EJ^>Fk-aj+hD_r~!&=d%8G=a9mIR@&DKP(6;~o9gk#le3bY2lg=Rc->@V6 lb(rCw|Ex;?ns>}#VeolpV|4k>(^Wui44$rjF6*2UngCFhG1mY9 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0122.png b/tiled/assets/grid_game_objects/tile_0122.png new file mode 100644 index 0000000000000000000000000000000000000000..16df4ea315fe37d3c536eddffffb1cb353bc3ba3 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zhmXDde0EJ^>Fk-aj+hD_r~!(rdAc};a9mI3*k1p4KBMEG?f?JJZ+vLq(b^iZH{Y}) gg8$LK<6aC5fAY;^szqB419dQXy85}Sb4q9e02j|KqyPW_ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0123.png b/tiled/assets/grid_game_objects/tile_0123.png new file mode 100644 index 0000000000000000000000000000000000000000..00791dbc7557c32ed1135bf776f61c625d354631 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFJP&I?6tDnm{r-UW|t)nO? literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0124.png b/tiled/assets/grid_game_objects/tile_0124.png new file mode 100644 index 0000000000000000000000000000000000000000..1f266bd08e393110d9fc06169a46be8d0e874003 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zK>Gjx|3_B5TikZ;U*4~6Kt5whkY6x^!?PP{K#skqi(?4K_2dKxrqvP>GiHRF7!-V{ zO-OjK=|8i|zw6AM>r2@sW_&-UpOEn5x4g%V|BOO^q(vlVY~eF$C{<)&n4Bai96RA- Q2GA%5Pgg&ebxsLQ01tRMEdT%j literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0125.png b/tiled/assets/grid_game_objects/tile_0125.png new file mode 100644 index 0000000000000000000000000000000000000000..00791dbc7557c32ed1135bf776f61c625d354631 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFJP&I?6tDnm{r-UW|t)nO? literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0126.png b/tiled/assets/grid_game_objects/tile_0126.png new file mode 100644 index 0000000000000000000000000000000000000000..a8c079ad8990771e1b68ba8eacbbe4405036444b GIT binary patch literal 144 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z9l7g|ta$hN?3%@G=L9rZ{{zMKJzX3_IIbs0eEt8wp3PvRRPzpgm3Pe@yPr3D{d2my p_7=a=wdRh{{q>BUp{oU07%t_Q-dM$b@)=MogQu&X%Q~loCIGp8F@gX9 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0127.png b/tiled/assets/grid_game_objects/tile_0127.png new file mode 100644 index 0000000000000000000000000000000000000000..48df7c31beca5c02e99c13a2b22e76c9597db03b GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z9l7g|ta$hN?3%@G=L9rZ{{zL!lvI6;>0X`wF zM^?Q1e0I&^wsXu?9#?>Z+MX_sAsp9}BerIRYB2ZA=yKFy5{^<>Cl+(}l#jwjlgWx% hVHq0E85%~640jrp1eYASuL9J@;OXk;vd$@?2>@ZaC&d5& literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0129.png b/tiled/assets/grid_game_objects/tile_0129.png new file mode 100644 index 0000000000000000000000000000000000000000..81651ed4fdfa49f97d25e1a18864d151202166a4 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zM^?P+$X&mpGyIqo<2w2*>s02v!yz@5K#At{5m7y5?kxOqd~cY(vg95yQ67 z)d!Aj$#h7%snZs^&_Pw(d2>UH@|+VaLaU7$g%lPuWY{QkH;TQw3N(zt)78&qol`;+ E09slxDF6Tf literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0130.png b/tiled/assets/grid_game_objects/tile_0130.png new file mode 100644 index 0000000000000000000000000000000000000000..c6334c3f8acb97847ee6a08b80a417dd09ffa83b GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z9l7g|ta!J$?cC?HYwFY=Ujm9dd%8G=a9mgIvF1Bqz~i(tKkuqyv##m&Q|T}6d8oN1 zRxmX(1S_m<_ypF5iFC9>08jxM1;yi?tucc3DMbnDMs-^A-Y)WAJqK Kb6Mw<&;$U!lvI6-$0X`wF z$vc+K{qf}U*)`QSjvRiJeHbXN@9E+g!f`!0;_Lta^=t+krJ8r}tGsLO*!{fG>z~ur qwYT_{t~Gar?yqO;3|%e2!f+|a^u{Xglh1%!89ZJ6T-G@yGywoj3o~^9 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0132.png b/tiled/assets/grid_game_objects/tile_0132.png new file mode 100644 index 0000000000000000000000000000000000000000..634ffc08c973b2fb5ba7ee3c1df636e63b54706c GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+K{qf}U*)`QSjvRiJeHbXN?&;zf!f`$M2R{ps#*tcukK#TJJL)f_JUsI6KhNv` i@Bba$z{MfJ!mwkN)zYg`XZV3y7(8A5T-G@yGywpN<}Zo> literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0133.png b/tiled/assets/grid_game_objects/tile_0133.png new file mode 100644 index 0000000000000000000000000000000000000000..f9a700737e472cc1f6165865d75279af09ed5862 GIT binary patch literal 136 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zbALSfe0ELsjU(Bs-q`{LwLD!MLpZJ{M{Las)nM+K(dDSaBpju%PAulGm%zpnP3J3X gE-d9)=+L0R@FZ2KlW}^-SD-EiPgg&ebxsLQ0H2X600000 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0134.png b/tiled/assets/grid_game_objects/tile_0134.png new file mode 100644 index 0000000000000000000000000000000000000000..4eda5b024af8a93711b5221b1000afabffaecb6d GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zbALQZ-m$Fu#t{wY@})pQM^6{W5RU7~5v(jc-isTKTrp5Ebj`^WnJ`1@*oK^IB8F|D zs}CI6lIf6iQ>QI-p@XWn^X7&YmdKI;Vst E0G9+Y%m4rY literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0135.png b/tiled/assets/grid_game_objects/tile_0135.png new file mode 100644 index 0000000000000000000000000000000000000000..edbcf90b07878b7202976a1afbb77f498d703006 GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF z$vc+K{qdyw#*xow*Zj$>*8_?>d%8G=a9meCvr)9cK!7RW+u1NNvE$YE*k&G&uyEk= z@YAeg=C5EkHs?>}+2!$AZ{MN5mMVeIUEdbh359)>Ysm@<=bq|lx|`)l-EW|A44$rj JF6*2UngBXZHbDRY literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0136.png b/tiled/assets/grid_game_objects/tile_0136.png new file mode 100644 index 0000000000000000000000000000000000000000..6a20b0c5733a0083b896faa830a67b55d5efa7f8 GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&XUYfrW)4g@uU*VL?TVj0Vg~hgNW; z9=O^d(bUw(bL^Owo?Zf50Lvn7_QRg6Cjyw57wCznr*GhpkkE9NWIGekw$YFwDPD?I TwkO^TXe@)LtDnm{r-UW|BOWwQ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0137.png b/tiled/assets/grid_game_objects/tile_0137.png new file mode 100644 index 0000000000000000000000000000000000000000..3dbe4b6350b387003b7f005ad5f769bed3d054b9 GIT binary patch literal 129 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zhmXB%ES>%N?3$Ugj&v9WJp+m>c)B=-a9mIR!Oy~Tqa#3}LEuKp!3Y2U*Z-FcV`OY% ZU?}Z3s(32Rm<&|Q;OXk;vd$@?2>`2jC)NM} literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0138.png b/tiled/assets/grid_game_objects/tile_0138.png new file mode 100644 index 0000000000000000000000000000000000000000..f7c54342e50826762b0151963ba0b985389dc2a8 GIT binary patch literal 167 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&XR$g(8K8MP_LX##5#QNH{2{Fo-g) z6ciL`F^*ZVD`tY^F%Km_t$;Qmi32V%4Ou-?dJi@nY>+%<(8k2D%w6imE#66AfW|R+ My85}Sb4q9e0J=prrT_o{ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0139.png b/tiled/assets/grid_game_objects/tile_0139.png new file mode 100644 index 0000000000000000000000000000000000000000..3dbceb9e57a92045c41ab5feea17a516275e5ee9 GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|^gUf1Lo9le zOUyt0JKwT-(b&|;APbBk#b;Vc5{ehVDQxEkiGDycpp$J NgQu&X%Q~loCIF-$Acz0} literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0140.png b/tiled/assets/grid_game_objects/tile_0140.png new file mode 100644 index 0000000000000000000000000000000000000000..b7b968b376fce12663d6884006ccb64c46749bd7 GIT binary patch literal 99 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`jKx9jP7LeL$-D$|WIbIRLo9le vOUyt0JMX}lu*l`}3dY53JyHfUco-Nm6d509_o}i26*73b`njxgN@xNAWT_eE literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0141.png b/tiled/assets/grid_game_objects/tile_0141.png new file mode 100644 index 0000000000000000000000000000000000000000..26355ab2c295f6c729d1939d4a2495cdcf6a994e GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(WhCfhN$SCI(MeKbLh*2~7Z>I4bx6 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0143.png b/tiled/assets/grid_game_objects/tile_0143.png new file mode 100644 index 0000000000000000000000000000000000000000..0e37bb0b5bb6b6ee79136bea2920af849314eadd GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFzopr02&oF9{>OV literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0144.png b/tiled/assets/grid_game_objects/tile_0144.png new file mode 100644 index 0000000000000000000000000000000000000000..26f16509af4586942d51befbbfb3ea7ccdaab935 GIT binary patch literal 174 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF8#5#*!evUjrH8Oa*`njxgN@xNAs<189 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0146.png b/tiled/assets/grid_game_objects/tile_0146.png new file mode 100644 index 0000000000000000000000000000000000000000..1991161f9f1bdee87b90e2760b10eb85a6f648a6 GIT binary patch literal 160 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF8#5#*!evU(_u*qN@22}a-@R-DP>!)A$S;_|;n|HeAjjU*#W95AdNK!Z z0t3^vfVKdQ1drwmnLL@QdU=|9?@sW1{gm|ilhOo^j)#3`8oXCdmzG{^%ypFWB^Rru cvI#H4m0E47gWh-c0F7esboFyt=akR{0IJ43zyJUM literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0148.png b/tiled/assets/grid_game_objects/tile_0148.png new file mode 100644 index 0000000000000000000000000000000000000000..76011bbe73395d65119622ce555f88dae774a145 GIT binary patch literal 168 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(_u*qN@22}a-@R-DP>!)A$S;_|;n|HeAV<&B#W95AdNK!Z zLPJA(_u*qN@22}a-@R-DP>!)A$S;_|;n|HeAjiPd#W95AdU65- z^RqenXj{+o=1=dM07|&JH2z|EhDbNH4Pgg&ebxsLQ E0M0HjlHr;xWR%ivr5<+Y~{{+yX8P`1|UR8CqS!>YTFx1`(%c6t%};?pGvm0#Q|&I)sGU0n7VXgY(ZtDnm{r-UW|;MGQN literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0153.png b/tiled/assets/grid_game_objects/tile_0153.png new file mode 100644 index 0000000000000000000000000000000000000000..2a0a0360b7d1d748ec5ae1707c234370019a6a42 GIT binary patch literal 194 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFl!OYvvUf+j!ZR* mt9C2-c$7a&<_-VE3Wj(^(Y~%-Ew(_z89ZJ6T-G@yGywnyO+w26 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0154.png b/tiled/assets/grid_game_objects/tile_0154.png new file mode 100644 index 0000000000000000000000000000000000000000..7b00732c5dc344b95e21a2ae50df40b89f346790 GIT binary patch literal 147 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zM`{W`pIvi*WrxSpYH6ULsi%u$2*>qg4pt_%l%~e1iY5tHnc4!@hpv`z+PaLfbE<<< rO6X;+whf^U8#hF*PSCLsyj literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0155.png b/tiled/assets/grid_game_objects/tile_0155.png new file mode 100644 index 0000000000000000000000000000000000000000..9b6800b946209ea19c1c77319cba7c83a9deb776 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zM`{W`pIvi*WrxSpYH6ULtfz}(2*>qg4pt^M7Qq7t4xBo$HR~!w6*73b`njxgN@xNAIT0g( literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0156.png b/tiled/assets/grid_game_objects/tile_0156.png new file mode 100644 index 0000000000000000000000000000000000000000..3a0f0ec4145c813324978e71c8fdc0f86745ecf3 GIT binary patch literal 139 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zM`{W`pIvi*WrxSpYH6ULuBVG*2*>qg4pt^M7D0w35<9{+wi&I7+A83(hCy)kffkL9 j8C=TC4sv!#xX3bOM<^sG{oB6*sFA_b)z4*}Q$iB}ToNa? literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0157.png b/tiled/assets/grid_game_objects/tile_0157.png new file mode 100644 index 0000000000000000000000000000000000000000..68082ea3e0a37743e82a02dde73c3e9391ccc653 GIT binary patch literal 123 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zM`{W`pIvi*WrxSpYH6ULtfz}(2*>s02v!!J6v536M=niONYa`R!Jrh@%EYi>r{-P0 S0$FRILIzJ)KbLh*2~7YOA0e9n literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0158.png b/tiled/assets/grid_game_objects/tile_0158.png new file mode 100644 index 0000000000000000000000000000000000000000..7b69954cb0fd4bfa1cd85f4e4276ff27f2f79236 GIT binary patch literal 120 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zM`{W`pIvi*WrxSpYH6ULl&6bh2*>s02v!!J6rspS2PGeFmxdh+9hew;xHMV}H$}1l PRWW$F`njxgN@xNAcwZjB literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0159.png b/tiled/assets/grid_game_objects/tile_0159.png new file mode 100644 index 0000000000000000000000000000000000000000..fda008309a90f198c5ab90dc3348a4c9a889fbf6 GIT binary patch literal 183 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF?W)HHa+6$*HGeUm*zn4JWakLn)n&1mb~+__n?gVCHlM|=V! Z!{%A4%N`oUp8}f2;OXk;vd$@?2>|?5HbDRY literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0160.png b/tiled/assets/grid_game_objects/tile_0160.png new file mode 100644 index 0000000000000000000000000000000000000000..b298f5be1818909882a9c750122135906ad67bcb GIT binary patch literal 175 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF(WhCfhX3s)78&qol`;+0I>NvcK`qY literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0162.png b/tiled/assets/grid_game_objects/tile_0162.png new file mode 100644 index 0000000000000000000000000000000000000000..43fffecd99d46f42af8e52fe2e778ba747185047 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFgpHW>R9S+0PAND|H#{MEOpk$am1t1a TM%E)hvlu*G{an^LB{Ts5@l7&3 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0163.png b/tiled/assets/grid_game_objects/tile_0163.png new file mode 100644 index 0000000000000000000000000000000000000000..6b48d1ba17ed5e4ce4518b69ed663bba097ca285 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF8#5#*!evU^7f?Uo=jvhVg!KuQOBC*)uL6Ae6v5(=Lhe|FE(}j+RGK3x%KFkx9F$HJ} NgQu&X%Q~loCIFmtG>iZM literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0164.png b/tiled/assets/grid_game_objects/tile_0164.png new file mode 100644 index 0000000000000000000000000000000000000000..417faf6d1e2d18f5549c324ee289566c8caef6ce GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF8#5#*!evUn9XobR?F5f%s<^ngyTD&W3_FWrs2g(nq10!lEJ1o;IsI6S+N2IM$;x;Tb#Tu=7!PGDf# zX41B0%N7@F2*+ZDS;p)Z&<)hIJ+#+6>vt WRaswViLL;e!rSvL literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0167.png b/tiled/assets/grid_game_objects/tile_0167.png new file mode 100644 index 0000000000000000000000000000000000000000..3e0e92900f2d738325faa9524df4112e186de6d8 GIT binary patch literal 180 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF$mH{qgkK#s#HWO8GRe=PL;>3oo z9TLrq69jqK9NIJ`7$g@aG^}wG;7JJ5GiVdu^vJ~Ez+nc4xuvSxHG1ZK1De9%>FVdQ I&MBb@0IHob5&!@I literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0169.png b/tiled/assets/grid_game_objects/tile_0169.png new file mode 100644 index 0000000000000000000000000000000000000000..16be070c1bcf31c293a79a94e6b6ced6f6ce7be5 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF$mH{s0g2o0DHdTRwK(Azm&yo#F z#}XJ)Seh9pByzDixM@fztQKTp3UpLB%&NAODfxit@!lvI6-$0X`wF zKzin^BaNlA-Hp7JetJp*`HUq&e!&b5&u*jvIdYyZjv*Y^lQ+bE{cqp=HcKMWT-s%g ho9d#6N3xt)82CkX_ZnNQxC&Is;OXk;vd$@?2>|KcCTRcw literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0171.png b/tiled/assets/grid_game_objects/tile_0171.png new file mode 100644 index 0000000000000000000000000000000000000000..06cc0197994e383c8eca67ab7707a8ef7cf2f21d GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zKzin^BaNlA-Hp7JetJp*`HUq&e!&b5&u*jvIdYyZjv*Y^lYjiL59K}l|NnY{BXTuI hyhGjvTQG_;Gu&vmG}Ea5Hwmbc!PC{xWt~$(695|5C+GkG literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0172.png b/tiled/assets/grid_game_objects/tile_0172.png new file mode 100644 index 0000000000000000000000000000000000000000..aabbaf0334fdaae22b7bdd0b8d5c7c558f0562cc GIT binary patch literal 117 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zM`{W`pIvi*WrxSpYH6ULxTlL_2*>qgj@YePqRcZm7zGob2o?l0oa|P$KGQejF;EGE Mr>mdKI;Vst08i>5eE!lvI6;>0X`wF zM`{W`pIvi*WrxSpYH6ULf~SjP2*>s0h^<+n8q7Tctb)OfN4x|!CTaC}^Dr8+GH5ZX Vuj^OmiUO)-@O1TaS?83{1OQj0Aff;O literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0175.png b/tiled/assets/grid_game_objects/tile_0175.png new file mode 100644 index 0000000000000000000000000000000000000000..707bca1fc664e617f670a93bb5cde5f65ba4cb56 GIT binary patch literal 126 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zM`{W`pIvi*WrxSpYH6ULf~SjP2*>s0h^<+n8q5;}SOtR}U6eZ_7?si*J3>_i8T@@T V-A~_@a0RMm@O1TaS?83{1OQjhAxZ!M literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0176.png b/tiled/assets/grid_game_objects/tile_0176.png new file mode 100644 index 0000000000000000000000000000000000000000..062d274cac8aec6a028381e06c15595959218b6b GIT binary patch literal 128 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zM`{W`pIvi*WrxSpYH6ULlBbJf2*>qgj@YePqRuCb6a?9lEL|Bnbps)Pf$6B= V_1`U5ZUaqY@O1TaS?83{1OV}WHv<3w literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0178.png b/tiled/assets/grid_game_objects/tile_0178.png new file mode 100644 index 0000000000000000000000000000000000000000..2540e2d4c6e1ccd75a4263bf71f61ad1bad486f0 GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF7p= jTx9#u$GgwE&Uu%f2eX(=^hK>$pxF$bu6{1-oD!M<1*<=b literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0179.png b/tiled/assets/grid_game_objects/tile_0179.png new file mode 100644 index 0000000000000000000000000000000000000000..4fd5985a362a240977a5b40338576c57d0e647ec GIT binary patch literal 182 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFM!SjzkM9)3w3tlT4>89 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0180.png b/tiled/assets/grid_game_objects/tile_0180.png new file mode 100644 index 0000000000000000000000000000000000000000..e38e171257fe21d1be9a317084f57d59346ca58b GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zK>F~pm+nU13#J{k2XYuog8YIR9G=}s19BuhT^vI=t|vzvJh0&ChAzgAMG_Lzf_xYl Yn!XE2{+aNe9jJ!E)78&qol`;+0J<3@0RR91 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0181.png b/tiled/assets/grid_game_objects/tile_0181.png new file mode 100644 index 0000000000000000000000000000000000000000..79eb5deb2763f194da5790e7053aece056b938e1 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF@~ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0183.png b/tiled/assets/grid_game_objects/tile_0183.png new file mode 100644 index 0000000000000000000000000000000000000000..e38e171257fe21d1be9a317084f57d59346ca58b GIT binary patch literal 131 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zK>F~pm+nU13#J{k2XYuog8YIR9G=}s19BuhT^vI=t|vzvJh0&ChAzgAMG_Lzf_xYl Yn!XE2{+aNe9jJ!E)78&qol`;+0J<3@0RR91 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0184.png b/tiled/assets/grid_game_objects/tile_0184.png new file mode 100644 index 0000000000000000000000000000000000000000..e47f830aac992c5df59b7b6ad902dcd5ecd0c793 GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&V@7pToyqx*K^*N}F^6%##qDD_N6;fe+(na_L9<-qk?C~r1fXUH MPgg&ebxsLQ0H&V@7pToyqx*K^*N}F^6b1*A9(F u#tDfmObUXj0tGBaJqH<1aIi9G88TeEsr2{gM9U_iUItHBKbLh*2~7YCdMwHS literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0187.png b/tiled/assets/grid_game_objects/tile_0187.png new file mode 100644 index 0000000000000000000000000000000000000000..2d01e4b3ba9320528bd62405bbed94b834c3c08e GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFonE=+K+Wn(z7QR%`JrKcW1y$qhNelF{r5}E)Bz$|M3 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0188.png b/tiled/assets/grid_game_objects/tile_0188.png new file mode 100644 index 0000000000000000000000000000000000000000..e254dafda9ca32dfb7680a19235d4186f66d117c GIT binary patch literal 209 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFZpDsx)_2c8GUl(8b^dQrd=F>~gQu&X%Q~loCIB4h BNb3Lq literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0189.png b/tiled/assets/grid_game_objects/tile_0189.png new file mode 100644 index 0000000000000000000000000000000000000000..c85423f5e57d929c9b75caf9193671fd48c3262b GIT binary patch literal 207 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFmKS%dZ^!%)d(5eVXxxw~;dXsqG3o#IMZg1=_*j>FVdQ&MBb@06_Li Az5oCK literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0190.png b/tiled/assets/grid_game_objects/tile_0190.png new file mode 100644 index 0000000000000000000000000000000000000000..4347e344b2971c270cd0e56fdac8552c7aaa6af5 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zM`{W`pIvi*WrxSpYH6ULrl*Tz2*>qgj@YePqRcZm7zGn|bX*7xG*Idm_Hb!D;uNmS fDztDR2NOfZ9|c~mB_EanH8FU)`njxgN@xNA%PS@G literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0191.png b/tiled/assets/grid_game_objects/tile_0191.png new file mode 100644 index 0000000000000000000000000000000000000000..a6a2b9ef8acf404285c360d2090dc37d77432fae GIT binary patch literal 109 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstUx|nfKQ0) z=d)|>uk5hWQUfU$@^ogTe~DWM4f D?noSt literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0192.png b/tiled/assets/grid_game_objects/tile_0192.png new file mode 100644 index 0000000000000000000000000000000000000000..7987777eee6a398c156aee605c895531d5600a2e GIT binary patch literal 140 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zM`{W`pIvi*WrxSpYH6ULo~Mgr2*>s0h^<+n8q8B>sB$IwvI=QCx`@nS=vKV4mPOFp kS#nWWYnxF^o02fY{x6C*WafWZ2Gq&m>FVdQ&MBb@0GG5Vb^rhX literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0193.png b/tiled/assets/grid_game_objects/tile_0193.png new file mode 100644 index 0000000000000000000000000000000000000000..d200c153dc7038e9eb4fd021d8ab34adbec6301f GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6;>0X`wF zpUH|l%WI80>)M*P{=%A|Yyt$!8dCmzIq18r>LJEr+GHjH&8^vB-1scZS>FVdQ&MBb@ E06hXQ%m4rY literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0194.png b/tiled/assets/grid_game_objects/tile_0194.png new file mode 100644 index 0000000000000000000000000000000000000000..c4a5e8929ed2f3f5905a3e3939a9ccc76aea89c4 GIT binary patch literal 135 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!D3?x-;bCrM;OS+@4BLl<6e(pbstUx|nfKQ0) z{goY`&#qxj{_hVI(eZR~4B@z*{Nw-phxW#Y?cD@+v8&lP3I=@mP~Ud!CQt7lp58q? fy`LTL{Qu9mT|j8zsf>w|Kz$6Ju6{1-oD!M!lvI6-$0X`wF zKzin^BZrT@bT{(;X7OV!kk42WgTe~DWM4f^`R?X literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0196.png b/tiled/assets/grid_game_objects/tile_0196.png new file mode 100644 index 0000000000000000000000000000000000000000..a5c9d03c4e9f59397cf2efba8195f3695fdc5edc GIT binary patch literal 176 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zK>Gjx|3_B5TikZ;U*4~6Kt5whkY6x^!?PP{K#r5Ai(?4K_2dKxhGn4+IolUCHa`Ad z&&Iay|9^glPAi3vTk9B^uiyW{%5$drKXd1Qho*=Bt6AC9*4py&@T``aaE5`QVY1k( U<(9ku0!?G^boFyt=akR{020YOhX4Qo literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0197.png b/tiled/assets/grid_game_objects/tile_0197.png new file mode 100644 index 0000000000000000000000000000000000000000..aa3051717b62232c248380c080c19b540906ec0f GIT binary patch literal 141 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zKzin^BZrT@bT{(;X7OV!kk42WgTe~DWM4f^`R?X literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0198.png b/tiled/assets/grid_game_objects/tile_0198.png new file mode 100644 index 0000000000000000000000000000000000000000..5711ed3661409acb39ab06be137dd3034b345135 GIT binary patch literal 166 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zKzin^BZrT@bT{(;X7OV!kk42W>)Y`?RG(SsZEjyzeDqkkvBV~|vU8|#vxe3y4g84CdSF}(!zC$dZ&&ZJHazy%A_m}myIhkH6pB!uqd45G8JZLU~suA V9DDnsju_A=22WQ%mvv4FO#n7@HWUB= literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0202.png b/tiled/assets/grid_game_objects/tile_0202.png new file mode 100644 index 0000000000000000000000000000000000000000..dfd9a4143e548c637ccfe5ae11fea5d54aacb40d GIT binary patch literal 189 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF_?C4w9=DE_6(2>+0?n)^a{_^r+w&0bX9-BkN}9 f9zA+gw~>)S^ODpJ^U16r;~6|%{an^LB{Ts5T^u@M literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0203.png b/tiled/assets/grid_game_objects/tile_0203.png new file mode 100644 index 0000000000000000000000000000000000000000..d68aac22582efa438809909aba480c056d36a3fc GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFNuF_lRxPs^Mg$oG=hk!lvI6-$0X`wF zjis{>AA31-))99j?@ytz96)h7PZ!4!j_b)kwq{+`YFqE^>?~PV$QZf*-~a#qoQw=x X&si&cG_bP0l+XkK0;wh& literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0205.png b/tiled/assets/grid_game_objects/tile_0205.png new file mode 100644 index 0000000000000000000000000000000000000000..91267e6f33c2dcbed341ba551f373094e0f497ee GIT binary patch literal 127 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zjis{>AA31-))99j?@ytz96)h7PZ!4!j_b)0TeGfKwOzQdqM|Kywb+{UAOHW`yRtC+ X{%%$vS-|=OsFK0c)z4*}Q$iB}Kr|?5 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0206.png b/tiled/assets/grid_game_objects/tile_0206.png new file mode 100644 index 0000000000000000000000000000000000000000..28795ce45976727b78164f0653035f5f755ba38a GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFxVHd|Pwzjr5CF6!$Q>RS%@Y*S<MX5 zp`cj;kipH{XcUszb45TrUBpdjmPba$3Joo1Pft(NBZAxY98=f=!Zm!XXD~9H-=-$g T_~BM9&>RL&S3j3^P6 z0udG_L50JnA{8168$5CA6D1+HT WxvNfF)+qpuW$<+Mb6Mw<&;$TYiZN>d literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0209.png b/tiled/assets/grid_game_objects/tile_0209.png new file mode 100644 index 0000000000000000000000000000000000000000..7004eac842b4e828440d91061f3d9ae44486b322 GIT binary patch literal 173 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF*nd=7{YNqnWL1kIiM{-Ra{kp$tXr5rh(%~ zfglerFQd_%DLoe@PZ_isPI;K~h9_0xpoG_!lvI6-$0X`wF zjis{>AA31-))99j?@ytz96)h-PZ!4!j_b)kwq{+eYFqEU_>p8?p>D+a55NEa|2{>4 ZVbMCPoUa^r<^z>7c)I$ztaD0e0sxvZD$4)> literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0211.png b/tiled/assets/grid_game_objects/tile_0211.png new file mode 100644 index 0000000000000000000000000000000000000000..ac5a67df455589fb2af720b368cd873a5ed1bc3b GIT binary patch literal 164 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFdsi{RU8ou_VYZn8D%MjWi&~*we)^gyVX0LIY!3GDm_zoAI0} z2O17WaGnzoF)wE$09L literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0212.png b/tiled/assets/grid_game_objects/tile_0212.png new file mode 100644 index 0000000000000000000000000000000000000000..9b93ff3056920491a3f4c2bd52ea35f9d11d3273 GIT binary patch literal 156 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFMhkWE@~%NM0to{GeJ{F;E+Wr>mdKI;Vst0GB)}V*mgE literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0213.png b/tiled/assets/grid_game_objects/tile_0213.png new file mode 100644 index 0000000000000000000000000000000000000000..c23c2d5490e6d2f68c4fed4ef98a5c14c402ba4e GIT binary patch literal 171 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFmdKI;Vst00nz7=l}o! literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0214.png b/tiled/assets/grid_game_objects/tile_0214.png new file mode 100644 index 0000000000000000000000000000000000000000..2abdcbf6aac71e096a76c5d2cf31f4db0bca9bf9 GIT binary patch literal 151 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&W-sjKjxXx*K`Fotp3fD92b5{MC@CXnPXk@w08Up!i7Cts Y=IQD!Yo2m20nK6XboFyt=akR{0HGf@!~g&Q literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0217.png b/tiled/assets/grid_game_objects/tile_0217.png new file mode 100644 index 0000000000000000000000000000000000000000..2b90ad481e5293423cf9a2b88d5387cdb81995dd GIT binary patch literal 193 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF&V@7pToyqx*K^-Re&dJIouAqEYg5%Nz$pX#k7q*xfIPbObT)T(kga>=3-r@5e-d;h$%rh6O k%$TOOq9sW|VhS_E#fJuwpKbnc1RBZU>FVdQ&MBb@0B~eH#Q*>R literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0218.png b/tiled/assets/grid_game_objects/tile_0218.png new file mode 100644 index 0000000000000000000000000000000000000000..f2c4a56ec11710b5f1e5961e6351857c5ea4ce7e GIT binary patch literal 184 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF`K$93eUHx3vIVCg!0N;;2rT_o{ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0219.png b/tiled/assets/grid_game_objects/tile_0219.png new file mode 100644 index 0000000000000000000000000000000000000000..40fe5b2d72abaa2395ba0e526c137b40d0a787dd GIT binary patch literal 196 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFD%h@RkJGxTxf5f)WX4`K7s3J~CMaoiQta6q*6p~#X|O{WUX%*+apE|Or7 XKQ676#P`(Eal|aXmSqq1nVB zAt9mJKuF?7(9{M6o)aEMY)qyCheJ#ZB&IS>XVPRd42o$uzjJI9BFU>n#kbk>gTe~DWM4fQzJLT literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0222.png b/tiled/assets/grid_game_objects/tile_0222.png new file mode 100644 index 0000000000000000000000000000000000000000..ff9a612018b0475622dd2d74b2a00b174aad9332 GIT binary patch literal 198 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF4-?*@OcJ4lpK~7!+)oy>zK+ID=$vnrGHY$%M8^LQ@#U8CNkHN-?vtx~e+tx^w!p px7LB4O9dLrCL(hgr!#4@FuFU&4zbYM9Wz{DgNMpUXO@ GgeCwGfG}#j+S3j3^P6V4QOuHOV(v=o9Fcabuf6k`njxgN@xNA3-2mK literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0226.png b/tiled/assets/grid_game_objects/tile_0226.png new file mode 100644 index 0000000000000000000000000000000000000000..c8da18ac9e64d320a04d4b771f565c65f36a275f GIT binary patch literal 145 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!93?!50ihlx9Ea{HEjtmSN`?>!lvI6-$0X`wF zK>Gg5jw3aN?nd5k?kju+@)=8l{DK)Ap4~_Ta+Ez?978y+Cnq>Cf2(ge^8dfXqiUN8 lKeozE{!t~rjAe}k(4>}f0mtmydQw2;44$rjF6*2UngC!8D%=17 literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0227.png b/tiled/assets/grid_game_objects/tile_0227.png new file mode 100644 index 0000000000000000000000000000000000000000..35824346749418d09b27f1a1a99ef58622abc4e8 GIT binary patch literal 159 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF?M5RU7~2?y9?8W>zQH%Ra) zv`yZ)k!!}o9G#4&V*zGuoeq)(M-AQjz z4;*V?P-#{48`=rh(6g{bht=fJ(Hj;bv&$qH7}i$E VzU#KP76qEc;OXk;vd$@?2>>T!F;@Tp literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0231.png b/tiled/assets/grid_game_objects/tile_0231.png new file mode 100644 index 0000000000000000000000000000000000000000..4c55985ba5c7761a7c42f2c9454f9ecf969419d6 GIT binary patch literal 179 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPF=0Zn7@boFyt=akR{0D4X>>Hq)$ literal 0 HcmV?d00001 diff --git a/tiled/assets/grid_game_objects/tile_0232.png b/tiled/assets/grid_game_objects/tile_0232.png new file mode 100644 index 0000000000000000000000000000000000000000..3905d29570365f651bd7035d2f19271edafe3514 GIT binary patch literal 177 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!73?$#)eFPFgTe~DWM4f)oL%j literal 0 HcmV?d00001 diff --git a/tiled/export/grid-grid_items.tilemap b/tiled/export/grid-grid_items.tilemap index 79bbcca..be54730 100644 --- a/tiled/export/grid-grid_items.tilemap +++ b/tiled/export/grid-grid_items.tilemap @@ -1,49 +1,31 @@ tile_set: "/example/assets/grid/grid_ignore_export.tilesource" layers { id: "tile_items" - z: 0.00019999999494757503 - is_visible: 1 - cell { - x: 4 - y: 6 - tile: 10 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 13 - y: 14 - tile: 9 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } + z: 2.0E-4 cell { x: 16 y: 3 tile: 11 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 18 y: 5 tile: 9 - h_flip: 0 - v_flip: 0 - rotate90: 0 + } + cell { + x: 4 + y: 6 + tile: 10 + } + cell { + x: 13 + y: 14 + tile: 9 } cell { x: 22 y: 14 tile: 9 - h_flip: 0 - v_flip: 0 - rotate90: 0 } } - material: "/builtins/materials/tile_map.material" -blend_mode: BLEND_MODE_ALPHA diff --git a/tiled/export/grid-grid_tileset.tilemap b/tiled/export/grid-grid_tileset.tilemap index 0dd8e63..5398ff5 100644 --- a/tiled/export/grid-grid_tileset.tilemap +++ b/tiled/export/grid-grid_tileset.tilemap @@ -1,5430 +1,3395 @@ tile_set: "/example/assets/grid/grid_tileset.tilesource" layers { id: "back" - z: 0 - is_visible: 1 + z: 0.0 cell { x: 0 - y: 19 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 0 - y: 18 + y: 0 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 0 - y: 17 + x: 1 + y: 0 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 0 - y: 16 + x: 2 + y: 0 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 0 - y: 15 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 3 + y: 0 + tile: 65 } cell { - x: 0 - y: 14 + x: 4 + y: 0 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 0 - y: 13 + x: 5 + y: 0 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 0 - y: 12 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 6 + y: 0 + tile: 65 } cell { - x: 0 - y: 11 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 7 + y: 0 + tile: 65 } cell { - x: 0 - y: 10 + x: 8 + y: 0 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 0 - y: 9 + x: 9 + y: 0 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 0 - y: 8 + x: 10 + y: 0 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 0 - y: 7 + x: 11 + y: 0 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 0 - y: 6 + x: 12 + y: 0 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 0 - y: 5 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 13 + y: 0 + tile: 65 } cell { - x: 0 - y: 4 + x: 14 + y: 0 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 0 - y: 3 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 0 + tile: 65 } cell { - x: 0 - y: 2 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 16 + y: 0 + tile: 64 } cell { - x: 0 - y: 1 + x: 17 + y: 0 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 0 + x: 18 y: 0 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 19 + x: 19 + y: 0 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 1 - y: 18 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 17 + x: 20 + y: 0 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 16 + x: 21 + y: 0 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 15 + x: 22 + y: 0 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 14 + x: 23 + y: 0 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 13 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 24 + y: 0 + tile: 64 } cell { - x: 1 - y: 12 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 25 + y: 0 + tile: 64 } cell { - x: 1 - y: 11 + x: 26 + y: 0 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 10 + x: 27 + y: 0 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 9 + x: 28 + y: 0 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 8 + x: 29 + y: 0 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 7 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 0 + y: 1 + tile: 65 } cell { x: 1 - y: 6 + y: 1 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 5 + x: 2 + y: 1 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 4 + x: 3 + y: 1 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 3 + x: 4 + y: 1 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 1 - y: 2 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 5 + y: 1 + tile: 64 } cell { - x: 1 + x: 6 y: 1 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + tile: 64 } cell { - x: 1 - y: 0 + x: 7 + y: 1 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 19 + x: 8 + y: 1 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 18 + x: 9 + y: 1 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 17 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 10 + y: 1 + tile: 64 } cell { - x: 2 - y: 16 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 11 + y: 1 + tile: 64 } cell { - x: 2 - y: 15 + x: 12 + y: 1 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 14 + x: 13 + y: 1 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 13 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 14 + y: 1 + tile: 64 } cell { - x: 2 - y: 12 + x: 15 + y: 1 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 11 + x: 16 + y: 1 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 10 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 17 + y: 1 + tile: 65 } cell { - x: 2 - y: 9 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 18 + y: 1 + tile: 64 } cell { - x: 2 - y: 8 + x: 19 + y: 1 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 7 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 20 + y: 1 + tile: 64 } cell { - x: 2 - y: 6 + x: 21 + y: 1 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 5 + x: 22 + y: 1 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 4 + x: 23 + y: 1 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 3 + x: 24 + y: 1 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 2 + x: 25 + y: 1 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 + x: 26 y: 1 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 2 - y: 0 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 27 + y: 1 + tile: 65 } cell { - x: 3 - y: 19 + x: 28 + y: 1 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 18 + x: 29 + y: 1 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 17 + x: 0 + y: 2 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 16 + x: 1 + y: 2 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 15 + x: 2 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 3 - y: 14 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 3 - y: 13 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 12 + x: 4 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 11 + x: 5 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 10 + x: 6 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 9 + x: 7 + y: 2 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 8 + x: 8 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 7 + x: 9 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 6 + x: 10 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 5 + x: 11 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 4 + x: 12 + y: 2 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 3 + x: 13 + y: 2 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 + x: 14 y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 3 - y: 1 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 2 + tile: 65 } cell { - x: 3 - y: 0 + x: 16 + y: 2 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 19 + x: 17 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 18 + x: 18 + y: 2 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 17 + x: 19 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 16 + x: 20 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 15 + x: 21 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 14 + x: 22 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 13 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 23 + y: 2 + tile: 64 } cell { - x: 4 - y: 12 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 24 + y: 2 + tile: 64 } cell { - x: 4 - y: 11 + x: 25 + y: 2 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 10 + x: 26 + y: 2 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 9 + x: 27 + y: 2 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 8 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 28 + y: 2 + tile: 65 } cell { - x: 4 - y: 7 + x: 29 + y: 2 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 6 + x: 0 + y: 3 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 5 + x: 1 + y: 3 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 - y: 4 + x: 2 + y: 3 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 4 + x: 3 y: 3 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 4 - y: 2 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 4 - y: 1 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 4 - y: 0 + y: 3 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 5 - y: 19 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 5 - y: 18 + y: 3 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 5 - y: 17 + x: 6 + y: 3 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 5 - y: 16 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 7 + y: 3 + tile: 65 } cell { - x: 5 - y: 15 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 8 + y: 3 + tile: 65 } cell { - x: 5 - y: 14 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 9 + y: 3 + tile: 65 } cell { - x: 5 - y: 13 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 10 + y: 3 + tile: 65 } cell { - x: 5 - y: 12 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 11 + y: 3 + tile: 65 } cell { - x: 5 - y: 11 + x: 12 + y: 3 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 5 - y: 10 + x: 13 + y: 3 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 5 - y: 9 + x: 14 + y: 3 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 5 - y: 8 + x: 15 + y: 3 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 5 - y: 7 + x: 16 + y: 3 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 5 - y: 6 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 5 - y: 5 + x: 17 + y: 3 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 5 - y: 4 + x: 18 + y: 3 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 5 + x: 19 y: 3 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 5 - y: 2 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 5 - y: 1 + x: 20 + y: 3 + tile: 65 + } + cell { + x: 21 + y: 3 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 5 - y: 0 + x: 22 + y: 3 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 6 - y: 19 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 23 + y: 3 + tile: 64 } cell { - x: 6 - y: 18 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 24 + y: 3 + tile: 64 } cell { - x: 6 - y: 17 + x: 25 + y: 3 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 6 - y: 16 + x: 26 + y: 3 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 6 - y: 15 + x: 27 + y: 3 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 6 - y: 14 + x: 28 + y: 3 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 6 - y: 13 - tile: 154 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 29 + y: 3 + tile: 64 } cell { - x: 6 - y: 12 - tile: 172 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 0 + y: 4 + tile: 64 } cell { - x: 6 - y: 11 - tile: 190 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 1 + y: 4 + tile: 64 } cell { - x: 6 - y: 10 - tile: 90 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 2 + y: 4 + tile: 65 } cell { - x: 6 - y: 9 - tile: 108 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 3 + y: 4 + tile: 65 } cell { - x: 6 - y: 8 - tile: 126 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 4 + y: 4 + tile: 65 } cell { - x: 6 - y: 7 + x: 5 + y: 4 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 6 - y: 6 + y: 4 + tile: 64 + } + cell { + x: 7 + y: 4 + tile: 64 + } + cell { + x: 8 + y: 4 + tile: 64 + } + cell { + x: 9 + y: 4 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 6 - y: 5 + x: 10 + y: 4 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 6 + x: 11 + y: 4 + tile: 65 + } + cell { + x: 12 + y: 4 + tile: 65 + } + cell { + x: 13 y: 4 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 6 - y: 3 + x: 14 + y: 4 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 6 - y: 2 + x: 15 + y: 4 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 6 - y: 1 + x: 16 + y: 4 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 6 - y: 0 + x: 17 + y: 4 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 - y: 19 + x: 18 + y: 4 + tile: 65 + } + cell { + x: 19 + y: 4 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 - y: 18 + x: 20 + y: 4 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 - y: 17 + x: 21 + y: 4 + tile: 64 + } + cell { + x: 22 + y: 4 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 - y: 16 + x: 23 + y: 4 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 - y: 15 + x: 24 + y: 4 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 - y: 14 + x: 25 + y: 4 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 7 - y: 13 - tile: 155 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 - y: 12 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 26 + y: 4 + tile: 64 } cell { - x: 7 - y: 11 - tile: 191 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 27 + y: 4 + tile: 64 } cell { - x: 7 - y: 10 - tile: 91 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 28 + y: 4 + tile: 65 } cell { - x: 7 - y: 9 - tile: 109 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 29 + y: 4 + tile: 65 } cell { - x: 7 - y: 8 - tile: 127 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 0 + y: 5 + tile: 64 } cell { - x: 7 - y: 7 + x: 1 + y: 5 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 - y: 6 + x: 2 + y: 5 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 + x: 3 y: 5 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 - y: 4 + x: 4 + y: 5 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 - y: 3 + x: 5 + y: 5 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 - y: 2 + x: 6 + y: 5 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 7 - y: 1 + y: 5 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 7 - y: 0 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 8 + y: 5 + tile: 64 } cell { - x: 8 - y: 19 + x: 9 + y: 5 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 8 - y: 18 + x: 10 + y: 5 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 8 - y: 17 + x: 11 + y: 5 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 8 - y: 16 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 12 + y: 5 + tile: 64 } cell { - x: 8 - y: 15 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 13 + y: 5 + tile: 64 } cell { - x: 8 - y: 14 + x: 14 + y: 5 + tile: 64 + } + cell { + x: 15 + y: 5 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 8 - y: 13 - tile: 156 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 16 + y: 5 + tile: 64 } cell { - x: 8 - y: 12 - tile: 174 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 17 + y: 5 + tile: 65 } cell { - x: 8 - y: 11 - tile: 192 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 18 + y: 5 + tile: 64 } cell { - x: 8 - y: 10 - tile: 92 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 19 + y: 5 + tile: 65 } cell { - x: 8 - y: 9 - tile: 110 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 20 + y: 5 + tile: 64 } cell { - x: 8 - y: 8 - tile: 128 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 21 + y: 5 + tile: 64 } cell { - x: 8 - y: 7 + x: 22 + y: 5 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 8 - y: 6 + x: 23 + y: 5 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 8 + x: 24 y: 5 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + tile: 65 } cell { - x: 8 - y: 4 + x: 25 + y: 5 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 8 - y: 3 + x: 26 + y: 5 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 8 - y: 2 + x: 27 + y: 5 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 8 - y: 1 + x: 28 + y: 5 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 8 - y: 0 + x: 29 + y: 5 + tile: 65 + } + cell { + x: 0 + y: 6 + tile: 65 + } + cell { + x: 1 + y: 6 + tile: 65 + } + cell { + x: 2 + y: 6 + tile: 65 + } + cell { + x: 3 + y: 6 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 - y: 19 + x: 4 + y: 6 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 - y: 18 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 5 + y: 6 + tile: 64 } cell { - x: 9 - y: 17 + x: 6 + y: 6 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 - y: 16 + x: 7 + y: 6 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 - y: 15 + x: 8 + y: 6 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 9 - y: 14 + y: 6 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 - y: 13 - tile: 100 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 10 + y: 6 + tile: 65 } cell { - x: 9 - y: 12 - tile: 118 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 11 + y: 6 + tile: 65 } cell { - x: 9 - y: 11 - tile: 136 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 12 + y: 6 + tile: 64 } cell { - x: 9 - y: 10 - tile: 95 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 13 + y: 6 + tile: 64 } cell { - x: 9 - y: 9 - tile: 113 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 14 + y: 6 + tile: 65 } cell { - x: 9 - y: 8 - tile: 131 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 6 + tile: 64 } cell { - x: 9 - y: 7 + x: 16 + y: 6 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 + x: 17 y: 6 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 9 - y: 5 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 - y: 4 + x: 18 + y: 6 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 - y: 3 + x: 19 + y: 6 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 - y: 2 + x: 20 + y: 6 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 - y: 1 + x: 21 + y: 6 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 - y: 0 + x: 22 + y: 6 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 10 - y: 19 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 23 + y: 6 + tile: 64 } cell { - x: 10 - y: 18 + x: 24 + y: 6 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 10 - y: 17 + x: 25 + y: 6 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 10 - y: 16 + x: 26 + y: 6 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 10 - y: 15 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 10 - y: 14 + x: 27 + y: 6 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 10 - y: 13 - tile: 101 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 28 + y: 6 + tile: 65 } cell { - x: 10 - y: 12 - tile: 119 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 29 + y: 6 + tile: 64 } cell { - x: 10 - y: 11 - tile: 137 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 0 + y: 7 + tile: 65 } cell { - x: 10 - y: 10 - tile: 96 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 1 + y: 7 + tile: 64 } cell { - x: 10 - y: 9 - tile: 114 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 2 + y: 7 + tile: 65 } cell { - x: 10 - y: 8 - tile: 132 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 3 + y: 7 + tile: 64 } cell { - x: 10 + x: 4 y: 7 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 10 - y: 6 + x: 5 + y: 7 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 10 - y: 5 + x: 6 + y: 7 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 10 - y: 4 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 7 + y: 7 + tile: 64 } cell { - x: 10 - y: 3 + x: 8 + y: 7 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 10 - y: 2 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 9 + y: 7 + tile: 65 } cell { x: 10 - y: 1 + y: 7 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 10 - y: 0 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 11 - y: 19 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + y: 7 + tile: 64 } cell { - x: 11 - y: 18 + x: 12 + y: 7 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 11 - y: 17 + x: 13 + y: 7 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 11 - y: 16 + x: 14 + y: 7 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 11 - y: 15 + x: 15 + y: 7 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 11 - y: 14 + x: 16 + y: 7 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 11 - y: 13 - tile: 102 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 11 - y: 12 - tile: 120 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 11 - y: 11 - tile: 138 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 17 + y: 7 + tile: 64 } cell { - x: 11 - y: 10 - tile: 97 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 18 + y: 7 + tile: 64 } cell { - x: 11 - y: 9 - tile: 115 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 19 + y: 7 + tile: 65 } cell { - x: 11 - y: 8 - tile: 133 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 20 + y: 7 + tile: 65 } cell { - x: 11 + x: 21 y: 7 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 11 - y: 6 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 11 - y: 5 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 22 + y: 7 + tile: 64 } cell { - x: 11 - y: 4 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 23 + y: 7 + tile: 64 } cell { - x: 11 - y: 3 + x: 24 + y: 7 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 11 - y: 2 + x: 25 + y: 7 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 11 - y: 1 + x: 26 + y: 7 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 11 - y: 0 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 19 + x: 27 + y: 7 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 18 + x: 28 + y: 7 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 17 + x: 29 + y: 7 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 16 + x: 0 + y: 8 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 15 + x: 1 + y: 8 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 14 + x: 2 + y: 8 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 13 + x: 3 + y: 8 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 12 + x: 4 + y: 8 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 11 + x: 5 + y: 8 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 10 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 6 + y: 8 + tile: 126 } cell { - x: 12 - y: 9 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 7 + y: 8 + tile: 127 } cell { - x: 12 + x: 8 y: 8 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + tile: 128 } cell { - x: 12 - y: 7 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 9 + y: 8 + tile: 131 + } + cell { + x: 10 + y: 8 + tile: 132 + } + cell { + x: 11 + y: 8 + tile: 133 } cell { x: 12 - y: 6 + y: 8 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 5 + x: 13 + y: 8 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 4 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 14 + y: 8 + tile: 64 } cell { - x: 12 - y: 3 + x: 15 + y: 8 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 2 + x: 16 + y: 8 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 12 - y: 1 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 17 + y: 8 + tile: 65 } cell { - x: 12 - y: 0 + x: 18 + y: 8 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 13 - y: 19 + x: 19 + y: 8 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 13 - y: 18 + x: 20 + y: 8 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 13 - y: 17 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 21 + y: 8 + tile: 65 } cell { - x: 13 - y: 16 + x: 22 + y: 8 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 13 - y: 15 + x: 23 + y: 8 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 13 - y: 14 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 24 + y: 8 + tile: 65 } cell { - x: 13 - y: 13 + x: 25 + y: 8 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 13 - y: 12 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 26 + y: 8 + tile: 64 } cell { - x: 13 - y: 11 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 27 + y: 8 + tile: 64 } cell { - x: 13 - y: 10 + x: 28 + y: 8 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 13 - y: 9 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 13 + x: 29 y: 8 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + tile: 65 } cell { - x: 13 - y: 7 + x: 0 + y: 9 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 13 - y: 6 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 1 + y: 9 + tile: 65 } cell { - x: 13 - y: 5 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 2 + y: 9 + tile: 65 } cell { - x: 13 - y: 4 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 3 + y: 9 + tile: 65 } cell { - x: 13 - y: 3 + x: 4 + y: 9 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 13 - y: 2 + x: 5 + y: 9 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 13 - y: 1 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 6 + y: 9 + tile: 108 } cell { - x: 13 - y: 0 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 7 + y: 9 + tile: 109 } cell { - x: 14 - y: 19 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 8 + y: 9 + tile: 110 } cell { - x: 14 - y: 18 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 9 + y: 9 + tile: 113 } cell { - x: 14 - y: 17 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 10 + y: 9 + tile: 114 } cell { - x: 14 - y: 16 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 11 + y: 9 + tile: 115 } cell { - x: 14 - y: 15 + x: 12 + y: 9 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 14 + x: 13 + y: 9 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 14 - y: 13 + y: 9 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 12 + x: 15 + y: 9 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 11 + x: 16 + y: 9 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 10 + x: 17 + y: 9 + tile: 65 + } + cell { + x: 18 + y: 9 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 + x: 19 y: 9 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 8 + x: 20 + y: 9 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 7 + x: 21 + y: 9 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 6 + x: 22 + y: 9 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 5 + x: 23 + y: 9 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 4 + x: 24 + y: 9 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 3 + x: 25 + y: 9 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 2 + x: 26 + y: 9 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 1 + x: 27 + y: 9 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 0 + x: 28 + y: 9 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 19 + x: 29 + y: 9 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 18 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 0 + y: 10 + tile: 64 } cell { - x: 15 - y: 17 + x: 1 + y: 10 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 16 + x: 2 + y: 10 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 15 + x: 3 + y: 10 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 14 + x: 4 + y: 10 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 13 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 5 + y: 10 + tile: 65 } cell { - x: 15 - y: 12 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 6 + y: 10 + tile: 90 } cell { - x: 15 - y: 11 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 7 + y: 10 + tile: 91 } cell { - x: 15 + x: 8 y: 10 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + tile: 92 } cell { - x: 15 - y: 9 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 9 + y: 10 + tile: 95 } cell { - x: 15 - y: 8 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 10 + y: 10 + tile: 96 } cell { - x: 15 - y: 7 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 11 + y: 10 + tile: 97 } cell { - x: 15 - y: 6 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 12 + y: 10 + tile: 65 } cell { - x: 15 - y: 5 + x: 13 + y: 10 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 4 + x: 14 + y: 10 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 15 - y: 3 + y: 10 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 2 + x: 16 + y: 10 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 1 + x: 17 + y: 10 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 0 + x: 18 + y: 10 + tile: 64 + } + cell { + x: 19 + y: 10 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 19 + x: 20 + y: 10 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 18 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 21 + y: 10 + tile: 65 } cell { - x: 16 - y: 17 + x: 22 + y: 10 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 16 + x: 23 + y: 10 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 15 + x: 24 + y: 10 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 14 + x: 25 + y: 10 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 13 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 26 + y: 10 + tile: 65 } cell { - x: 16 - y: 12 + x: 27 + y: 10 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 11 + x: 28 + y: 10 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 + x: 29 y: 10 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 9 + x: 0 + y: 11 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 16 - y: 8 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 7 + x: 1 + y: 11 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 6 + x: 2 + y: 11 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 5 + x: 3 + y: 11 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 4 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 4 + y: 11 + tile: 65 } cell { - x: 16 - y: 3 + x: 5 + y: 11 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 2 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 6 + y: 11 + tile: 190 } cell { - x: 16 - y: 1 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 7 + y: 11 + tile: 191 } cell { - x: 16 - y: 0 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 8 + y: 11 + tile: 192 } cell { - x: 17 - y: 19 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 9 + y: 11 + tile: 136 } cell { - x: 17 - y: 18 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 10 + y: 11 + tile: 137 } cell { - x: 17 - y: 17 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 11 + y: 11 + tile: 138 } cell { - x: 17 - y: 16 + x: 12 + y: 11 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 15 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 13 + y: 11 + tile: 65 } cell { - x: 17 - y: 14 + x: 14 + y: 11 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 13 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 11 + tile: 65 } cell { - x: 17 - y: 12 + x: 16 + y: 11 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 17 y: 11 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 10 + x: 18 + y: 11 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 9 + x: 19 + y: 11 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 8 + x: 20 + y: 11 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 7 + x: 21 + y: 11 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 6 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 22 + y: 11 + tile: 64 } cell { - x: 17 - y: 5 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 23 + y: 11 + tile: 64 } cell { - x: 17 - y: 4 + x: 24 + y: 11 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 3 + x: 25 + y: 11 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 2 + x: 26 + y: 11 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 1 + x: 27 + y: 11 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 0 + x: 28 + y: 11 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 19 + x: 29 + y: 11 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 18 + x: 0 + y: 12 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 17 + x: 1 + y: 12 + tile: 65 + } + cell { + x: 2 + y: 12 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 16 + x: 3 + y: 12 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 15 + x: 4 + y: 12 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 14 + x: 5 + y: 12 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 13 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 6 + y: 12 + tile: 172 } cell { - x: 18 + x: 7 y: 12 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + tile: 173 } cell { - x: 18 - y: 11 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 8 + y: 12 + tile: 174 } cell { - x: 18 - y: 10 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 9 + y: 12 + tile: 118 } cell { - x: 18 - y: 9 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 10 + y: 12 + tile: 119 } cell { - x: 18 - y: 8 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 11 + y: 12 + tile: 120 } cell { - x: 18 - y: 7 + x: 12 + y: 12 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 6 + x: 13 + y: 12 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 5 + x: 14 + y: 12 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 4 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 12 + tile: 64 } cell { - x: 18 - y: 3 + x: 16 + y: 12 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 2 + x: 17 + y: 12 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 18 - y: 1 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 18 - y: 0 + y: 12 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 19 - y: 19 + y: 12 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 18 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 20 + y: 12 + tile: 65 } cell { - x: 19 - y: 17 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 21 + y: 12 + tile: 65 } cell { - x: 19 - y: 16 + x: 22 + y: 12 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 15 + x: 23 + y: 12 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 14 + x: 24 + y: 12 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 13 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 25 + y: 12 + tile: 64 } cell { - x: 19 + x: 26 y: 12 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 11 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 27 + y: 12 + tile: 64 } cell { - x: 19 - y: 10 + x: 28 + y: 12 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 9 + x: 29 + y: 12 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 8 + x: 0 + y: 13 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 7 + x: 1 + y: 13 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 6 + x: 2 + y: 13 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 5 + x: 3 + y: 13 + tile: 64 + } + cell { + x: 4 + y: 13 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 4 + x: 5 + y: 13 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 3 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 6 + y: 13 + tile: 154 + } + cell { + x: 7 + y: 13 + tile: 155 + } + cell { + x: 8 + y: 13 + tile: 156 + } + cell { + x: 9 + y: 13 + tile: 100 + } + cell { + x: 10 + y: 13 + tile: 101 } cell { - x: 19 - y: 2 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 11 + y: 13 + tile: 102 } cell { - x: 19 - y: 1 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 12 + y: 13 + tile: 64 } cell { - x: 19 - y: 0 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 13 + y: 13 + tile: 64 } cell { - x: 20 - y: 19 + x: 14 + y: 13 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 18 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 13 + tile: 64 } cell { - x: 20 - y: 17 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 16 + y: 13 + tile: 64 } cell { - x: 20 - y: 16 + x: 17 + y: 13 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 15 + x: 18 + y: 13 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 14 + x: 19 + y: 13 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 20 y: 13 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 12 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 21 + y: 13 + tile: 64 } cell { - x: 20 - y: 11 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 22 + y: 13 + tile: 64 } cell { - x: 20 - y: 10 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 23 + y: 13 + tile: 64 } cell { - x: 20 - y: 9 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 24 + y: 13 + tile: 65 } cell { - x: 20 - y: 8 + x: 25 + y: 13 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 7 + x: 26 + y: 13 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 6 + x: 27 + y: 13 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 5 + x: 28 + y: 13 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 4 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 29 + y: 13 + tile: 64 } cell { - x: 20 - y: 3 + x: 0 + y: 14 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 2 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 1 + y: 14 + tile: 65 } cell { - x: 20 - y: 1 + x: 2 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 0 + x: 3 + y: 14 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 19 + x: 4 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 18 + x: 5 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 17 + x: 6 + y: 14 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 16 + x: 7 + y: 14 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 15 + x: 8 + y: 14 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 + x: 9 y: 14 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + tile: 64 } cell { - x: 21 - y: 13 + x: 10 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 12 + x: 11 + y: 14 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 21 - y: 11 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 10 + x: 12 + y: 14 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 9 + x: 13 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 21 - y: 8 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 7 + x: 14 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 6 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 14 + tile: 65 } cell { - x: 21 - y: 5 + x: 16 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 4 + x: 17 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 3 + x: 18 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 2 + x: 19 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 1 + x: 20 + y: 14 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 21 - y: 0 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + y: 14 + tile: 65 } cell { x: 22 - y: 19 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 22 - y: 18 + x: 23 + y: 14 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 22 - y: 17 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 22 - y: 16 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 24 + y: 14 + tile: 65 } cell { - x: 22 - y: 15 + x: 25 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 22 + x: 26 y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 22 - y: 13 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 27 + y: 14 + tile: 65 } cell { - x: 22 - y: 12 + x: 28 + y: 14 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 22 - y: 11 + x: 29 + y: 14 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 22 - y: 10 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 22 - y: 9 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 0 + y: 15 + tile: 64 } cell { - x: 22 - y: 8 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 1 + y: 15 + tile: 64 } cell { - x: 22 - y: 7 + x: 2 + y: 15 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 22 - y: 6 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 3 + y: 15 + tile: 64 } cell { - x: 22 - y: 5 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 4 + y: 15 + tile: 64 } cell { - x: 22 - y: 4 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 5 + y: 15 + tile: 64 } cell { - x: 22 - y: 3 + x: 6 + y: 15 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 22 - y: 2 + x: 7 + y: 15 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 22 - y: 1 + x: 8 + y: 15 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 22 - y: 0 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 9 + y: 15 + tile: 65 } cell { - x: 23 - y: 19 + x: 10 + y: 15 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 18 + x: 11 + y: 15 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 17 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 23 - y: 16 + x: 12 + y: 15 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 + x: 13 y: 15 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 14 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 14 + y: 15 + tile: 64 } cell { - x: 23 - y: 13 + x: 15 + y: 15 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 12 + x: 16 + y: 15 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 11 + x: 17 + y: 15 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 10 + x: 18 + y: 15 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 9 + x: 19 + y: 15 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 8 + x: 20 + y: 15 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 7 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 21 + y: 15 + tile: 65 } cell { - x: 23 - y: 6 + x: 22 + y: 15 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 23 - y: 5 + y: 15 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 4 + x: 24 + y: 15 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 3 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 25 + y: 15 + tile: 65 } cell { - x: 23 - y: 2 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 26 + y: 15 + tile: 65 } cell { - x: 23 - y: 1 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 27 + y: 15 + tile: 64 } cell { - x: 23 - y: 0 + x: 28 + y: 15 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 19 + x: 29 + y: 15 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 18 + x: 0 + y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 24 - y: 17 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 + x: 1 y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 15 + x: 2 + y: 16 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 14 + x: 3 + y: 16 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 13 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 4 + y: 16 + tile: 64 } cell { - x: 24 - y: 12 + x: 5 + y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 11 + x: 6 + y: 16 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 10 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 7 + y: 16 + tile: 65 } cell { - x: 24 - y: 9 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 8 + y: 16 + tile: 65 } cell { - x: 24 - y: 8 + x: 9 + y: 16 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 7 + x: 10 + y: 16 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 6 + x: 11 + y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 5 + x: 12 + y: 16 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 4 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 13 + y: 16 + tile: 65 } cell { - x: 24 - y: 3 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 14 + y: 16 + tile: 65 } cell { - x: 24 - y: 2 + x: 15 + y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 1 + x: 16 + y: 16 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 24 - y: 0 + x: 17 + y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 19 + x: 18 + y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 18 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 19 + y: 16 + tile: 65 } cell { - x: 25 - y: 17 + x: 20 + y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 + x: 21 + y: 16 + tile: 65 + } + cell { + x: 22 y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 15 + x: 23 + y: 16 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 14 + x: 24 + y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 25 - y: 13 + y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 12 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 26 + y: 16 + tile: 65 } cell { - x: 25 - y: 11 + x: 27 + y: 16 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 10 + x: 28 + y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 25 - y: 9 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 8 + x: 29 + y: 16 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 7 + x: 0 + y: 17 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 6 + x: 1 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 5 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 2 + y: 17 + tile: 65 } cell { - x: 25 - y: 4 + x: 3 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 3 + x: 4 + y: 17 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } - cell { - x: 25 - y: 2 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 1 + x: 5 + y: 17 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 25 - y: 0 + x: 6 + y: 17 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 19 + x: 7 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 18 + x: 8 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 + x: 9 y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 16 + x: 10 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 15 + x: 11 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 14 + x: 12 + y: 17 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 13 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 13 + y: 17 + tile: 64 } cell { - x: 26 - y: 12 + x: 14 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 11 + x: 15 + y: 17 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 10 + x: 16 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 9 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 17 + y: 17 + tile: 65 } cell { - x: 26 - y: 8 + x: 18 + y: 17 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 7 + x: 19 + y: 17 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 6 + x: 20 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 5 + x: 21 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 4 + x: 22 + y: 17 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 3 + x: 23 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 2 + x: 24 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 26 - y: 1 + x: 25 + y: 17 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 26 - y: 0 + y: 17 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 27 - y: 19 + y: 17 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 27 - y: 18 + x: 28 + y: 17 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 27 + x: 29 y: 17 + tile: 65 + } + cell { + x: 0 + y: 18 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 27 - y: 16 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 1 + y: 18 + tile: 64 } cell { - x: 27 - y: 15 + x: 2 + y: 18 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 27 - y: 14 + x: 3 + y: 18 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 27 - y: 13 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 4 + y: 18 + tile: 65 } cell { - x: 27 - y: 12 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 5 + y: 18 + tile: 65 } cell { - x: 27 - y: 11 + x: 6 + y: 18 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 27 - y: 10 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 7 + y: 18 + tile: 65 } cell { - x: 27 - y: 9 + x: 8 + y: 18 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 27 - y: 8 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 9 + y: 18 + tile: 65 } cell { - x: 27 - y: 7 + x: 10 + y: 18 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 27 - y: 6 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 11 + y: 18 + tile: 65 } cell { - x: 27 - y: 5 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 12 + y: 18 + tile: 65 } cell { - x: 27 - y: 4 + x: 13 + y: 18 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 27 - y: 3 + x: 14 + y: 18 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 27 - y: 2 + x: 15 + y: 18 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 27 - y: 1 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 16 + y: 18 + tile: 64 } cell { - x: 27 - y: 0 + x: 17 + y: 18 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 - y: 19 + x: 18 + y: 18 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 + x: 19 y: 18 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 - y: 17 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 20 + y: 18 + tile: 65 } cell { - x: 28 - y: 16 + x: 21 + y: 18 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 - y: 15 + x: 22 + y: 18 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 - y: 14 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 23 + y: 18 + tile: 64 } cell { - x: 28 - y: 13 + x: 24 + y: 18 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 - y: 12 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 25 + y: 18 + tile: 64 } cell { - x: 28 - y: 11 + x: 26 + y: 18 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 - y: 10 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 27 + y: 18 + tile: 64 } cell { x: 28 - y: 9 + y: 18 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 - y: 8 + x: 29 + y: 18 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 - y: 7 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 0 + y: 19 + tile: 64 } cell { - x: 28 - y: 6 + x: 1 + y: 19 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 - y: 5 + x: 2 + y: 19 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 - y: 4 + x: 3 + y: 19 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 - y: 3 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 4 + y: 19 + tile: 64 } cell { - x: 28 - y: 2 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 5 + y: 19 + tile: 64 } cell { - x: 28 - y: 1 + x: 6 + y: 19 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 28 - y: 0 + x: 7 + y: 19 + tile: 64 + } + cell { + x: 8 + y: 19 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 + x: 9 y: 19 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 18 + x: 10 + y: 19 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 17 + x: 11 + y: 19 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 16 + x: 12 + y: 19 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 15 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 13 + y: 19 + tile: 64 } cell { - x: 29 - y: 14 + x: 14 + y: 19 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 13 - tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 19 + tile: 65 } cell { - x: 29 - y: 12 + x: 16 + y: 19 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 11 + x: 17 + y: 19 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 10 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 18 + y: 19 + tile: 64 } cell { - x: 29 - y: 9 + x: 19 + y: 19 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 8 + x: 20 + y: 19 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 7 + x: 21 + y: 19 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 6 + x: 22 + y: 19 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 5 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 23 + y: 19 + tile: 64 } cell { - x: 29 - y: 4 + x: 24 + y: 19 tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 3 + x: 25 + y: 19 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 2 + x: 26 + y: 19 + tile: 65 + } + cell { + x: 27 + y: 19 tile: 64 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 29 - y: 1 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 28 + y: 19 + tile: 64 } cell { x: 29 - y: 0 - tile: 65 - h_flip: 0 - v_flip: 0 - rotate90: 0 + y: 19 + tile: 64 } } layers { id: "roads" - z: 9.999999747378752e-05 - is_visible: 1 - cell { - x: 8 - y: 3 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 - } + z: 1.0E-4 cell { x: 8 - y: 2 + y: 0 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 8 - y: 1 + x: 9 + y: 0 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 8 + x: 15 y: 0 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + tile: 172 } cell { - x: 9 - y: 4 + x: 16 + y: 0 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 - y: 3 + x: 8 + y: 1 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 9 - y: 2 + y: 1 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 9 + x: 15 y: 1 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + tile: 172 } cell { - x: 9 - y: 0 + x: 16 + y: 1 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 10 - y: 5 + x: 8 + y: 2 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 10 - y: 4 + x: 9 + y: 2 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 11 - y: 5 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 2 + tile: 172 } cell { - x: 12 - y: 5 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 16 + y: 2 + tile: 193 } cell { - x: 13 - y: 13 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 17 + y: 2 + tile: 175 } cell { - x: 13 - y: 12 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 18 + y: 2 + tile: 176 } cell { - x: 13 - y: 11 + x: 8 + y: 3 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 13 - y: 5 + x: 9 + y: 3 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 11 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 3 + tile: 172 } cell { - x: 14 - y: 10 + x: 16 + y: 3 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 14 - y: 6 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 18 + y: 3 + tile: 172 } cell { - x: 15 - y: 10 + x: 19 + y: 3 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 9 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 20 + y: 3 + tile: 192 } cell { - x: 15 - y: 8 + x: 9 + y: 4 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 7 + x: 10 + y: 4 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 15 - y: 6 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + y: 4 + tile: 154 } cell { - x: 15 + x: 16 y: 4 - tile: 154 - h_flip: 0 - v_flip: 0 - rotate90: 0 + tile: 155 } cell { - x: 15 - y: 3 + x: 18 + y: 4 tile: 172 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 2 + x: 19 + y: 4 tile: 172 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 15 - y: 1 - tile: 172 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 20 + y: 4 + tile: 173 } cell { - x: 15 - y: 0 - tile: 172 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 21 + y: 4 + tile: 174 } cell { - x: 16 - y: 10 - tile: 155 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 10 + y: 5 + tile: 173 } cell { - x: 16 - y: 9 + x: 11 + y: 5 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 4 - tile: 155 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 12 + y: 5 + tile: 173 } cell { - x: 16 - y: 3 + x: 13 + y: 5 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 16 - y: 2 - tile: 193 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 18 + y: 5 + tile: 154 } cell { - x: 16 - y: 1 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 19 + y: 5 + tile: 172 } cell { - x: 16 - y: 0 + x: 20 + y: 5 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 10 - tile: 155 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 21 + y: 5 + tile: 174 } cell { - x: 17 - y: 9 + x: 14 + y: 6 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 17 - y: 2 - tile: 175 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 6 + tile: 173 } cell { - x: 18 - y: 10 - tile: 155 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 19 + y: 6 + tile: 172 } cell { - x: 18 - y: 9 + x: 20 + y: 6 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 5 - tile: 154 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 21 + y: 6 + tile: 174 } cell { - x: 18 - y: 4 - tile: 172 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 7 + tile: 173 } cell { - x: 18 - y: 3 + x: 19 + y: 7 tile: 172 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 18 - y: 2 - tile: 176 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 20 + y: 7 + tile: 173 } cell { - x: 19 - y: 10 - tile: 155 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 21 + y: 7 + tile: 174 } cell { - x: 19 - y: 9 + x: 15 + y: 8 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 19 y: 8 tile: 172 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 19 - y: 7 - tile: 172 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 20 + y: 8 + tile: 173 } cell { - x: 19 - y: 6 - tile: 172 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 21 + y: 8 + tile: 174 } cell { - x: 19 - y: 5 - tile: 172 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 15 + y: 9 + tile: 173 } cell { - x: 19 - y: 4 - tile: 172 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 16 + y: 9 + tile: 173 } cell { - x: 19 - y: 3 + x: 17 + y: 9 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 10 - tile: 155 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 18 + y: 9 + tile: 173 } cell { - x: 20 + x: 19 y: 9 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 20 - y: 8 + y: 9 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 7 + x: 21 + y: 9 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 6 + x: 22 + y: 9 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 5 + x: 14 + y: 10 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 4 + x: 15 + y: 10 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 20 - y: 3 - tile: 192 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 16 + y: 10 + tile: 155 } cell { - x: 21 + x: 17 y: 10 tile: 155 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 21 - y: 9 - tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 18 + y: 10 + tile: 155 } cell { - x: 21 - y: 8 - tile: 174 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 19 + y: 10 + tile: 155 } cell { - x: 21 - y: 7 - tile: 174 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 20 + y: 10 + tile: 155 } cell { x: 21 - y: 6 - tile: 174 - h_flip: 0 - v_flip: 0 - rotate90: 0 + y: 10 + tile: 155 } cell { - x: 21 - y: 5 - tile: 174 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 22 + y: 10 + tile: 173 } cell { - x: 21 - y: 4 - tile: 174 - h_flip: 0 - v_flip: 0 - rotate90: 0 + x: 23 + y: 10 + tile: 173 } cell { - x: 22 - y: 13 + x: 13 + y: 11 + tile: 173 + } + cell { + x: 14 + y: 11 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 22 y: 11 tile: 155 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 22 - y: 10 + x: 23 + y: 11 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 22 - y: 9 + x: 13 + y: 12 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 23 - y: 13 + y: 12 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 12 + x: 13 + y: 13 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { - x: 23 - y: 11 + x: 22 + y: 13 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } cell { x: 23 - y: 10 + y: 13 tile: 173 - h_flip: 0 - v_flip: 0 - rotate90: 0 } } - material: "/builtins/materials/tile_map.material" -blend_mode: BLEND_MODE_ALPHA diff --git a/tiled/maps/grid_game_objects.json b/tiled/maps/grid_game_objects.json index d0d957d..34f4357 100644 --- a/tiled/maps/grid_game_objects.json +++ b/tiled/maps/grid_game_objects.json @@ -3,26 +3,26 @@ "infinite":false, "layers":[ { - "data":[65, 66, 65, 66, 65, 65, 66, 65, 66, 65, 66, 66, 65, 65, 65, 66, 66, 65, 65, 66, 66, 65, 65, 65, 66, 65, 66, 65, 65, 65, - 65, 65, 65, 66, 66, 66, 66, 66, 65, 66, 65, 66, 66, 65, 65, 66, 65, 65, 65, 65, 66, 65, 66, 65, 65, 65, 66, 65, 65, 66, - 65, 66, 66, 66, 65, 65, 65, 66, 66, 66, 66, 66, 65, 65, 66, 65, 66, 66, 65, 65, 66, 66, 65, 66, 66, 65, 66, 65, 65, 66, - 65, 65, 66, 66, 65, 65, 66, 66, 66, 66, 66, 65, 66, 66, 66, 65, 66, 65, 65, 66, 65, 66, 65, 66, 65, 65, 66, 66, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 65, 65, 66, 66, 65, 65, 96, 97, 97, 97, 98, 66, 65, 66, 66, 66, 66, 65, 66, 66, - 66, 66, 65, 66, 65, 65, 66, 66, 66, 65, 65, 66, 66, 65, 65, 66, 114, 115, 115, 115, 116, 66, 65, 66, 66, 65, 65, 66, 66, 65, - 65, 66, 66, 65, 66, 65, 155, 156, 157, 101, 102, 103, 65, 65, 66, 65, 114, 115, 115, 115, 116, 65, 65, 65, 66, 65, 66, 65, 65, 65, - 65, 66, 65, 65, 66, 65, 173, 174, 175, 119, 120, 121, 65, 66, 65, 65, 114, 115, 115, 115, 116, 66, 66, 65, 65, 65, 66, 65, 66, 66, - 65, 66, 66, 65, 66, 66, 191, 192, 193, 137, 138, 139, 65, 66, 65, 66, 132, 133, 133, 133, 134, 65, 65, 65, 66, 66, 65, 66, 66, 65, - 65, 65, 65, 65, 66, 66, 91, 92, 93, 96, 97, 98, 66, 66, 65, 65, 66, 115, 115, 115, 66, 66, 66, 66, 65, 65, 66, 65, 66, 66, - 66, 66, 66, 66, 66, 66, 109, 110, 111, 114, 115, 116, 65, 65, 66, 65, 65, 66, 65, 66, 65, 65, 66, 65, 65, 66, 65, 65, 65, 66, - 66, 66, 66, 65, 65, 65, 127, 128, 129, 132, 133, 134, 65, 65, 65, 66, 66, 66, 66, 65, 65, 66, 66, 66, 66, 65, 65, 65, 66, 66, - 66, 65, 66, 65, 65, 66, 65, 65, 66, 66, 65, 65, 66, 66, 65, 65, 66, 65, 65, 66, 66, 65, 65, 65, 66, 65, 65, 65, 66, 65, - 66, 66, 66, 65, 65, 65, 66, 66, 66, 65, 66, 66, 65, 65, 66, 65, 66, 66, 66, 66, 65, 65, 66, 65, 65, 66, 66, 65, 66, 65, - 65, 65, 66, 65, 65, 66, 66, 65, 65, 66, 65, 66, 65, 65, 65, 66, 65, 66, 65, 66, 65, 65, 66, 66, 66, 65, 66, 65, 65, 66, - 65, 65, 66, 66, 66, 65, 65, 65, 65, 66, 66, 66, 66, 65, 65, 65, 65, 66, 66, 65, 66, 65, 66, 66, 65, 66, 65, 65, 66, 66, - 65, 65, 66, 66, 66, 66, 65, 66, 66, 66, 66, 66, 66, 66, 66, 65, 66, 66, 65, 66, 66, 65, 65, 65, 65, 65, 66, 65, 66, 65, - 66, 66, 65, 65, 65, 65, 65, 66, 65, 65, 65, 65, 66, 66, 65, 66, 66, 65, 66, 65, 65, 65, 65, 65, 65, 66, 66, 66, 66, 65, - 66, 66, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 66, 65, 66, 65, 66, 66, 66, 66, 65, 65, 66, 66, 66, - 65, 65, 65, 66, 66, 65, 66, 66, 65, 66, 66, 66, 66, 66, 65, 66, 65, 66, 65, 66, 66, 65, 65, 66, 65, 65, 66, 65, 66, 66], + "data":[428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 320, 320, 319, 320, 319, 319, 320, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 319, 345, 346, 346, 346, 346, 346, 347, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 319, 363, 364, 364, 364, 364, 364, 365, 319, 320, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 320, 363, 364, 364, 364, 364, 364, 366, 347, 320, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 319, 363, 364, 364, 364, 364, 364, 364, 365, 320, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 320, 363, 364, 364, 364, 364, 364, 364, 365, 319, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 319, 363, 364, 364, 364, 364, 348, 382, 383, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 320, 363, 364, 364, 364, 348, 383, 320, 320, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 319, 381, 382, 382, 382, 383, 320, 319, 319, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 319, 319, 320, 319, 319, 319, 320, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, + 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428, 428], "height":20, "id":1, "name":"back", @@ -35,25 +35,25 @@ }, { "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 350, 351, 351, 351, 352, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 407, 408, 0, 0, 0, 0, 0, 0, 0, 0, 368, 369, 369, 369, 370, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 425, 426, 0, 0, 0, 0, 0, 0, 0, 0, 368, 369, 369, 369, 370, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2147484042, 395, 395, 394, 0, 0, 0, 0, 0, 0, 0, 368, 369, 369, 369, 370, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2147484042, 395, 395, 394, 0, 0, 0, 0, 0, 0, 0, 386, 387, 387, 387, 388, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, 446, 446, 446, 413, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 412, 446, 447, 320, 319, 319, 445, 446, 446, 446, 413, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 429, 319, 319, 319, 319, 320, 320, 320, 319, 320, 445, 446, 413, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 320, 319, 320, 319, 320, 319, 319, 320, 319, 319, 319, 319, 320, 320, 427, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 429, 320, 320, 320, 319, 319, 319, 319, 319, 319, 409, 410, 431, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 429, 319, 319, 320, 319, 319, 319, 319, 320, 409, 431, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 430, 411, 319, 319, 319, 320, 320, 409, 410, 431, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 430, 410, 410, 410, 410, 410, 431, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 0, 0, 156, 174, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 60, 156, 156, 156, 156, 156, 156, 174, 174, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, 174, 174, 174, 174, 174, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60, 174, 0, 0, 0, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 0, 0, 0, 173, 174, 175, 0, 0, 61, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 174, 174, 0, 0, 0, 0, 155, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 155, 156, 0, 173, 173, 174, 175, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 174, 0, 173, 174, 193, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 194, 176, 177, 0, 0, 0, 60, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 174, 174, 0, 0, 0, 0, 0, 173, 174, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "height":20, "id":4, "name":"roads", @@ -66,24 +66,24 @@ }, { "data":[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 299, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 472, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 299, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 477, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 338, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 321, 322, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 318, 0, 339, 340, 0, 0, 337, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 244, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 246, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 479, 0, 0, 0, 0, 0, 0, 0, 479, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], "height":20, "id":3, @@ -196,6 +196,10 @@ { "firstgid":250, "source":":\/automap-tiles.tsx" + }, + { + "firstgid":255, + "source":"..\/tilesets\/grid_game_objects.json" }], "tilewidth":16, "type":"map", diff --git a/tiled/tilesets/grid_game_objects.json b/tiled/tilesets/grid_game_objects.json new file mode 100644 index 0000000..7e11db5 --- /dev/null +++ b/tiled/tilesets/grid_game_objects.json @@ -0,0 +1,1656 @@ +{ "columns":0, + "grid": + { + "height":1, + "orientation":"orthogonal", + "width":1 + }, + "margin":0, + "name":"grid_game_objects", + "spacing":0, + "tilecount":234, + "tiledversion":"1.11.2", + "tileheight":16, + "tiles":[ + { + "id":0, + "image":"..\/assets\/grid_game_objects\/tile_0000.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":1, + "image":"..\/assets\/grid_game_objects\/tile_0001.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":2, + "image":"..\/assets\/grid_game_objects\/tile_0002.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":3, + "image":"..\/assets\/grid_game_objects\/tile_0003.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":4, + "image":"..\/assets\/grid_game_objects\/tile_0004.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":5, + "image":"..\/assets\/grid_game_objects\/tile_0005.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":6, + "image":"..\/assets\/grid_game_objects\/tile_0006.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":7, + "image":"..\/assets\/grid_game_objects\/tile_0007.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":8, + "image":"..\/assets\/grid_game_objects\/tile_0008.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":9, + "image":"..\/assets\/grid_game_objects\/tile_0009.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":10, + "image":"..\/assets\/grid_game_objects\/tile_0010.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":11, + "image":"..\/assets\/grid_game_objects\/tile_0011.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":12, + "image":"..\/assets\/grid_game_objects\/tile_0012.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":13, + "image":"..\/assets\/grid_game_objects\/tile_0013.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":14, + "image":"..\/assets\/grid_game_objects\/tile_0014.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":15, + "image":"..\/assets\/grid_game_objects\/tile_0015.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":16, + "image":"..\/assets\/grid_game_objects\/tile_0016.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":17, + "image":"..\/assets\/grid_game_objects\/tile_0017.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":18, + "image":"..\/assets\/grid_game_objects\/tile_0018.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":19, + "image":"..\/assets\/grid_game_objects\/tile_0019.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":20, + "image":"..\/assets\/grid_game_objects\/tile_0020.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":21, + "image":"..\/assets\/grid_game_objects\/tile_0021.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":22, + "image":"..\/assets\/grid_game_objects\/tile_0022.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":23, + "image":"..\/assets\/grid_game_objects\/tile_0023.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":24, + "image":"..\/assets\/grid_game_objects\/tile_0024.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":25, + "image":"..\/assets\/grid_game_objects\/tile_0025.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":26, + "image":"..\/assets\/grid_game_objects\/tile_0026.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":27, + "image":"..\/assets\/grid_game_objects\/tile_0027.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":28, + "image":"..\/assets\/grid_game_objects\/tile_0028.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":29, + "image":"..\/assets\/grid_game_objects\/tile_0029.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":30, + "image":"..\/assets\/grid_game_objects\/tile_0030.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":31, + "image":"..\/assets\/grid_game_objects\/tile_0031.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":32, + "image":"..\/assets\/grid_game_objects\/tile_0032.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":33, + "image":"..\/assets\/grid_game_objects\/tile_0033.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":34, + "image":"..\/assets\/grid_game_objects\/tile_0034.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":35, + "image":"..\/assets\/grid_game_objects\/tile_0035.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":36, + "image":"..\/assets\/grid_game_objects\/tile_0036.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":37, + "image":"..\/assets\/grid_game_objects\/tile_0037.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":38, + "image":"..\/assets\/grid_game_objects\/tile_0038.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":39, + "image":"..\/assets\/grid_game_objects\/tile_0039.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":40, + "image":"..\/assets\/grid_game_objects\/tile_0040.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":41, + "image":"..\/assets\/grid_game_objects\/tile_0041.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":42, + "image":"..\/assets\/grid_game_objects\/tile_0042.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":43, + "image":"..\/assets\/grid_game_objects\/tile_0043.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":44, + "image":"..\/assets\/grid_game_objects\/tile_0044.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":45, + "image":"..\/assets\/grid_game_objects\/tile_0045.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":46, + "image":"..\/assets\/grid_game_objects\/tile_0046.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":47, + "image":"..\/assets\/grid_game_objects\/tile_0047.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":48, + "image":"..\/assets\/grid_game_objects\/tile_0048.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":49, + "image":"..\/assets\/grid_game_objects\/tile_0049.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":50, + "image":"..\/assets\/grid_game_objects\/tile_0050.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":51, + "image":"..\/assets\/grid_game_objects\/tile_0051.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":52, + "image":"..\/assets\/grid_game_objects\/tile_0052.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":53, + "image":"..\/assets\/grid_game_objects\/tile_0053.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":54, + "image":"..\/assets\/grid_game_objects\/tile_0054.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":55, + "image":"..\/assets\/grid_game_objects\/tile_0055.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":56, + "image":"..\/assets\/grid_game_objects\/tile_0056.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":57, + "image":"..\/assets\/grid_game_objects\/tile_0057.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":58, + "image":"..\/assets\/grid_game_objects\/tile_0058.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":59, + "image":"..\/assets\/grid_game_objects\/tile_0059.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":60, + "image":"..\/assets\/grid_game_objects\/tile_0060.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":61, + "image":"..\/assets\/grid_game_objects\/tile_0061.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":62, + "image":"..\/assets\/grid_game_objects\/tile_0062.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":63, + "image":"..\/assets\/grid_game_objects\/tile_0063.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":64, + "image":"..\/assets\/grid_game_objects\/tile_0064.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":65, + "image":"..\/assets\/grid_game_objects\/tile_0065.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":66, + "image":"..\/assets\/grid_game_objects\/tile_0066.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":67, + "image":"..\/assets\/grid_game_objects\/tile_0067.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":68, + "image":"..\/assets\/grid_game_objects\/tile_0068.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":69, + "image":"..\/assets\/grid_game_objects\/tile_0069.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":70, + "image":"..\/assets\/grid_game_objects\/tile_0070.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":71, + "image":"..\/assets\/grid_game_objects\/tile_0071.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":72, + "image":"..\/assets\/grid_game_objects\/tile_0072.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":73, + "image":"..\/assets\/grid_game_objects\/tile_0073.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":74, + "image":"..\/assets\/grid_game_objects\/tile_0074.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":75, + "image":"..\/assets\/grid_game_objects\/tile_0075.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":76, + "image":"..\/assets\/grid_game_objects\/tile_0076.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":77, + "image":"..\/assets\/grid_game_objects\/tile_0077.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":78, + "image":"..\/assets\/grid_game_objects\/tile_0078.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":79, + "image":"..\/assets\/grid_game_objects\/tile_0079.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":80, + "image":"..\/assets\/grid_game_objects\/tile_0080.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":81, + "image":"..\/assets\/grid_game_objects\/tile_0081.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":82, + "image":"..\/assets\/grid_game_objects\/tile_0082.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":83, + "image":"..\/assets\/grid_game_objects\/tile_0083.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":84, + "image":"..\/assets\/grid_game_objects\/tile_0084.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":85, + "image":"..\/assets\/grid_game_objects\/tile_0085.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":86, + "image":"..\/assets\/grid_game_objects\/tile_0086.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":87, + "image":"..\/assets\/grid_game_objects\/tile_0087.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":88, + "image":"..\/assets\/grid_game_objects\/tile_0088.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":89, + "image":"..\/assets\/grid_game_objects\/tile_0089.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":90, + "image":"..\/assets\/grid_game_objects\/tile_0090.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":91, + "image":"..\/assets\/grid_game_objects\/tile_0091.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":92, + "image":"..\/assets\/grid_game_objects\/tile_0092.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":93, + "image":"..\/assets\/grid_game_objects\/tile_0093.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":94, + "image":"..\/assets\/grid_game_objects\/tile_0094.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":95, + "image":"..\/assets\/grid_game_objects\/tile_0095.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":96, + "image":"..\/assets\/grid_game_objects\/tile_0096.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":97, + "image":"..\/assets\/grid_game_objects\/tile_0097.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":98, + "image":"..\/assets\/grid_game_objects\/tile_0098.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":99, + "image":"..\/assets\/grid_game_objects\/tile_0099.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":100, + "image":"..\/assets\/grid_game_objects\/tile_0100.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":101, + "image":"..\/assets\/grid_game_objects\/tile_0101.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":102, + "image":"..\/assets\/grid_game_objects\/tile_0102.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":103, + "image":"..\/assets\/grid_game_objects\/tile_0103.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":104, + "image":"..\/assets\/grid_game_objects\/tile_0104.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":105, + "image":"..\/assets\/grid_game_objects\/tile_0105.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":106, + "image":"..\/assets\/grid_game_objects\/tile_0106.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":107, + "image":"..\/assets\/grid_game_objects\/tile_0107.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":108, + "image":"..\/assets\/grid_game_objects\/tile_0108.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":109, + "image":"..\/assets\/grid_game_objects\/tile_0109.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":110, + "image":"..\/assets\/grid_game_objects\/tile_0110.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":111, + "image":"..\/assets\/grid_game_objects\/tile_0111.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":112, + "image":"..\/assets\/grid_game_objects\/tile_0112.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":113, + "image":"..\/assets\/grid_game_objects\/tile_0113.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":114, + "image":"..\/assets\/grid_game_objects\/tile_0114.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":115, + "image":"..\/assets\/grid_game_objects\/tile_0115.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":116, + "image":"..\/assets\/grid_game_objects\/tile_0116.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":117, + "image":"..\/assets\/grid_game_objects\/tile_0117.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":118, + "image":"..\/assets\/grid_game_objects\/tile_0118.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":119, + "image":"..\/assets\/grid_game_objects\/tile_0119.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":120, + "image":"..\/assets\/grid_game_objects\/tile_0120.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":121, + "image":"..\/assets\/grid_game_objects\/tile_0121.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":122, + "image":"..\/assets\/grid_game_objects\/tile_0122.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":123, + "image":"..\/assets\/grid_game_objects\/tile_0123.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":124, + "image":"..\/assets\/grid_game_objects\/tile_0124.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":125, + "image":"..\/assets\/grid_game_objects\/tile_0125.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":126, + "image":"..\/assets\/grid_game_objects\/tile_0126.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":127, + "image":"..\/assets\/grid_game_objects\/tile_0127.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":128, + "image":"..\/assets\/grid_game_objects\/tile_0128.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":129, + "image":"..\/assets\/grid_game_objects\/tile_0129.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":130, + "image":"..\/assets\/grid_game_objects\/tile_0130.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":131, + "image":"..\/assets\/grid_game_objects\/tile_0131.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":132, + "image":"..\/assets\/grid_game_objects\/tile_0132.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":133, + "image":"..\/assets\/grid_game_objects\/tile_0133.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":134, + "image":"..\/assets\/grid_game_objects\/tile_0134.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":135, + "image":"..\/assets\/grid_game_objects\/tile_0135.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":136, + "image":"..\/assets\/grid_game_objects\/tile_0136.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":137, + "image":"..\/assets\/grid_game_objects\/tile_0137.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":138, + "image":"..\/assets\/grid_game_objects\/tile_0138.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":139, + "image":"..\/assets\/grid_game_objects\/tile_0139.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":140, + "image":"..\/assets\/grid_game_objects\/tile_0140.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":141, + "image":"..\/assets\/grid_game_objects\/tile_0141.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":142, + "image":"..\/assets\/grid_game_objects\/tile_0142.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":143, + "image":"..\/assets\/grid_game_objects\/tile_0143.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":144, + "image":"..\/assets\/grid_game_objects\/tile_0144.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":145, + "image":"..\/assets\/grid_game_objects\/tile_0145.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":146, + "image":"..\/assets\/grid_game_objects\/tile_0146.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":147, + "image":"..\/assets\/grid_game_objects\/tile_0147.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":148, + "image":"..\/assets\/grid_game_objects\/tile_0148.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":149, + "image":"..\/assets\/grid_game_objects\/tile_0149.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":150, + "image":"..\/assets\/grid_game_objects\/tile_0150.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":151, + "image":"..\/assets\/grid_game_objects\/tile_0151.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":152, + "image":"..\/assets\/grid_game_objects\/tile_0152.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":153, + "image":"..\/assets\/grid_game_objects\/tile_0153.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":154, + "image":"..\/assets\/grid_game_objects\/tile_0154.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":155, + "image":"..\/assets\/grid_game_objects\/tile_0155.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":156, + "image":"..\/assets\/grid_game_objects\/tile_0156.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":157, + "image":"..\/assets\/grid_game_objects\/tile_0157.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":158, + "image":"..\/assets\/grid_game_objects\/tile_0158.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":159, + "image":"..\/assets\/grid_game_objects\/tile_0159.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":160, + "image":"..\/assets\/grid_game_objects\/tile_0160.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":161, + "image":"..\/assets\/grid_game_objects\/tile_0161.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":162, + "image":"..\/assets\/grid_game_objects\/tile_0162.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":163, + "image":"..\/assets\/grid_game_objects\/tile_0163.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":164, + "image":"..\/assets\/grid_game_objects\/tile_0164.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":165, + "image":"..\/assets\/grid_game_objects\/tile_0165.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":166, + "image":"..\/assets\/grid_game_objects\/tile_0166.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":167, + "image":"..\/assets\/grid_game_objects\/tile_0167.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":168, + "image":"..\/assets\/grid_game_objects\/tile_0168.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":169, + "image":"..\/assets\/grid_game_objects\/tile_0169.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":170, + "image":"..\/assets\/grid_game_objects\/tile_0170.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":171, + "image":"..\/assets\/grid_game_objects\/tile_0171.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":172, + "image":"..\/assets\/grid_game_objects\/tile_0172.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":173, + "image":"..\/assets\/grid_game_objects\/tile_0173.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":174, + "image":"..\/assets\/grid_game_objects\/tile_0174.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":175, + "image":"..\/assets\/grid_game_objects\/tile_0175.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":176, + "image":"..\/assets\/grid_game_objects\/tile_0176.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":177, + "image":"..\/assets\/grid_game_objects\/tile_0177.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":178, + "image":"..\/assets\/grid_game_objects\/tile_0178.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":179, + "image":"..\/assets\/grid_game_objects\/tile_0179.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":180, + "image":"..\/assets\/grid_game_objects\/tile_0180.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":181, + "image":"..\/assets\/grid_game_objects\/tile_0181.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":182, + "image":"..\/assets\/grid_game_objects\/tile_0182.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":183, + "image":"..\/assets\/grid_game_objects\/tile_0183.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":184, + "image":"..\/assets\/grid_game_objects\/tile_0184.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":185, + "image":"..\/assets\/grid_game_objects\/tile_0185.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":186, + "image":"..\/assets\/grid_game_objects\/tile_0186.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":187, + "image":"..\/assets\/grid_game_objects\/tile_0187.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":188, + "image":"..\/assets\/grid_game_objects\/tile_0188.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":189, + "image":"..\/assets\/grid_game_objects\/tile_0189.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":190, + "image":"..\/assets\/grid_game_objects\/tile_0190.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":191, + "image":"..\/assets\/grid_game_objects\/tile_0191.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":192, + "image":"..\/assets\/grid_game_objects\/tile_0192.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":193, + "image":"..\/assets\/grid_game_objects\/tile_0193.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":194, + "image":"..\/assets\/grid_game_objects\/tile_0194.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":195, + "image":"..\/assets\/grid_game_objects\/tile_0195.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":196, + "image":"..\/assets\/grid_game_objects\/tile_0196.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":197, + "image":"..\/assets\/grid_game_objects\/tile_0197.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":198, + "image":"..\/assets\/grid_game_objects\/tile_0198.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":199, + "image":"..\/assets\/grid_game_objects\/tile_0199.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":200, + "image":"..\/assets\/grid_game_objects\/tile_0200.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":201, + "image":"..\/assets\/grid_game_objects\/tile_0201.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":202, + "image":"..\/assets\/grid_game_objects\/tile_0202.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":203, + "image":"..\/assets\/grid_game_objects\/tile_0203.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":204, + "image":"..\/assets\/grid_game_objects\/tile_0204.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":205, + "image":"..\/assets\/grid_game_objects\/tile_0205.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":206, + "image":"..\/assets\/grid_game_objects\/tile_0206.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":207, + "image":"..\/assets\/grid_game_objects\/tile_0207.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":208, + "image":"..\/assets\/grid_game_objects\/tile_0208.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":209, + "image":"..\/assets\/grid_game_objects\/tile_0209.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":210, + "image":"..\/assets\/grid_game_objects\/tile_0210.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":211, + "image":"..\/assets\/grid_game_objects\/tile_0211.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":212, + "image":"..\/assets\/grid_game_objects\/tile_0212.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":213, + "image":"..\/assets\/grid_game_objects\/tile_0213.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":214, + "image":"..\/assets\/grid_game_objects\/tile_0214.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":215, + "image":"..\/assets\/grid_game_objects\/tile_0215.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":216, + "image":"..\/assets\/grid_game_objects\/tile_0216.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":217, + "image":"..\/assets\/grid_game_objects\/tile_0217.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":218, + "image":"..\/assets\/grid_game_objects\/tile_0218.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":219, + "image":"..\/assets\/grid_game_objects\/tile_0219.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":220, + "image":"..\/assets\/grid_game_objects\/tile_0220.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":221, + "image":"..\/assets\/grid_game_objects\/tile_0221.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":222, + "image":"..\/assets\/grid_game_objects\/tile_0222.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":223, + "image":"..\/assets\/grid_game_objects\/tile_0223.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":224, + "image":"..\/assets\/grid_game_objects\/tile_0224.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":225, + "image":"..\/assets\/grid_game_objects\/tile_0225.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":226, + "image":"..\/assets\/grid_game_objects\/tile_0226.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":227, + "image":"..\/assets\/grid_game_objects\/tile_0227.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":228, + "image":"..\/assets\/grid_game_objects\/tile_0228.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":229, + "image":"..\/assets\/grid_game_objects\/tile_0229.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":230, + "image":"..\/assets\/grid_game_objects\/tile_0230.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":231, + "image":"..\/assets\/grid_game_objects\/tile_0231.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":232, + "image":"..\/assets\/grid_game_objects\/tile_0232.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }, + { + "id":233, + "image":"..\/assets\/grid_game_objects\/tile_0233.png", + "imageheight":16, + "imagewidth":16, + "type":"tile" + }], + "tilewidth":16, + "type":"tileset", + "version":"1.10" +} \ No newline at end of file From 35c4bd05f1c3423e5d02ecc4a2c772b98ba5f825 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 3 Mar 2026 19:03:09 +0200 Subject: [PATCH 61/71] Update --- README.md | 2 +- api/detiled_api.md | 10 +-- detiled/detiled.lua | 8 +-- detiled/internal/detiled_annotations.lua | 21 +++--- detiled/internal/detiled_internal.lua | 2 +- detiled/internal/detiled_parser.lua | 66 ++++++++----------- example/example_grid/example_grid.script | 31 ++++----- .../example_grid_game_objects.script | 30 ++++----- .../example_hexgrid/example_hexgrid.script | 38 +++++------ .../example_hexgrid_pointy.script | 36 +++++----- .../example_isogrid/example_isogrid.script | 39 +++++------ .../example_isogrid_staggered.script | 39 +++++------ test/test_detiled.lua | 4 +- 13 files changed, 151 insertions(+), 175 deletions(-) diff --git a/README.md b/README.md index 3b75244..73b20ac 100644 --- a/README.md +++ b/README.md @@ -104,7 +104,7 @@ Look at [Shooting Circles](https://github.com/Insality/shooting_circles) or [Cos ```lua detiled.set_logger(logger_instance) detiled.load_tileset(tileset_path_or_data) -detiled.get_entity_from_map(map_path_or_data) -- returns entities, map_params +detiled.get_entity_from_map(map_path_or_data) -- returns layers, map_params detiled.cell_to_pos(map_params, i, j) -- returns x, y detiled.pos_to_cell(map_params, x, y) -- returns i, j ``` diff --git a/api/detiled_api.md b/api/detiled_api.md index 6a8665a..df492f1 100644 --- a/api/detiled_api.md +++ b/api/detiled_api.md @@ -27,18 +27,20 @@ Set a logger instance --- ```lua -local entities, map_params = detiled.get_entity_from_map(map_or_path) +local layers, map_params = detiled.get_entity_from_map(map_or_path) ``` -Load a tiled map and return entities and map params. Use `entities` to spawn and `map_params` for coordinate conversion. +Load a tiled map and return layers (keyed by layer id) and map params. Entity positions do not include layer offset; add `layer_data.position` when spawning if needed. -Each entity is a flat table: `prefab_id`, `position_x`, `position_y`, `position_z`; optional `image`; optional `scale_x`, `scale_y`, `rotation` (only set when non-default); optional `name`, `tiled_id`, `tiled_layer_id`, `size_x`, `size_y`; plus any custom properties from Tiled. +Each key in `layers` is a layer id (string). Each value is `detiled.layer_data`: `entities` (array), `properties`, `layer_id`, `visible`, `position` (vmath.vector3: offset_x, offset_y, position_z from layer). + +Each entity: `prefab_id`, `position` (vmath.vector3), `scale` (vmath.vector3); optional `image`, `rotation`; optional `name`, `tiled_id`, `size_x`, `size_y`; plus any custom properties from Tiled. - **Parameters:** - `map_or_path` *(string|detiled.map)*: - **Returns:** - - *(detiled.entity[])* entities + - *(table)* layers - *(detiled.map_params|nil)* map_params ### load_tileset diff --git a/detiled/detiled.lua b/detiled/detiled.lua index 1ea8e98..9ad6c60 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -13,9 +13,9 @@ function M.set_logger(logger_instance) end ----Get entities and map params from a map +---Get layers and map params from a map. Each layer has entities, properties, layer_id, visible, position (offset). ---@param map_or_path detiled.map|string ----@return detiled.entity[], detiled.map_params|nil +---@return table, detiled.map_params|nil function M.get_entity_from_map(map_or_path) local map = map_or_path if type(map_or_path) == "string" then @@ -27,9 +27,9 @@ function M.get_entity_from_map(map_or_path) end ---@cast map detiled.map - local entities, map_params = detiled_parser.get_entities(map) + local layers, map_params = detiled_parser.get_entities(map) - return entities, map_params + return layers, map_params end diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 6dca3a5..4f03944 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -133,20 +133,23 @@ ---@class detiled.entity ---@field prefab_id string|nil ---@field image string|nil ----@field position_x number ----@field position_y number ----@field position_z number +---@field position_x number|nil +---@field position_y number|nil +---@field position_z number|nil +---@field size_x number|nil +---@field size_y number|nil ---@field scale_x number|nil ---@field scale_y number|nil ---@field rotation number|nil ----@field name string|nil ----@field object_type "point"|"ellipse"|"polyline"|"polygon"|"rectangle"|nil ----@field polygon table|nil ----@field polyline table|nil ---@field tiled_id number|nil ---@field tiled_layer_id string|nil ----@field size_x number|nil ----@field size_y number|nil + +---@class detiled.layer_data +---@field entities detiled.entity[] +---@field properties detiled.map.property[] +---@field layer_id string +---@field visible boolean +---@field position vector3 ---@class detiled.map_params.tile ---@field width number diff --git a/detiled/internal/detiled_internal.lua b/detiled/internal/detiled_internal.lua index 8b62737..d785b24 100644 --- a/detiled/internal/detiled_internal.lua +++ b/detiled/internal/detiled_internal.lua @@ -266,7 +266,7 @@ function M.apply_object_properties_to_entity(entity, object) local tiled_components = M.get_components_property(object.properties) if not tiled_components then return end if tiled_components.position_z then - entity.position_z = entity.position_z + tiled_components.position_z + entity.position.z = entity.position.z + tiled_components.position_z tiled_components.position_z = nil end M.apply_components(entity, tiled_components) diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index a24af85..644e5aa 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -41,7 +41,6 @@ end ---@param layer detiled.map.layer ----@param position_z number ---@param prefab_id string|nil ---@param position_x number ---@param position_y number @@ -51,17 +50,14 @@ end ---@param object detiled.map.object|nil ---@param image string|nil ---@return detiled.entity -local function make_entity(layer, position_z, prefab_id, position_x, position_y, scale_x, scale_y, rotation, object, image) +local function make_entity(layer, prefab_id, position_x, position_y, scale_x, scale_y, rotation, object, image) + local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 ---@type detiled.entity local entity = { prefab_id = prefab_id, image = image, - position_x = position_x, - position_y = position_y, - position_z = position_z, - tiled_layer_id = layer.name, - scale_x = scale_x ~= 1 and scale_x or nil, - scale_y = scale_y ~= 1 and scale_y or nil, + position = vmath.vector3(position_x, position_y, position_z), + scale = vmath.vector3(scale_x, scale_y, 1), rotation = rotation ~= 0 and rotation or nil, } @@ -89,12 +85,8 @@ end ---@param map_params detiled.map_params ---@return detiled.entity[] local function get_entities_from_tile_layer(layer, map, grid_module, map_params) - ---@type detiled.entity[] local entities = {} - local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 - local offset_x = layer.offsetx or 0 - local offset_y = layer.offsety or 0 local layer_data = detiled_internal.unpack_tile_layer_data(layer) for tile_index = 1, #layer_data do @@ -105,14 +97,12 @@ local function get_entities_from_tile_layer(layer, map, grid_module, map_params) local tile_i = ((tile_index - 1) % map.width) local tile_j = (floor((tile_index - 1) / map.width)) local pos_x, pos_y = grid_module.cell_to_pos(tile_i, tile_j, map_params) - pos_x = pos_x + offset_x - pos_y = pos_y - offset_y local prefab_id = detiled_internal.get_prefab_id_from_tile(tile) local image = detiled_internal.get_image_name_from_tile(tile, tileset) local scale_x = flip_h and -1 or 1 local scale_y = flip_v and -1 or 1 local rotation = flip_d and -90 or 0 - local entity = make_entity(layer, position_z, prefab_id, pos_x, pos_y, scale_x, scale_y, rotation, nil, image) + local entity = make_entity(layer, prefab_id, pos_x, pos_y, scale_x, scale_y, rotation, nil, image) detiled_internal.apply_tile_properties_to_entity(entity, tile) table_insert(entities, entity) @@ -129,14 +119,10 @@ end ---@param map_params detiled.map_params ---@return detiled.entity[] local function get_entities_from_object_layer(layer, map, grid_module, map_params) - ---@type detiled.entity[] local entities = {} local map_width = map_params.scene.size_x local map_height = map_params.scene.size_y - local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 - local offset_x = layer.offsetx or 0 - local offset_y = layer.offsety or 0 for object_index = 1, #layer.objects do local object = layer.objects[object_index] @@ -155,28 +141,25 @@ local function get_entities_from_object_layer(layer, map, grid_module, map_param }) else local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, tile, map_width, map_height, map_params) - position_x = position_x + offset_x - position_y = position_y - offset_y if flip_h then scale_x = -scale_x end if flip_v then scale_y = -scale_y end if flip_d then rotation = rotation - 90 end local prefab_id = detiled_internal.get_prefab_id_from_tile(tile) local image = detiled_internal.get_image_name_from_tile(tile, tileset) - local entity = make_entity(layer, position_z, prefab_id, position_x, position_y, scale_x, scale_y, rotation, object, image) + local entity = make_entity(layer, prefab_id, position_x, position_y, scale_x, scale_y, rotation, object, image) detiled_internal.apply_tile_properties_to_entity(entity, tile) detiled_internal.apply_object_properties_to_entity(entity, object) table_insert(entities, entity) end else local position_x, position_y, scale_x, scale_y = M.get_defold_position_from_tiled_object(object, nil, map_width, map_height, map_params) - position_x = position_x + offset_x - position_y = position_y - offset_y - object.height + position_y = position_y - object.height local prefab_id = (object.class and object.class ~= "") and object.class or (object.type ~= "" and object.type or nil) local use_scale = object.class and object.class ~= "" local entity_scale_x = use_scale and scale_x or 1 local entity_scale_y = use_scale and scale_y or 1 - local entity = make_entity(layer, position_z, prefab_id, position_x, position_y, entity_scale_x, entity_scale_y, rotation, object, nil) + local entity = make_entity(layer, prefab_id, position_x, position_y, entity_scale_x, entity_scale_y, rotation, object, nil) detiled_internal.apply_object_properties_to_entity(entity, object) table_insert(entities, entity) end @@ -187,34 +170,41 @@ end ---@param tiled_map detiled.map ----@return detiled.entity[], detiled.map_params|nil +---@return table, detiled.map_params|nil function M.get_entities(tiled_map) - ---@type detiled.entity[] - local entities = {} - + local layers = {} local grid_module = GRID_MODULES[tiled_map.orientation] local map_params = grid_module and grid_module.get_map_params_from_tiled(tiled_map) or nil for layer_index = 1, #tiled_map.layers do local layer = tiled_map.layers[layer_index] if not detiled_internal.is_layer_excluded(tiled_map, layer.name) then + local offset_x = layer.offsetx or 0 + local offset_y = layer.offsety or 0 + local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 + local layer_data = { + entities = {}, + properties = layer.properties or {}, + layer_id = layer.name, + visible = layer.visible ~= false, + position = vmath.vector3(offset_x, offset_y, position_z), + } + if layer.type == "tilelayer" then - local layer_entities = get_entities_from_tile_layer(layer, tiled_map, grid_module, map_params) - for index = 1, #layer_entities do - table_insert(entities, layer_entities[index]) - end + layer_data.entities = get_entities_from_tile_layer(layer, tiled_map, grid_module, map_params) end if layer.type == "objectgroup" then - local layer_entities = get_entities_from_object_layer(layer, tiled_map, grid_module, map_params) - for index = 1, #layer_entities do - table_insert(entities, layer_entities[index]) - end + layer_data.entities = get_entities_from_object_layer(layer, tiled_map, grid_module, map_params) + end + + if #layer_data.entities > 0 or layer.type == "tilelayer" or layer.type == "objectgroup" then + layers[layer.name] = layer_data end end end - return entities, map_params + return layers, map_params end diff --git a/example/example_grid/example_grid.script b/example/example_grid/example_grid.script index 0528c2d..a6ee062 100644 --- a/example/example_grid/example_grid.script +++ b/example/example_grid/example_grid.script @@ -1,24 +1,21 @@ local detiled = require("detiled.detiled") -local function spawn_entity(entity) - local prefab_id = entity.prefab_id - local position_x = entity.position_x - local position_y = entity.position_y - local position_z = entity.position_z - local scale_x = entity.scale_x or 1 - local scale_y = entity.scale_y or 1 - - local factory_url = "/entities#" .. prefab_id - local position = vmath.vector3(position_x, position_y, position_z) - local scale = vmath.vector3(scale_x, scale_y, 1) - factory.create(factory_url, position, nil, nil, scale) +local function spawn_entity(entity, layer_data) + local position = entity.position + if layer_data then + position = position + layer_data.position + end + local factory_url = "/entities#" .. entity.prefab_id + factory.create(factory_url, position, nil, nil, entity.scale) end -local function spawn_map(entities) - for _, entity in ipairs(entities) do - spawn_entity(entity) +local function spawn_map(layers) + for _, layer_data in pairs(layers) do + for _, entity in ipairs(layer_data.entities) do + spawn_entity(entity, layer_data) + end end end @@ -27,8 +24,8 @@ function init(self) detiled.load_tileset("/tiled/tilesets/grid_items.json") detiled.load_tileset("/tiled/tilesets/grid_tileset.json") - local entities, map_params = detiled.get_entity_from_map("/tiled/maps/grid.json") - spawn_map(entities) + local layers, map_params = detiled.get_entity_from_map("/tiled/maps/grid.json") + spawn_map(layers) self.map_params = map_params msg.post(".", "acquire_input_focus") diff --git a/example/example_grid_game_objects/example_grid_game_objects.script b/example/example_grid_game_objects/example_grid_game_objects.script index 687450e..298b6da 100644 --- a/example/example_grid_game_objects/example_grid_game_objects.script +++ b/example/example_grid_game_objects/example_grid_game_objects.script @@ -1,27 +1,21 @@ local detiled = require("detiled.detiled") -local function spawn_entity(entity) - local prefab_id = entity.prefab_id - local position_x = entity.position_x - local position_y = entity.position_y - local position_z = entity.position_z - local scale_x = entity.scale_x or 1 - local scale_y = entity.scale_y or 1 - - local factory_url = "/entities#" .. prefab_id - local position = vmath.vector3(position_x, position_y, position_z) - local scale = vmath.vector3(scale_x, scale_y, 1) - print("Spawn entity: ", factory_url, position_x, position_y, position_z) +local function spawn_entity(entity, layer_data) + local position = entity.position + position = position + layer_data.position + local factory_url = "/entities#" .. entity.prefab_id factory.create(factory_url, position, nil, { sprite_animation = hash(entity.image) - }, scale) + }, entity.scale) end -local function spawn_map(entities) - for _, entity in ipairs(entities) do - spawn_entity(entity) +local function spawn_map(layers) + for _, layer_data in pairs(layers) do + for _, entity in ipairs(layer_data.entities) do + spawn_entity(entity, layer_data) + end end end @@ -30,8 +24,8 @@ function init(self) detiled.load_tileset("/tiled/tilesets/grid_items.json") detiled.load_tileset("/tiled/tilesets/grid_game_objects.json") - local entities, map_params = detiled.get_entity_from_map("/tiled/maps/grid_game_objects.json") - spawn_map(entities) + local layers, map_params = detiled.get_entity_from_map("/tiled/maps/grid_game_objects.json") + spawn_map(layers) self.map_params = map_params msg.post(".", "acquire_input_focus") diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index 48c856f..df97e55 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -1,28 +1,26 @@ local detiled = require("detiled.detiled") -local function get_z_position(position_x, position_y) - return -position_y / 10000 + position_x / 100000 +local function get_z_position(x, y) + return -y / 10000 + x / 100000 end -local function spawn_entity(entity) - local prefab_id = entity.prefab_id - local position_x = entity.position_x - local position_y = entity.position_y - local position_z = entity.position_z + get_z_position(position_x, position_y) - local scale_x = entity.scale_x or 1 - local scale_y = entity.scale_y or 1 - - local factory_url = "/entities#" .. prefab_id - local position = vmath.vector3(position_x, position_y, position_z) - local scale = vmath.vector3(scale_x, scale_y, 1) - factory.create(factory_url, position, nil, { sprite_animation = hash(entity.image) }, scale) +local function spawn_entity(entity, layer_data) + local position = entity.position + if layer_data then + position = position + layer_data.position + end + position.z = position.z + get_z_position(position.x, position.y) + local factory_url = "/entities#" .. entity.prefab_id + factory.create(factory_url, position, nil, { sprite_animation = hash(entity.image) }, entity.scale) end -local function spawn_map(entities) - for _, entity in ipairs(entities) do - if entity.prefab_id then - spawn_entity(entity) +local function spawn_map(layers) + for _, layer_data in pairs(layers) do + for _, entity in ipairs(layer_data.entities) do + if entity.prefab_id then + spawn_entity(entity, layer_data) + end end end end @@ -31,8 +29,8 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_tiles.json") detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") - local entities, map_params = detiled.get_entity_from_map("/tiled/maps/hexgrid.json") - spawn_map(entities) + local layers, map_params = detiled.get_entity_from_map("/tiled/maps/hexgrid.json") + spawn_map(layers) self.map_params = map_params msg.post(".", "acquire_input_focus") diff --git a/example/example_hexgrid_pointy/example_hexgrid_pointy.script b/example/example_hexgrid_pointy/example_hexgrid_pointy.script index 59b0dcd..3535535 100644 --- a/example/example_hexgrid_pointy/example_hexgrid_pointy.script +++ b/example/example_hexgrid_pointy/example_hexgrid_pointy.script @@ -1,28 +1,26 @@ local detiled = require("detiled.detiled") -local function get_z_position(position_x, position_y) - return -position_y / 10000 + position_x / 100000 +local function get_z_position(x, y) + return -y / 10000 + x / 100000 end -local function spawn_entity(entity) - local prefab_id = entity.prefab_id - local position_x = entity.position_x - local position_y = entity.position_y - local position_z = entity.position_z + get_z_position(position_x, position_y) - local scale_x = entity.scale_x or 1 - local scale_y = entity.scale_y or 1 - - local factory_url = "/entities#" .. prefab_id - local position = vmath.vector3(position_x, position_y, position_z) - local scale = vmath.vector3(scale_x, scale_y, 1) +local function spawn_entity(entity, layer_data) + local position = entity.position + if layer_data then + position = position + layer_data.position + end + position.z = position.z + get_z_position(position.x, position.y) + local factory_url = "/entities#" .. entity.prefab_id local rot = vmath.quat_rotation_z(math.rad(entity.rotation or 0)) - factory.create(factory_url, position, rot, nil, scale) + factory.create(factory_url, position, rot, nil, entity.scale) end -local function spawn_map(entities) - for _, entity in ipairs(entities) do - spawn_entity(entity) +local function spawn_map(layers) + for _, layer_data in pairs(layers) do + for _, entity in ipairs(layer_data.entities) do + spawn_entity(entity, layer_data) + end end end @@ -31,8 +29,8 @@ function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_tiles.json") detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") detiled.load_tileset("/tiled/tilesets/hexgrid_pointy.json") - local entities, map_params = detiled.get_entity_from_map("/tiled/maps/hexgrid_pointy.json") - spawn_map(entities) + local layers, map_params = detiled.get_entity_from_map("/tiled/maps/hexgrid_pointy.json") + spawn_map(layers) self.map_params = map_params msg.post(".", "acquire_input_focus") diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index d5c306d..9def302 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -1,35 +1,32 @@ local detiled = require("detiled.detiled") -local function get_z_position(position_x, position_y) - return -position_y / 10000 + position_x / 100000 +local function get_z_position(x, y) + return -y / 10000 + x / 100000 end -local function spawn_entity(entity) +local function spawn_entity(entity, layer_data) if not entity.prefab_id then return end - local prefab_id = entity.prefab_id - local position_x = entity.position_x - local position_y = entity.position_y - local position_z = entity.position_z + get_z_position(position_x, position_y) - local scale_x = entity.scale_x or 1 - local scale_y = entity.scale_y or 1 - local rotation = entity.rotation or 0 - - local factory_url = "/entities#" .. prefab_id - local position = vmath.vector3(position_x, position_y, position_z) - local scale = vmath.vector3(scale_x, scale_y, 1) - local rot = vmath.quat_rotation_z(math.rad(rotation)) - factory.create(factory_url, position, rot, nil, scale) + local position = entity.position + if layer_data then + position = position + layer_data.position + end + position.z = position.z + get_z_position(position.x, position.y) + local factory_url = "/entities#" .. entity.prefab_id + local rot = vmath.quat_rotation_z(math.rad(entity.rotation or 0)) + factory.create(factory_url, position, rot, nil, entity.scale) end -local function spawn_map(entities) - for _, entity in ipairs(entities) do - spawn_entity(entity) +local function spawn_map(layers) + for _, layer_data in pairs(layers) do + for _, entity in ipairs(layer_data.entities) do + spawn_entity(entity, layer_data) + end end end @@ -37,8 +34,8 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") detiled.load_tileset("/tiled/tilesets/isogrid_tileset.json") - local entities, map_params = detiled.get_entity_from_map("/tiled/maps/isogrid.json") - spawn_map(entities) + local layers, map_params = detiled.get_entity_from_map("/tiled/maps/isogrid.json") + spawn_map(layers) self.map_params = map_params msg.post(".", "acquire_input_focus") diff --git a/example/example_isogrid_staggered/example_isogrid_staggered.script b/example/example_isogrid_staggered/example_isogrid_staggered.script index c263e87..303e33b 100644 --- a/example/example_isogrid_staggered/example_isogrid_staggered.script +++ b/example/example_isogrid_staggered/example_isogrid_staggered.script @@ -1,31 +1,28 @@ local detiled = require("detiled.detiled") -local function get_z_position(position_x, position_y) - return -position_y / 10000 + position_x / 100000 +local function get_z_position(x, y) + return -y / 10000 + x / 100000 end -local function spawn_entity(entity) - local prefab_id = entity.prefab_id - local position_x = entity.position_x - local position_y = entity.position_y - local position_z = entity.position_z + get_z_position(position_x, position_y) - local scale_x = entity.scale_x or 1 - local scale_y = entity.scale_y or 1 - local rotation = entity.rotation or 0 - - local factory_url = "/entities#" .. prefab_id - local position = vmath.vector3(position_x, position_y, position_z) - local scale = vmath.vector3(scale_x, scale_y, 1) - local rot = vmath.quat_rotation_z(math.rad(rotation)) - factory.create(factory_url, position, rot, nil, scale) +local function spawn_entity(entity, layer_data) + local position = entity.position + if layer_data then + position = position + layer_data.position + end + position.z = position.z + get_z_position(position.x, position.y) + local factory_url = "/entities#" .. entity.prefab_id + local rot = vmath.quat_rotation_z(math.rad(entity.rotation or 0)) + factory.create(factory_url, position, rot, nil, entity.scale) end -local function spawn_map(entities) - for _, entity in ipairs(entities) do - spawn_entity(entity) +local function spawn_map(layers) + for _, layer_data in pairs(layers) do + for _, entity in ipairs(layer_data.entities) do + spawn_entity(entity, layer_data) + end end end @@ -33,8 +30,8 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") detiled.load_tileset("/tiled/tilesets/isogrid_tileset.json") - local entities, map_params = detiled.get_entity_from_map("/tiled/maps/isogrid_staggered.json") - spawn_map(entities) + local layers, map_params = detiled.get_entity_from_map("/tiled/maps/isogrid_staggered.json") + spawn_map(layers) self.map_params = map_params msg.post(".", "acquire_input_focus") diff --git a/test/test_detiled.lua b/test/test_detiled.lua index 848a5e5..94341cd 100644 --- a/test/test_detiled.lua +++ b/test/test_detiled.lua @@ -9,8 +9,8 @@ return function() it("Should init correclty", function() detiled.load_tileset("/resources/tilesets/shooting_circle.json") - local entities, map_params = detiled.get_entity_from_map("/resources/maps/game.json") - assert(entities) + local layers, map_params = detiled.get_entity_from_map("/resources/maps/game.json") + assert(layers) assert(map_params) end) end) From 81b246cfdf057e158e8619b48f3a2bcfd87ad1ef Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 3 Mar 2026 19:21:07 +0200 Subject: [PATCH 62/71] Update --- detiled/internal/detiled_annotations.lua | 4 +++- detiled/internal/detiled_internal.lua | 2 +- detiled/internal/detiled_parser.lua | 11 ++++++++--- 3 files changed, 12 insertions(+), 5 deletions(-) diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 4f03944..44b6153 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -149,7 +149,9 @@ ---@field properties detiled.map.property[] ---@field layer_id string ---@field visible boolean ----@field position vector3 +---@field position_x number +---@field position_y number +---@field position_z number ---@class detiled.map_params.tile ---@field width number diff --git a/detiled/internal/detiled_internal.lua b/detiled/internal/detiled_internal.lua index d785b24..0a90645 100644 --- a/detiled/internal/detiled_internal.lua +++ b/detiled/internal/detiled_internal.lua @@ -266,7 +266,7 @@ function M.apply_object_properties_to_entity(entity, object) local tiled_components = M.get_components_property(object.properties) if not tiled_components then return end if tiled_components.position_z then - entity.position.z = entity.position.z + tiled_components.position_z + entity.position_z = (entity.position_z or 0) + tiled_components.position_z tiled_components.position_z = nil end M.apply_components(entity, tiled_components) diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 644e5aa..6d4325b 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -56,8 +56,11 @@ local function make_entity(layer, prefab_id, position_x, position_y, scale_x, sc local entity = { prefab_id = prefab_id, image = image, - position = vmath.vector3(position_x, position_y, position_z), - scale = vmath.vector3(scale_x, scale_y, 1), + position_x = position_x, + position_y = position_y, + position_z = position_z, + scale_x = scale_x, + scale_y = scale_y, rotation = rotation ~= 0 and rotation or nil, } @@ -187,7 +190,9 @@ function M.get_entities(tiled_map) properties = layer.properties or {}, layer_id = layer.name, visible = layer.visible ~= false, - position = vmath.vector3(offset_x, offset_y, position_z), + position_x = offset_x, + position_y = offset_y, + position_z = position_z, } if layer.type == "tilelayer" then From 7f5a7907ba8a6435dedcfb3cf8f39f14a173d550 Mon Sep 17 00:00:00 2001 From: Insality Date: Wed, 4 Mar 2026 19:42:26 +0200 Subject: [PATCH 63/71] Update --- detiled/internal/detiled_annotations.lua | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 44b6153..7ea0950 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -143,6 +143,10 @@ ---@field rotation number|nil ---@field tiled_id number|nil ---@field tiled_layer_id string|nil +---@field name string|nil +---@field object_type string|nil +---@field polyline table|nil +---@field polygon table|nil ---@class detiled.layer_data ---@field entities detiled.entity[] From ccd7c81fe7cd36832010f04918dc272d5e9cb2d6 Mon Sep 17 00:00:00 2001 From: Insality Date: Tue, 10 Mar 2026 10:42:38 +0200 Subject: [PATCH 64/71] Transform as separate table, debug logs --- detiled/detiled.lua | 2 ++ detiled/internal/detiled_parser.lua | 18 ++++++++++-------- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/detiled/detiled.lua b/detiled/detiled.lua index 9ad6c60..b5fb978 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -19,7 +19,9 @@ end function M.get_entity_from_map(map_or_path) local map = map_or_path if type(map_or_path) == "string" then + logger:debug("Loading map", map_or_path) map = detiled_internal.load_json(map_or_path) --[[@as detiled.map]] + logger:debug("Map loaded", map) if not map then logger:error("Failed to load map", map_or_path) return {}, nil diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 6d4325b..0150139 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -56,19 +56,21 @@ local function make_entity(layer, prefab_id, position_x, position_y, scale_x, sc local entity = { prefab_id = prefab_id, image = image, - position_x = position_x, - position_y = position_y, - position_z = position_z, - scale_x = scale_x, - scale_y = scale_y, - rotation = rotation ~= 0 and rotation or nil, + transform = { + position_x = position_x, + position_y = position_y, + position_z = position_z, + scale_x = scale_x, + scale_y = scale_y, + rotation = rotation ~= 0 and rotation or nil, + }, } if object then entity.name = object.name ~= "" and object.name or nil entity.tiled_id = tonumber(object.id) - entity.size_x = object.width - entity.size_y = object.height + entity.transform.size_x = object.width + entity.transform.size_y = object.height entity.object_type = get_object_type(object) if object.polyline then entity.polyline = object.polyline From 956435e870d7e94a62bfb60f0f95a60949c7b1d3 Mon Sep 17 00:00:00 2001 From: Insality Date: Sun, 15 Mar 2026 16:50:52 +0200 Subject: [PATCH 65/71] Update --- detiled/internal/detiled_annotations.lua | 20 ++++++++++++-------- detiled/internal/detiled_internal.lua | 2 +- detiled/internal/detiled_parser.lua | 6 ++++-- 3 files changed, 17 insertions(+), 11 deletions(-) diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 7ea0950..9c04ae8 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -130,17 +130,21 @@ ---@field firstgid number ---@field source string + +---@class detiled.entity.transform +---@field position_x number +---@field position_y number +---@field position_z number +---@field scale_x number +---@field scale_y number +---@field size_x number? +---@field size_y number? +---@field rotation number? + ---@class detiled.entity ---@field prefab_id string|nil ---@field image string|nil ----@field position_x number|nil ----@field position_y number|nil ----@field position_z number|nil ----@field size_x number|nil ----@field size_y number|nil ----@field scale_x number|nil ----@field scale_y number|nil ----@field rotation number|nil +---@field transform detiled.entity.transform ---@field tiled_id number|nil ---@field tiled_layer_id string|nil ---@field name string|nil diff --git a/detiled/internal/detiled_internal.lua b/detiled/internal/detiled_internal.lua index 0a90645..8824c38 100644 --- a/detiled/internal/detiled_internal.lua +++ b/detiled/internal/detiled_internal.lua @@ -266,7 +266,7 @@ function M.apply_object_properties_to_entity(entity, object) local tiled_components = M.get_components_property(object.properties) if not tiled_components then return end if tiled_components.position_z then - entity.position_z = (entity.position_z or 0) + tiled_components.position_z + entity.transform.position_z = (entity.transform.position_z or 0) + tiled_components.position_z tiled_components.position_z = nil end M.apply_components(entity, tiled_components) diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 0150139..25bb5ba 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -69,8 +69,10 @@ local function make_entity(layer, prefab_id, position_x, position_y, scale_x, sc if object then entity.name = object.name ~= "" and object.name or nil entity.tiled_id = tonumber(object.id) - entity.transform.size_x = object.width - entity.transform.size_y = object.height + if not entity.prefab_id then + entity.transform.size_x = object.width + entity.transform.size_y = object.height + end entity.object_type = get_object_type(object) if object.polyline then entity.polyline = object.polyline From f49c0c977b10de36e6e1c54b8f6ba358e0b19df9 Mon Sep 17 00:00:00 2001 From: Insality Date: Thu, 9 Apr 2026 11:31:47 +0300 Subject: [PATCH 66/71] Don't log whole map --- detiled/detiled.lua | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/detiled/detiled.lua b/detiled/detiled.lua index b5fb978..37aed1e 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -21,7 +21,7 @@ function M.get_entity_from_map(map_or_path) if type(map_or_path) == "string" then logger:debug("Loading map", map_or_path) map = detiled_internal.load_json(map_or_path) --[[@as detiled.map]] - logger:debug("Map loaded", map) + logger:debug("Map loaded") if not map then logger:error("Failed to load map", map_or_path) return {}, nil From 5496b9309b1f22ccf995646e736eaae654a8b264 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 13 Apr 2026 11:12:02 +0300 Subject: [PATCH 67/71] Update annotations, rename get_entity_from_map to parse, update examples --- README.md | 6 +- detiled/detiled.lua | 11 ++-- detiled/internal/detiled_annotations.lua | 8 +-- detiled/internal/detiled_internal.lua | 9 +-- detiled/internal/detiled_logger.lua | 66 +++++++++++++++---- detiled/internal/detiled_parser.lua | 13 ++-- example/example_grid/example_grid.script | 12 ++-- .../example_grid_game_objects.script | 12 ++-- .../example_hexgrid/example_hexgrid.script | 12 ++-- .../example_hexgrid_pointy.script | 14 ++-- .../example_isogrid/example_isogrid.script | 14 ++-- .../example_isogrid_staggered.script | 14 ++-- test/test_detiled.lua | 2 +- 13 files changed, 130 insertions(+), 63 deletions(-) diff --git a/README.md b/README.md index 73b20ac..0a69ecf 100644 --- a/README.md +++ b/README.md @@ -104,9 +104,9 @@ Look at [Shooting Circles](https://github.com/Insality/shooting_circles) or [Cos ```lua detiled.set_logger(logger_instance) detiled.load_tileset(tileset_path_or_data) -detiled.get_entity_from_map(map_path_or_data) -- returns layers, map_params -detiled.cell_to_pos(map_params, i, j) -- returns x, y -detiled.pos_to_cell(map_params, x, y) -- returns i, j +detiled.get_entity_from_map(map_path_or_data) -- returns layers, map_params +detiled.cell_to_pos(map_params, i, j) -- returns x, y +detiled.pos_to_cell(map_params, x, y) -- returns i, j ``` ### API Reference diff --git a/detiled/detiled.lua b/detiled/detiled.lua index 37aed1e..31cc85f 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -16,19 +16,20 @@ end ---Get layers and map params from a map. Each layer has entities, properties, layer_id, visible, position (offset). ---@param map_or_path detiled.map|string ---@return table, detiled.map_params|nil -function M.get_entity_from_map(map_or_path) +function M.parse(map_or_path) local map = map_or_path if type(map_or_path) == "string" then logger:debug("Loading map", map_or_path) map = detiled_internal.load_json(map_or_path) --[[@as detiled.map]] logger:debug("Map loaded") + if not map then logger:error("Failed to load map", map_or_path) return {}, nil end end - ---@cast map detiled.map + ---@cast map -string local layers, map_params = detiled_parser.get_entities(map) return layers, map_params @@ -55,8 +56,8 @@ function M.pos_to_cell(x, y, map_params) end ----Load a tileset ----@param tileset_or_path detiled.tileset|string +---Load a tileset to internal cache, so maps can reference it by name while parsing +---@param tileset_or_path detiled.tileset|string Path to tileset JSON file or tileset table ---@return detiled.tileset function M.load_tileset(tileset_or_path) local tileset = tileset_or_path @@ -64,7 +65,7 @@ function M.load_tileset(tileset_or_path) tileset = detiled_internal.load_json(tileset_or_path) --[[@as detiled.tileset]] end - ---@cast tileset detiled.tileset + ---@cast tileset -string return detiled_internal.load_tileset(tileset) end diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 9c04ae8..766b2cc 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -15,7 +15,7 @@ ---@field tilewidth number ---@field transformations detiled.tileset.transformations ---@field type string ----@field version string @Example: "1.9" +---@field version string Example: "1.9" ---@class detiled.tileset.grid ---@field height number @@ -157,9 +157,9 @@ ---@field properties detiled.map.property[] ---@field layer_id string ---@field visible boolean ----@field position_x number ----@field position_y number ----@field position_z number +---@field position_x number A layer Horizontal offset from layer settings +---@field position_y number A layer Vertical offset from layer settings +---@field position_z number A position_z custom property value from layer settings ---@class detiled.map_params.tile ---@field width number diff --git a/detiled/internal/detiled_internal.lua b/detiled/internal/detiled_internal.lua index 8824c38..29b52a1 100644 --- a/detiled/internal/detiled_internal.lua +++ b/detiled/internal/detiled_internal.lua @@ -177,10 +177,11 @@ end ---@param properties detiled.map.property[] ---@param property_name string +---@param default_value any|nil ---@return any|nil -function M.get_property_value(properties, property_name) +function M.get_property_value(properties, property_name, default_value) if not properties then - return nil + return default_value end for index = 1, #properties do @@ -190,7 +191,7 @@ function M.get_property_value(properties, property_name) end end - return nil + return default_value end @@ -280,7 +281,7 @@ function M.is_layer_excluded(tiled_map, layer_name) for index = 1, #tiled_map.layers do local layer = tiled_map.layers[index] if layer.name == layer_name then - return M.get_property_value(layer.properties, "exclude") or false + return M.get_property_value(layer.properties, "exclude", false) end end return false diff --git a/detiled/internal/detiled_logger.lua b/detiled/internal/detiled_logger.lua index eeb2812..748f600 100644 --- a/detiled/internal/detiled_logger.lua +++ b/detiled/internal/detiled_logger.lua @@ -6,32 +6,74 @@ ---@field error fun(_, msg: string, data: any) local M = {} -local NOOP = function() end +local EMPTY = function(_, message, context) end + ---@type detiled.logger local empty_logger = { - trace = NOOP, - debug = NOOP, - info = NOOP, - warn = NOOP, - error = NOOP, + trace = EMPTY, + debug = EMPTY, + info = EMPTY, + warn = EMPTY, + error = EMPTY, } ---@type detiled.logger local default_logger = { - trace = function(_, msg, data) pprint("TRACE: " .. msg, data) end, - debug = function(_, msg, data) pprint("DEBUG: " .. msg, data) end, - info = function(_, msg, data) pprint("INFO: " .. msg, data) end, - warn = function(_, msg, data) pprint("WARN: " .. msg, data) end, - error = function(_, msg, data) pprint("ERROR: " .. msg, data) end + trace = function(_, msg, data) print("TRACE: " .. msg, M.table_to_string(data)) end, + debug = function(_, msg, data) print("DEBUG: " .. msg, M.table_to_string(data)) end, + info = function(_, msg, data) print("INFO: " .. msg, M.table_to_string(data)) end, + warn = function(_, msg, data) print("WARN: " .. msg, M.table_to_string(data)) end, + error = function(_, msg, data) print("ERROR: " .. msg, M.table_to_string(data)) end } local METATABLE = { __index = default_logger } ----@param logger detiled.logger|table|nil function M.set_logger(logger) METATABLE.__index = logger or empty_logger end + +---Converts table to one-line string +---@param t table +---@param depth number? +---@param result string|nil Internal parameter +---@return string, boolean result String representation of table, Is max string length reached +function M.table_to_string(t, depth, result) + if type(t) ~= "table" then + return tostring(t) or "", false + end + + depth = depth or 0 + result = result or "{" + + for key, value in pairs(t) do + if #result > 1 then + result = result .. ", " + end + + if type(value) == "table" then + if depth == 0 then + local table_len = 0 + for _ in pairs(value) do + table_len = table_len + 1 + end + result = result .. key .. ": {... #" .. table_len .. "}" + else + local convert_result, is_limit = M.table_to_string(value, depth - 1, "") + result = result .. key .. ": {" .. convert_result + if is_limit then + break + end + end + else + result = result .. key .. ": " .. tostring(value) + end + end + + return result .. "}", false +end + + return setmetatable(M, METATABLE) diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 25bb5ba..92970b5 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -51,7 +51,7 @@ end ---@param image string|nil ---@return detiled.entity local function make_entity(layer, prefab_id, position_x, position_y, scale_x, scale_y, rotation, object, image) - local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 + local position_z = detiled_internal.get_property_value(layer.properties, "position_z", 0) ---@type detiled.entity local entity = { prefab_id = prefab_id, @@ -186,17 +186,16 @@ function M.get_entities(tiled_map) for layer_index = 1, #tiled_map.layers do local layer = tiled_map.layers[layer_index] if not detiled_internal.is_layer_excluded(tiled_map, layer.name) then - local offset_x = layer.offsetx or 0 - local offset_y = layer.offsety or 0 - local position_z = detiled_internal.get_property_value(layer.properties, "position_z") or 0 + + ---@type detiled.layer_data local layer_data = { entities = {}, properties = layer.properties or {}, layer_id = layer.name, visible = layer.visible ~= false, - position_x = offset_x, - position_y = offset_y, - position_z = position_z, + position_x = layer.offsetx or 0, + position_y = layer.offsety or 0, + position_z = detiled_internal.get_property_value(layer.properties, "position_z", 0), } if layer.type == "tilelayer" then diff --git a/example/example_grid/example_grid.script b/example/example_grid/example_grid.script index a6ee062..842aa49 100644 --- a/example/example_grid/example_grid.script +++ b/example/example_grid/example_grid.script @@ -2,12 +2,16 @@ local detiled = require("detiled.detiled") local function spawn_entity(entity, layer_data) - local position = entity.position + local transform = entity.transform + local position = vmath.vector3(transform.position_x, transform.position_y, transform.position_z) if layer_data then - position = position + layer_data.position + position.x = position.x + layer_data.position_x + position.y = position.y + layer_data.position_y + position.z = position.z + layer_data.position_z end local factory_url = "/entities#" .. entity.prefab_id - factory.create(factory_url, position, nil, nil, entity.scale) + local scale = vmath.vector3(transform.scale_x, transform.scale_y, 1) + factory.create(factory_url, position, nil, nil, scale) end @@ -24,7 +28,7 @@ function init(self) detiled.load_tileset("/tiled/tilesets/grid_items.json") detiled.load_tileset("/tiled/tilesets/grid_tileset.json") - local layers, map_params = detiled.get_entity_from_map("/tiled/maps/grid.json") + local layers, map_params = detiled.parse("/tiled/maps/grid.json") spawn_map(layers) self.map_params = map_params diff --git a/example/example_grid_game_objects/example_grid_game_objects.script b/example/example_grid_game_objects/example_grid_game_objects.script index 298b6da..f41f394 100644 --- a/example/example_grid_game_objects/example_grid_game_objects.script +++ b/example/example_grid_game_objects/example_grid_game_objects.script @@ -2,12 +2,16 @@ local detiled = require("detiled.detiled") local function spawn_entity(entity, layer_data) - local position = entity.position - position = position + layer_data.position + local transform = entity.transform + local position = vmath.vector3(transform.position_x, transform.position_y, transform.position_z) + position.x = position.x + layer_data.position_x + position.y = position.y + layer_data.position_y + position.z = position.z + layer_data.position_z local factory_url = "/entities#" .. entity.prefab_id + local scale = vmath.vector3(transform.scale_x, transform.scale_y, 1) factory.create(factory_url, position, nil, { sprite_animation = hash(entity.image) - }, entity.scale) + }, scale) end @@ -24,7 +28,7 @@ function init(self) detiled.load_tileset("/tiled/tilesets/grid_items.json") detiled.load_tileset("/tiled/tilesets/grid_game_objects.json") - local layers, map_params = detiled.get_entity_from_map("/tiled/maps/grid_game_objects.json") + local layers, map_params = detiled.parse("/tiled/maps/grid_game_objects.json") spawn_map(layers) self.map_params = map_params diff --git a/example/example_hexgrid/example_hexgrid.script b/example/example_hexgrid/example_hexgrid.script index df97e55..318c965 100644 --- a/example/example_hexgrid/example_hexgrid.script +++ b/example/example_hexgrid/example_hexgrid.script @@ -5,13 +5,17 @@ local function get_z_position(x, y) end local function spawn_entity(entity, layer_data) - local position = entity.position + local transform = entity.transform + local position = vmath.vector3(transform.position_x, transform.position_y, transform.position_z) if layer_data then - position = position + layer_data.position + position.x = position.x + layer_data.position_x + position.y = position.y + layer_data.position_y + position.z = position.z + layer_data.position_z end position.z = position.z + get_z_position(position.x, position.y) local factory_url = "/entities#" .. entity.prefab_id - factory.create(factory_url, position, nil, { sprite_animation = hash(entity.image) }, entity.scale) + local scale = vmath.vector3(transform.scale_x, transform.scale_y, 1) + factory.create(factory_url, position, nil, { sprite_animation = hash(entity.image) }, scale) end @@ -29,7 +33,7 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_tiles.json") detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") - local layers, map_params = detiled.get_entity_from_map("/tiled/maps/hexgrid.json") + local layers, map_params = detiled.parse("/tiled/maps/hexgrid.json") spawn_map(layers) self.map_params = map_params diff --git a/example/example_hexgrid_pointy/example_hexgrid_pointy.script b/example/example_hexgrid_pointy/example_hexgrid_pointy.script index 3535535..b1ade91 100644 --- a/example/example_hexgrid_pointy/example_hexgrid_pointy.script +++ b/example/example_hexgrid_pointy/example_hexgrid_pointy.script @@ -5,14 +5,18 @@ local function get_z_position(x, y) end local function spawn_entity(entity, layer_data) - local position = entity.position + local transform = entity.transform + local position = vmath.vector3(transform.position_x, transform.position_y, transform.position_z) if layer_data then - position = position + layer_data.position + position.x = position.x + layer_data.position_x + position.y = position.y + layer_data.position_y + position.z = position.z + layer_data.position_z end position.z = position.z + get_z_position(position.x, position.y) local factory_url = "/entities#" .. entity.prefab_id - local rot = vmath.quat_rotation_z(math.rad(entity.rotation or 0)) - factory.create(factory_url, position, rot, nil, entity.scale) + local rot = vmath.quat_rotation_z(math.rad(transform.rotation or 0)) + local scale = vmath.vector3(transform.scale_x, transform.scale_y, 1) + factory.create(factory_url, position, rot, nil, scale) end @@ -29,7 +33,7 @@ function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_tiles.json") detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") detiled.load_tileset("/tiled/tilesets/hexgrid_pointy.json") - local layers, map_params = detiled.get_entity_from_map("/tiled/maps/hexgrid_pointy.json") + local layers, map_params = detiled.parse("/tiled/maps/hexgrid_pointy.json") spawn_map(layers) self.map_params = map_params diff --git a/example/example_isogrid/example_isogrid.script b/example/example_isogrid/example_isogrid.script index 9def302..6f35d55 100644 --- a/example/example_isogrid/example_isogrid.script +++ b/example/example_isogrid/example_isogrid.script @@ -11,14 +11,18 @@ local function spawn_entity(entity, layer_data) return end - local position = entity.position + local transform = entity.transform + local position = vmath.vector3(transform.position_x, transform.position_y, transform.position_z) if layer_data then - position = position + layer_data.position + position.x = position.x + layer_data.position_x + position.y = position.y + layer_data.position_y + position.z = position.z + layer_data.position_z end position.z = position.z + get_z_position(position.x, position.y) local factory_url = "/entities#" .. entity.prefab_id - local rot = vmath.quat_rotation_z(math.rad(entity.rotation or 0)) - factory.create(factory_url, position, rot, nil, entity.scale) + local rot = vmath.quat_rotation_z(math.rad(transform.rotation or 0)) + local scale = vmath.vector3(transform.scale_x, transform.scale_y, 1) + factory.create(factory_url, position, rot, nil, scale) end @@ -34,7 +38,7 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") detiled.load_tileset("/tiled/tilesets/isogrid_tileset.json") - local layers, map_params = detiled.get_entity_from_map("/tiled/maps/isogrid.json") + local layers, map_params = detiled.parse("/tiled/maps/isogrid.json") spawn_map(layers) self.map_params = map_params diff --git a/example/example_isogrid_staggered/example_isogrid_staggered.script b/example/example_isogrid_staggered/example_isogrid_staggered.script index 303e33b..e24475f 100644 --- a/example/example_isogrid_staggered/example_isogrid_staggered.script +++ b/example/example_isogrid_staggered/example_isogrid_staggered.script @@ -7,14 +7,18 @@ end local function spawn_entity(entity, layer_data) - local position = entity.position + local transform = entity.transform + local position = vmath.vector3(transform.position_x, transform.position_y, transform.position_z) if layer_data then - position = position + layer_data.position + position.x = position.x + layer_data.position_x + position.y = position.y + layer_data.position_y + position.z = position.z + layer_data.position_z end position.z = position.z + get_z_position(position.x, position.y) local factory_url = "/entities#" .. entity.prefab_id - local rot = vmath.quat_rotation_z(math.rad(entity.rotation or 0)) - factory.create(factory_url, position, rot, nil, entity.scale) + local rot = vmath.quat_rotation_z(math.rad(transform.rotation or 0)) + local scale = vmath.vector3(transform.scale_x, transform.scale_y, 1) + factory.create(factory_url, position, rot, nil, scale) end @@ -30,7 +34,7 @@ end function init(self) detiled.load_tileset("/tiled/tilesets/hexgrid_objects.json") detiled.load_tileset("/tiled/tilesets/isogrid_tileset.json") - local layers, map_params = detiled.get_entity_from_map("/tiled/maps/isogrid_staggered.json") + local layers, map_params = detiled.parse("/tiled/maps/isogrid_staggered.json") spawn_map(layers) self.map_params = map_params diff --git a/test/test_detiled.lua b/test/test_detiled.lua index 94341cd..919f8c4 100644 --- a/test/test_detiled.lua +++ b/test/test_detiled.lua @@ -9,7 +9,7 @@ return function() it("Should init correclty", function() detiled.load_tileset("/resources/tilesets/shooting_circle.json") - local layers, map_params = detiled.get_entity_from_map("/resources/maps/game.json") + local layers, map_params = detiled.parse("/resources/maps/game.json") assert(layers) assert(map_params) end) From af931032b9bd8d4c2eeb8419292a5171d1fa5782 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 13 Apr 2026 11:51:51 +0300 Subject: [PATCH 68/71] Update API --- README.md | 29 +++++++++++++++-------------- api/detiled_api.md | 18 +++++++++--------- game.project | 2 +- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/README.md b/README.md index 0a69ecf..a40f096 100644 --- a/README.md +++ b/README.md @@ -9,12 +9,12 @@ # Detiled -**Detiled** - is a Defold library that converts [Tiled](https://www.mapeditor.org/) maps and tilesets into [Decore](https://github.com/Insality/decore) entities. +**Detiled** - is a Defold library that converts [Tiled](https://www.mapeditor.org/) maps and tilesets into easy to use entities. ## Features - Load tilesets with prefab definitions and component properties -- Convert Tiled maps to Decore entities +- Convert Tiled maps to easy to use entities - Use class names as prefab IDs, with fallback to image names - Support for custom properties and components from Tiled @@ -23,16 +23,10 @@ Open your `game.project` file and add the following line to the dependencies field under the project section: -**[Decore](https://github.com/Insality/decore)** +**[Detiled](https://github.com/Insality/detiled/archive/refs/tags/3.zip)** ``` -https://github.com/Insality/decore/archive/refs/tags/3.zip -``` - -**[Detiled](https://github.com/Insality/detiled/archive/refs/tags/2.zip)** - -``` -https://github.com/Insality/detiled/archive/refs/tags/2.zip +https://github.com/Insality/detiled/archive/refs/tags/3.zip ``` After that, select `Project ▸ Fetch Libraries` to update [library dependencies]((https://defold.com/manuals/libraries/#setting-up-library-dependencies)). This happens automatically whenever you open a project so you will only need to do this if the dependencies change without re-opening the project. @@ -103,10 +97,10 @@ Look at [Shooting Circles](https://github.com/Insality/shooting_circles) or [Cos ```lua detiled.set_logger(logger_instance) -detiled.load_tileset(tileset_path_or_data) -detiled.get_entity_from_map(map_path_or_data) -- returns layers, map_params -detiled.cell_to_pos(map_params, i, j) -- returns x, y -detiled.pos_to_cell(map_params, x, y) -- returns i, j +detiled.load_tileset(tileset_path_or_data) -- required before parsing a map +detiled.parse(map_path_or_data) -- returns layers, map_params +detiled.cell_to_pos(i, j, map_params) -- returns x, y +detiled.pos_to_cell(x, y, map_params) -- returns i, j ``` ### API Reference @@ -138,6 +132,13 @@ For any issues, questions, or suggestions, please [create an issue](https://gith ### **V2** - Reworked API and documentation +### **V3** + - Unbind from Decore library + - Rename `detiled.get_entity_from_map` to `detiled.parse` + - Add `detiled.cell_to_pos` and `detiled.pos_to_cell` API + - Rework map parse return params, now it's a layers table with entities and properties with map_params as second return value + - Add all grid types support, not only orthogonal. All hexagonal and isometric grids are supported. + ## ❤️ Support project ❤️ diff --git a/api/detiled_api.md b/api/detiled_api.md index df492f1..09ef0ef 100644 --- a/api/detiled_api.md +++ b/api/detiled_api.md @@ -5,7 +5,7 @@ ## Functions - [set_logger](#set_logger) -- [get_entity_from_map](#get_entity_from_map) +- [parse](#parse) - [load_tileset](#load_tileset) - [cell_to_pos](#cell_to_pos) - [pos_to_cell](#pos_to_cell) @@ -23,11 +23,11 @@ Set a logger instance - **Parameters:** - `[logger_instance]` *(table|detiled.logger|nil)*: -### get_entity_from_map +### parse --- ```lua -local layers, map_params = detiled.get_entity_from_map(map_or_path) +local layers, map_params = detiled.parse(map_or_path) ``` Load a tiled map and return layers (keyed by layer id) and map params. Entity positions do not include layer offset; add `layer_data.position` when spawning if needed. @@ -62,15 +62,15 @@ Load a tileset --- ```lua -detiled.cell_to_pos(map_params, i, j) +detiled.cell_to_pos(i, j, map_params) ``` -Convert cell indices to world position. Requires `map_params` from `get_entity_from_map` (same orientation as the map). +Convert cell indices to world position. Requires `map_params` from `parse` (same orientation as the map). - **Parameters:** - - `map_params` *(table)*: - `i` *(number)*: column index - `j` *(number)*: row index + - `map_params` *(detiled.map_params)*: - **Returns:** - *(number, number)*: x, y @@ -79,15 +79,15 @@ Convert cell indices to world position. Requires `map_params` from `get_entity_f --- ```lua -detiled.pos_to_cell(map_params, x, y) +detiled.pos_to_cell(x, y, map_params) ``` -Convert world position to cell indices. Requires `map_params` from `get_entity_from_map`. +Convert world position to cell indices. Requires `map_params` from `parse`. - **Parameters:** - - `map_params` *(table)*: - `x` *(number)*: world x - `y` *(number)*: world y + - `map_params` *(detiled.map_params)*: - **Returns:** - *(number, number)*: i, j diff --git a/game.project b/game.project index 3f8210e..11a2d41 100644 --- a/game.project +++ b/game.project @@ -13,7 +13,7 @@ input_method = HiddenInputField [project] title = Detiled -version = 2 +version = 3 custom_resources = /tiled/maps,/tiled/tilesets dependencies#0 = https://github.com/britzl/deftest/archive/refs/tags/2.8.0.zip dependencies#1 = https://github.com/Insality/defold-event/archive/refs/tags/14.zip From 60864a36aa80e29a9a8058e5e900e98683df15c0 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 13 Apr 2026 13:07:14 +0300 Subject: [PATCH 69/71] Update API and docs --- README.md | 170 ++++++++++++++++++----- api/detiled_api.md | 53 ++++--- api/detiled_entity_type.md | 47 +++++++ api/detiled_layer_type.md | 39 ++++++ detiled/detiled.lua | 4 +- detiled/internal/detiled_annotations.lua | 2 + detiled/internal/detiled_parser.lua | 2 +- 7 files changed, 254 insertions(+), 63 deletions(-) create mode 100644 api/detiled_entity_type.md create mode 100644 api/detiled_layer_type.md diff --git a/README.md b/README.md index a40f096..171faf0 100644 --- a/README.md +++ b/README.md @@ -9,14 +9,14 @@ # Detiled -**Detiled** - is a Defold library that converts [Tiled](https://www.mapeditor.org/) maps and tilesets into easy to use entities. +**Detiled** is a Defold library that converts [Tiled](https://www.mapeditor.org/) maps and tilesets into easy-to-use entities. It supports all Tiled grid types: orthogonal, hexagonal, and isometric. ## Features -- Load tilesets with prefab definitions and component properties -- Convert Tiled maps to easy to use entities -- Use class names as prefab IDs, with fallback to image names -- Support for custom properties and components from Tiled +- Load tilesets and parse maps to get map entities +- Use prefab IDs to spawn game entities +- Adjust entity's properties from tilesets and maps +- Convert cell indices to world position and vice versa ### Setup @@ -29,7 +29,7 @@ Open your `game.project` file and add the following line to the dependencies fie https://github.com/Insality/detiled/archive/refs/tags/3.zip ``` -After that, select `Project ▸ Fetch Libraries` to update [library dependencies]((https://defold.com/manuals/libraries/#setting-up-library-dependencies)). This happens automatically whenever you open a project so you will only need to do this if the dependencies change without re-opening the project. +After that, select `Project ▸ Fetch Libraries` to update [library dependencies](https://defold.com/manuals/libraries/#setting-up-library-dependencies). This happens automatically whenever you open a project, so you only need to do this if dependencies change without re-opening the project. ### Library Size @@ -43,47 +43,151 @@ After that, select `Project ▸ Fetch Libraries` to update [library dependencies ## Setup -### Workflow -### Prefab ID Resolution +### Tiled -Prefab IDs are determined in this order: -1. `class` field from the tile or object in Tiled -2. `type` field as fallback -3. Image filename (without path/extension) as final fallback +Tiled is a map editor for creating 2D games. It is used to create maps and tilesets for your game. +Detiled supports tilesets and exports maps as Lua table entities for Defold, which can be used to spawn game entities. -### Object Types -- **Tile Objects** - Objects with `gid` (from tileset) use tileset properties -- **Class Objects** - Objects with `class` field spawn as that prefab type -- **Empty Objects** - Objects without `gid` or `class` spawn as basic entities +#### Creating Tilesets -### Custom Properties +Detiled supports collection-of-images tilesets, because each tile should have an associated prefab. Single-image tilesets are not supported. -To override component properties from Tiled: +Create a new tileset and add images to it. Usually, you will have a `/tiled` folder with all Tiled files for the project. Place the tileset inside `/tiled/tilesets` and add this folder as a custom resource in `game.project`. -1. **Setup Custom Types in Tiled**: - - Go to `View -> Custom Types Editor` - - Add your custom class with the property name matching your component - - Example: Create a `movement` class with `stick` (bool) and `speed` (int) properties +```init +[project] +custom_resources = /tiled/tilesets +``` + +Each tile in a tileset has a `prefab_id`, which will be available in your Defold project. By default, `prefab_id` is the image name without extension. For example, `player.png` becomes `player`. You can change `prefab_id` in the tileset editor by setting the tile `class`. This way, one image can have multiple `prefab_id` values. + + +#### Creating Maps + +Create a new map and save it in `/tiled/maps` with the `.json` extension. Since Detiled loads JSON files, this keeps the workflow simple. + +To load JSON files, add this folder as a custom resource in `game.project`. + +```init +[project] +custom_resources = /tiled/tilesets,/tiled/maps +``` + +Now you can create tile and object layers and place entities directly on the map. +You can also add shapes (rectangle, point, polygon, polyline, ellipse) directly on the map. Since these entities have no tileset tile associated with them, they have no `prefab_id` by default. You can assign a `prefab_id` by setting a `class` on the map object. + +Each tile from a tileset will be exported as a single entity. + + +#### Custom Properties + +Tiled has good support for custom properties. Open `View -> Custom Types Editor` and add custom classes with the properties you need. +You can add and override custom properties on tiles in tilesets or directly on object instances in maps. In `Custom Types Editor`, use defaults only as editor-time templates, because this default data is not exported to Defold. + + +### Defold + +When tilesets and maps are ready, you can spawn entities. + +Detiled library provides a simple API to parse maps and tilesets. + +```lua +detiled.load_tileset(tileset_path_or_data) -- required before parsing a map +detiled.parse(map_path_or_data) -- returns layers, map_params +``` + + +#### Loading Tilesets -2. **Use in Tilesets or Maps**: - - Add the custom property to tiles in tilesets or directly to object instances in maps - - Properties with `propertytype` matching the property name become components +First, load the tileset used by your maps. -3. **Property Override Hierarchy** (highest priority first): - - Map instance properties - - Tileset properties - - Entity definition properties - - Default Decore component values +```lua +local detiled = require("detiled.detiled") +detiled.load_tileset("/tiled/tilesets/my_tileset.json") +``` + +#### Parsing Maps + +Then parse a map to get a layers table and `map_params` as the second return value. + +```lua +local layers, map_params = detiled.parse("/tiled/maps/my_map.json") +``` + +`layers` is a table with layer id as key and layer data as value. Layer data contains an `entities` list and layer properties. Iterate over it to create game objects. + + +```lua +---@param entity detiled.entity +---@param layer_data detiled.layer_data +local function spawn_entity(entity, layer_data) + local prefab_id = entity.prefab_id + local transform = entity.transform + + local position = vmath.vector3( + transform.position_x + layer_data.position_x, + transform.position_y + layer_data.position_y, + transform.position_z + layer_data.position_z + ) + local scale = vmath.vector3(transform.scale_x, transform.scale_y, 1) + + local factory_url = "/entities#" .. prefab_id + factory.create(factory_url, position, nil, nil, scale) +end + + +---@param layers detiled.layers +local function spawn_map(layers) + for layer_name, layer_data in pairs(layers) do + local entities = layer_data.entities + local layer_position_x = layer_data.position_x -- Horizontal offset from layer settings + local layer_position_y = layer_data.position_y -- Vertical offset from layer settings + local layer_position_z = layer_data.position_z -- From position_z custom property on layer settings + local is_visible = layer_data.visible + + for _, entity in ipairs(entities) do + spawn_entity(entity, layer_data) + end + end +end +``` -Example: If an entity has `movement = { can_jump = true, speed = 20 }` by default, you can override just the `speed` in Tiled while keeping `can_jump = true`. +If you add custom properties to an entity in a tileset or map, they are available on the parsed entity. + +```lua +local function spawn_entity(entity, layer_data) + local prefab_id = entity.prefab_id + local my_component = entity.my_component + if my_component then + print(my_component.value) + end + + -- rest of the code +end +``` ### Layer Properties Layers support special properties: -- `position_z` - Sets the Z position for all entities spawned from this layer -- Objects can have their own `position_z` property that gets added to the layer's `position_z` +- `exclude` *(boolean)* - This layer is skipped and not parsed +- `position_z` *(number)* - Base Z for entities spawned from this layer + +Entities support specific properties: +- `position_z` - A position_z custom property value from layer settings +- `width` and `height` - Width and height of the entity, available only when `prefab_id` is missing + + +### Cell to Position and Position to Cell + +Detiled provides a simple API to convert cell indices to world position and vice versa. + +```lua +local layers, map_params = detiled.parse("/tiled/maps/my_map.json") +detiled.cell_to_pos(i, j, map_params) -- returns x, y +detiled.pos_to_cell(x, y, map_params) -- returns i, j +``` ## Game Example diff --git a/api/detiled_api.md b/api/detiled_api.md index 09ef0ef..ceee2be 100644 --- a/api/detiled_api.md +++ b/api/detiled_api.md @@ -6,9 +6,9 @@ - [set_logger](#set_logger) - [parse](#parse) -- [load_tileset](#load_tileset) - [cell_to_pos](#cell_to_pos) - [pos_to_cell](#pos_to_cell) +- [load_tileset](#load_tileset) ### set_logger @@ -27,67 +27,66 @@ Set a logger instance --- ```lua -local layers, map_params = detiled.parse(map_or_path) +detiled.parse(map_or_path) ``` -Load a tiled map and return layers (keyed by layer id) and map params. Entity positions do not include layer offset; add `layer_data.position` when spawning if needed. - -Each key in `layers` is a layer id (string). Each value is `detiled.layer_data`: `entities` (array), `properties`, `layer_id`, `visible`, `position` (vmath.vector3: offset_x, offset_y, position_z from layer). - -Each entity: `prefab_id`, `position` (vmath.vector3), `scale` (vmath.vector3); optional `image`, `rotation`; optional `name`, `tiled_id`, `size_x`, `size_y`; plus any custom properties from Tiled. +Get layers and map params from a map. Each layer has entities, properties, layer_id, visible, position (offset). - **Parameters:** - `map_or_path` *(string|detiled.map)*: - **Returns:** - - *(table)* layers - - *(detiled.map_params|nil)* map_params + - `` *(table)*: + - `` *(detiled.map_params|nil)*: -### load_tileset +### cell_to_pos --- ```lua -detiled.load_tileset(tileset_or_path) +detiled.cell_to_pos(i, j, map_params) ``` -Load a tileset +Convert cell indices to world position - **Parameters:** - - `tileset_or_path` *(string|detiled.tileset)*: + - `i` *(number)*: + - `j` *(number)*: + - `map_params` *(detiled.map_params)*: - **Returns:** - - `` *(detiled.tileset)*: + - `` *(number)*: + - `` *(number)*: -### cell_to_pos +### pos_to_cell --- ```lua -detiled.cell_to_pos(i, j, map_params) +detiled.pos_to_cell(x, y, map_params) ``` -Convert cell indices to world position. Requires `map_params` from `parse` (same orientation as the map). +Convert world position to cell indices - **Parameters:** - - `i` *(number)*: column index - - `j` *(number)*: row index + - `x` *(number)*: + - `y` *(number)*: - `map_params` *(detiled.map_params)*: - **Returns:** - - *(number, number)*: x, y + - `` *(number)*: + - `` *(number)*: -### pos_to_cell +### load_tileset --- ```lua -detiled.pos_to_cell(x, y, map_params) +detiled.load_tileset(tileset_or_path) ``` -Convert world position to cell indices. Requires `map_params` from `parse`. +Load a tileset to internal cache, so maps can reference it by name while parsing - **Parameters:** - - `x` *(number)*: world x - - `y` *(number)*: world y - - `map_params` *(detiled.map_params)*: + - `tileset_or_path` *(string|detiled.tileset)*: Path to tileset JSON file or tileset table - **Returns:** - - *(number, number)*: i, j + - `` *(detiled.tileset)*: + diff --git a/api/detiled_entity_type.md b/api/detiled_entity_type.md new file mode 100644 index 0000000..06a59bb --- /dev/null +++ b/api/detiled_entity_type.md @@ -0,0 +1,47 @@ +# detiled.entity API + +> at /detiled/internal/detiled_annotations.lua + +## Fields + +- [prefab_id](#prefab_id) +- [image](#image) +- [transform](#transform) +- [tiled_id](#tiled_id) +- [tiled_layer_id](#tiled_layer_id) +- [name](#name) +- [object_type](#object_type) +- [polyline](#polyline) +- [polygon](#polygon) + + + + +## Fields + +- **prefab_id** (_string_) + + +- **image** (_string_) + + +- **transform** (_detiled.entity.transform_) + + +- **tiled_id** (_number_) + + +- **tiled_layer_id** (_string_) + + +- **name** (_string_) + + +- **object_type** (_string_) + + +- **polyline** (_table_) + + +- **polygon** (_table_) + diff --git a/api/detiled_layer_type.md b/api/detiled_layer_type.md new file mode 100644 index 0000000..1ca738e --- /dev/null +++ b/api/detiled_layer_type.md @@ -0,0 +1,39 @@ +# detiled.layer_data API + +> at /detiled/internal/detiled_annotations.lua + +## Fields + +- [entities](#entities) +- [properties](#properties) +- [layer_id](#layer_id) +- [visible](#visible) +- [position_x](#position_x) +- [position_y](#position_y) +- [position_z](#position_z) + + + + +## Fields + +- **entities** (_detiled.entity[]_) + + +- **properties** (_detiled.map.property[]_) + + +- **layer_id** (_string_) + + +- **visible** (_boolean_) + + +- **position_x** (_number_): A layer Horizontal offset from layer settings + + +- **position_y** (_number_): A layer Vertical offset from layer settings + + +- **position_z** (_number_): A position_z custom property value from layer settings + diff --git a/detiled/detiled.lua b/detiled/detiled.lua index 31cc85f..384a0be 100644 --- a/detiled/detiled.lua +++ b/detiled/detiled.lua @@ -15,7 +15,7 @@ end ---Get layers and map params from a map. Each layer has entities, properties, layer_id, visible, position (offset). ---@param map_or_path detiled.map|string ----@return table, detiled.map_params|nil +---@return detiled.layers, detiled.map_params|nil function M.parse(map_or_path) local map = map_or_path if type(map_or_path) == "string" then @@ -30,7 +30,7 @@ function M.parse(map_or_path) end ---@cast map -string - local layers, map_params = detiled_parser.get_entities(map) + local layers, map_params = detiled_parser.parse(map) return layers, map_params end diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 766b2cc..93868d0 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -152,6 +152,8 @@ ---@field polyline table|nil ---@field polygon table|nil +---@alias detiled.layers table + ---@class detiled.layer_data ---@field entities detiled.entity[] ---@field properties detiled.map.property[] diff --git a/detiled/internal/detiled_parser.lua b/detiled/internal/detiled_parser.lua index 92970b5..7ae888d 100644 --- a/detiled/internal/detiled_parser.lua +++ b/detiled/internal/detiled_parser.lua @@ -178,7 +178,7 @@ end ---@param tiled_map detiled.map ---@return table, detiled.map_params|nil -function M.get_entities(tiled_map) +function M.parse(tiled_map) local layers = {} local grid_module = GRID_MODULES[tiled_map.orientation] local map_params = grid_module and grid_module.get_map_params_from_tiled(tiled_map) or nil From a3f57d5d31f359fa728913b428bb71574c6e7de1 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 13 Apr 2026 13:10:20 +0300 Subject: [PATCH 70/71] Add rotation to example --- README.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 171faf0..31bee09 100644 --- a/README.md +++ b/README.md @@ -132,9 +132,10 @@ local function spawn_entity(entity, layer_data) transform.position_z + layer_data.position_z ) local scale = vmath.vector3(transform.scale_x, transform.scale_y, 1) + local rotation = vmath.quat_rotation_z(math.rad(transform.rotation or 0)) local factory_url = "/entities#" .. prefab_id - factory.create(factory_url, position, nil, nil, scale) + factory.create(factory_url, position, rotation, nil, scale) end From b018d993aa3c9fc5f8f173077e5892147ad7c476 Mon Sep 17 00:00:00 2001 From: Insality Date: Mon, 13 Apr 2026 13:16:06 +0300 Subject: [PATCH 71/71] Add adjusting entity position docs --- README.md | 9 +++++++-- detiled/internal/detiled_annotations.lua | 1 - 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 31bee09..6bbbe47 100644 --- a/README.md +++ b/README.md @@ -15,7 +15,7 @@ - Load tilesets and parse maps to get map entities - Use prefab IDs to spawn game entities -- Adjust entity's properties from tilesets and maps +- Adjust entity properties from tilesets and maps - Convert cell indices to world position and vice versa @@ -176,7 +176,7 @@ Layers support special properties: - `position_z` *(number)* - Base Z for entities spawned from this layer Entities support specific properties: -- `position_z` - A position_z custom property value from layer settings +- `position_z` - A position_z for the entity transform - `width` and `height` - Width and height of the entity, available only when `prefab_id` is missing @@ -191,6 +191,11 @@ detiled.pos_to_cell(x, y, map_params) -- returns i, j ``` +### Adjusting Entity Position + +You can set an `anchor` position for an entity in the tileset. This is useful when your Defold game object anchor differs from the sprite center. For example, a tree game object is usually placed on the ground. To adjust its placement, open the tileset, select the tree tile, and open `Tile Collision Editor`. Then add a `Point` object at the desired sprite anchor position. This point is used to calculate the final entity position in Defold. + + ## Game Example Look at [Shooting Circles](https://github.com/Insality/shooting_circles) or [Cosmic Dash](https://github.com/Insality/cosmic-dash-jam-2025) game examples to see how to use the Detiled library in a real game project. diff --git a/detiled/internal/detiled_annotations.lua b/detiled/internal/detiled_annotations.lua index 93868d0..74b40e1 100644 --- a/detiled/internal/detiled_annotations.lua +++ b/detiled/internal/detiled_annotations.lua @@ -130,7 +130,6 @@ ---@field firstgid number ---@field source string - ---@class detiled.entity.transform ---@field position_x number ---@field position_y number