2
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
1 ---------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
2 -- -= Loader =-
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
3 ---------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
4
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
5 -- Define path so lua knows where to look for files.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
6 TILED_LOADER_PATH = TILED_LOADER_PATH or ({...})[1]:gsub("[%.\\/][Ll]oader$", "") .. '.'
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
7
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
8 -- A cache to store tileset images so we don't load them multiple times. Filepaths are keys.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
9 local cache = setmetatable({}, {__mode = "v"})
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
10
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
11 -- This stores cached images' original dimensions. Images are weak keys.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
12 local cache_imagesize = setmetatable({}, {__mode="k"})
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
13
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
14 -- Decompresses gzip and zlib
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
15 local decompress = require(TILED_LOADER_PATH .. "external/deflatelua")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
16
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
17 -- XML parser
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
18 local xml = require(TILED_LOADER_PATH .. "external/xml")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
19
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
20 -- Base64 parser, Turns base64 strings into other data formats
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
21 local base64 = require(TILED_LOADER_PATH .. "Base64")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
22
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
23 -- Get the map classes
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
24 local Map = require(TILED_LOADER_PATH .. "Map")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
25 local TileSet = require(TILED_LOADER_PATH .. "TileSet")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
26 local TileLayer = require(TILED_LOADER_PATH .. "TileLayer")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
27 local Tile = require(TILED_LOADER_PATH .. "Tile")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
28 local Object = require(TILED_LOADER_PATH .. "Object")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
29 local ObjectLayer = require(TILED_LOADER_PATH .. "ObjectLayer")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
30
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
31 local Loader = {
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
32 path = "", -- The path to tmx files.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
33 filterMin = "nearest", -- The default min filter for image:setFilter()
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
34 filterMag = "nearest", -- The default mag filter for image:setFilter()
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
35 useSpriteBatch = true, -- The default setting for map.useSpriteBatch
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
36 drawObjects = true, -- The default setting for map.drawObjects.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
37 saveDirectory = "Saved Maps", -- The directory to use for Loader.save()
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
38 }
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
39
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
40 local filename -- The name of the tmx file
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
41 local fullpath -- The full path to the tmx file minus the name
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
42
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
43 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
44 -- Loads a Map from a tmx file and returns it.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
45 function Loader.load(tofile)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
46
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
47 -- Get the raw path
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
48 fullpath = Loader.path .. tofile
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
49
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
50 -- Process directory up
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
51 while string.find(fullpath, "[/\\][^/^\\]+[/\\]%.%.[/\\]") do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
52 fullpath = string.gsub(fullpath, "[/\\][^/^\\]+[/\\]%.%.[/\\]", "/", 1)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
53 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
54
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
55 -- Get the file name
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
56 filename = string.match(fullpath, "[^/^\\]+$")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
57
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
58 -- Get the path to the file
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
59 fullpath = string.gsub(fullpath, "[^/^\\]+$", "")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
60
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
61 -- Find out if the file is in the game or save directory
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
62 if love.filesystem.exists(fullpath .. filename) then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
63 elseif love.filesystem.exists(fullpath .. filename .. ".tmx") then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
64 filename = filename .. ".tmx"
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
65 elseif love.filesystem.exists(Loader.saveDirectory.."/"..filename) then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
66 fullpath = Loader.saveDirectory .. "/"
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
67 elseif love.filesystem.exists(Loader.saveDirectory .. "/" .. filename .. ".tmx") then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
68 fullpath = Loader.saveDirectory .. "/"
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
69 filename = filename .. ".tmx"
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
70 else
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
71 error("Loader.load() Could not find find the file in these locations:\n" ..
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
72 "\nGame Directory: " .. fullpath .. filename ..
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
73 "\nGame Directory: " .. fullpath .. filename .. ".tmx" ..
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
74 "\nSave Directory: " .. Loader.saveDirectory.."/"..filename ..
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
75 "\nSave Directory: " .. Loader.saveDirectory.."/"..filename .. ".tmx")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
76 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
77
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
78 -- Read the file and parse it into a table
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
79 local t = love.filesystem.read(fullpath .. filename)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
80 t = xml.string_to_table(t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
81
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
82 -- Get the map and expand it
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
83 for _, v in pairs(t) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
84 if v.label == "map" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
85 return Loader._expandMap(fullpath .. filename, v)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
86 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
87 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
88
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
89 -- If we made this this far then there wasn't a map tag
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
90 error("Loader.load - No map found in file " .. fullpath .. filename)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
91 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
92
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
93 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
94 -- Saves a map to a file.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
95 function Loader.save(map, filename)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
96 local mapx = Loader._compactMap(map)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
97 if not love.filesystem.exists(Loader.saveDirectory) then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
98 love.filesystem.mkdir(Loader.saveDirectory)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
99 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
100 love.filesystem.write( Loader.saveDirectory .. "/" .. filename, xml.table_to_string(mapx) )
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
101 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
102
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
103 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
104 -- Checks to see if a saved map exists
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
105 function Loader.savedMapExists(filename)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
106 if love.filesystem.exists(Loader.saveDirectory.."/"..filename) then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
107 return true
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
108 elseif love.filesystem.exists(Loader.saveDirectory .. "/" .. filename .. ".tmx") then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
109 return true
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
110 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
111 return false
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
112 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
113
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
114 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
115 -- Private
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
116 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
117
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
118 -- Returns a new image from the filename.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
119 function Loader._newImage(source)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
120 return love.graphics.newImage(source), source:getWidth(), source:getHeight()
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
121 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
122
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
123 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
124 -- Checks to see if the table is a valid XML table
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
125 function Loader._checkXML(t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
126 assert(type(t) == "table", "Loader._checkXML - Passed value is not a table")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
127 assert(t ~= Loader, "Loader._checkXML - Passed table is the Loader class. " ..
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
128 "You probably used a : instead of a .")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
129 assert(t.label, "Loader._checkXML - Table does not contain a label value")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
130 assert(t.xarg, "Loader._checkXML - Table does not contain an xarg table")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
131 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
132
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
133 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
134 -- This is used to eliminate naming conflicts. It checks to see if the string is inside the table and
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
135 -- continues to rename it until there isn't a conflict.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
136 function Loader._checkName(t, str)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
137 while t[str] do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
138 if string.find(str, "%(%d+%)$") == nil then str = str .. "(1)" end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
139 str = string.gsub(str, "%(%d+%)$", function(a) return "(" ..
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
140 tonumber( string.sub(a, string.find(a, "%d+")) ) + 1 .. ")" end)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
141 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
142 return str
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
143 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
144
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
145 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
146 -- Processes a properties table and returns it
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
147 function Loader._expandProperties(t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
148
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
149 -- Do some checking
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
150 Loader._checkXML(t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
151 if t.label ~= "properties" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
152 error("Loader._expandProperties - Passed value is not a properties table")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
153 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
154
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
155 -- Create a properties table and populate it. Will attempt to convert the property to
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
156 -- the appropriate type.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
157 local prop = {}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
158 for _,v in pairs(t) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
159 Loader._checkXML(t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
160 if v.label == "property" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
161 if v.xarg.value == "true" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
162 prop[v.xarg.name] = true
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
163 elseif v.xarg.value == "false" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
164 prop[v.xarg.name] = false
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
165 else
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
166 prop[v.xarg.name] = tonumber(v.xarg.value) or v.xarg.value
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
167 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
168 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
169 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
170
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
171 -- Return the properties
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
172 return prop
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
173 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
174
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
175 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
176 -- Process Map data from xml table
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
177 function Loader._expandMap(name, t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
178
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
179 -- Do some checking
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
180 Loader._checkXML(t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
181 assert(t.label == "map", "Loader._expandMap - Passed table is not a map")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
182 assert(t.xarg.width, t.xarg.height, t.xarg.tilewidth, t.xarg.tileheight,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
183 "Loader._expandMap - Map data is corrupt")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
184
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
185 -- We'll use these for temporary storage
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
186 local map, tileset, tilelayer, objectlayer, props
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
187 local props = {}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
188
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
189 -- Get the properties
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
190 for _, v in ipairs(t) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
191 if v.label == "properties" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
192 props = Loader._expandProperties(v)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
193 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
194 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
195
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
196 -- Create the map from the settings
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
197 local map = Map:new(name, tonumber(t.xarg.width),tonumber(t.xarg.height),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
198 tonumber(t.xarg.tilewidth), tonumber(t.xarg.tileheight),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
199 t.xarg.orientation, props.atl_directory or fullpath, props)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
200
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
201 -- Apply the loader settings if atl_useSpriteBatch or atl_drawObjects was not set
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
202 map.useSpriteBatch = map.useSpriteBatch == nil and Loader.useSpriteBatch or map.useSpriteBatch
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
203 map.drawObjects = map.drawObjects == nil and Loader.drawObjects or map.drawObjects
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
204
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
205 -- Now we fill it with the content
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
206 for _, v in ipairs(t) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
207
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
208 -- Process TileSet
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
209 if v.label == "tileset" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
210 tileset = Loader._expandTileSet(v, map)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
211 map.tilesets[tileset.name] = tileset
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
212 map:updateTiles()
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
213 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
214
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
215 -- Process TileLayer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
216 if v.label == "layer" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
217 tilelayer = Loader._expandTileLayer(v, map)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
218 map.layers[tilelayer.name] = tilelayer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
219 map.layerOrder[#map.layerOrder + 1] = tilelayer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
220 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
221
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
222 -- Process ObjectLayer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
223 if v.label == "objectgroup" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
224 objectlayer = Loader._expandObjectLayer(v, map)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
225 map.layers[objectlayer.name] = objectlayer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
226 map.layerOrder[#map.layerOrder + 1] = objectlayer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
227 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
228
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
229 -- Process CustomLayer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
230 if v.label == "customlayer" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
231 map:newCustomLayer(v.xarg.name)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
232 for _, v2 in ipairs(v) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
233 if v2.label == "data" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
234 map(v.xarg.name).data = v2[1]
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
235 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
236 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
237 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
238
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
239 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
240
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
241 -- Return our map
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
242 return map
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
243 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
244
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
245 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
246 -- Process TileSet from xml table
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
247 function Loader._expandTileSet(t, map)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
248
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
249 -- Do some checking
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
250 Loader._checkXML(t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
251 assert(t.label == "tileset", "Loader._expandTileSet - Passed table is not a tileset")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
252
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
253 -- If the tileset is an external one then replace it as the tileset. The firstgid is
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
254 -- stored in the tileset tag in the original file while the rest of the tileset information
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
255 -- is stored in the external file.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
256 if t.xarg.source then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
257 local gid = t.xarg.firstgid
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
258 t = love.filesystem.read(map._directory .. t.xarg.source)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
259 for _,v in pairs(xml.string_to_table(t)) do if v.label == "tileset" then t = v end end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
260 t.xarg.firstgid = gid
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
261 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
262
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
263 if not t.xarg.name or not t.xarg.tilewidth or not t.xarg.tileheight or not t.xarg.firstgid then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
264 error("Loader._expandTileSet - Tileset data is corrupt")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
265 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
266
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
267
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
268 -- Temporary storage
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
269 local image, imagePath, imageWidth, imageHeight, path, prop, tileSetProperties, trans
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
270 local tileProperties = {}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
271 local offsetX, offsetY = 0, 0
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
272
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
273 -- Process elements
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
274 for _, v in ipairs(t) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
275 -- Process image
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
276 if v.label == "image" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
277 imagePath = v.xarg.source
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
278 path = map._directory .. v.xarg.source
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
279 -- Process directory up
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
280 while string.find(path, "[^/^\\]+[/\\]%.%.[/\\]") do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
281 path = string.gsub(path, "[^/^\\]+[/\\]%.%.[/\\]", "", 1)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
282 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
283 -- If the image is in the cache then load it
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
284 if cache[path] then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
285 image = cache[path]
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
286 imageWidth = cache_imagesize[image].width
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
287 imageHeight = cache_imagesize[image].height
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
288 -- Else load it and store in the cache
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
289 else
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
290 image = love.image.newImageData(path)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
291 -- transparent color
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
292 if v.xarg.trans then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
293 trans = { tonumber( "0x" .. v.xarg.trans:sub(1,2) ),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
294 tonumber( "0x" .. v.xarg.trans:sub(3,4) ),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
295 tonumber( "0x" .. v.xarg.trans:sub(5,6) )}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
296 image:mapPixel( function(x,y,r,g,b,a)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
297 return r,g,b, (trans[1] == r and trans[2] == g and trans[3] ==b and 0) or a end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
298 )
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
299 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
300 -- Set the image information
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
301 image, imageWidth, imageHeight = Loader._newImage(image)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
302 image:setFilter(Loader.filterMin, Loader.filterMag)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
303 -- Cache the created image
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
304 cache[path] = image
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
305 cache_imagesize[image] = {width = imageWidth, height = imageHeight}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
306 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
307 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
308
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
309 -- Process tile properties
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
310 if v.label == "tile" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
311 for _, v2 in ipairs(v) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
312 if v2.label == "properties" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
313 -- Store the property. We must increase the id the starting gid
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
314 if not v.xarg.id then error(v.xarg.id) end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
315 tileProperties[v.xarg.id+t.xarg.firstgid] = Loader._expandProperties(v2)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
316 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
317 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
318 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
319
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
320 -- Process tile set properties
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
321 if v.label == "properties" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
322 tileSetProperties = Loader._expandProperties(v)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
323 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
324
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
325 -- Get the tile offset if there is one.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
326 if v.label == "tileoffset" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
327 offsetX, offsetY = tonumber(v.xarg.x or 0), tonumber(v.xarg.y or 0)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
328 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
329
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
330 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
331
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
332 -- Make sure that an image was loaded
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
333 assert(image, "Loader._expandTileSet - Tileset did not contain an image")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
334
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
335 -- Return the TileSet
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
336 local tileset = TileSet:new(image, imagePath, Loader._checkName(map.tilesets, t.xarg.name),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
337 tonumber(t.xarg.tilewidth), tonumber(t.xarg.tileheight),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
338 tonumber(imageWidth), tonumber(imageHeight),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
339 tonumber(t.xarg.firstgid), tonumber(t.xarg.spacing), tonumber(t.xarg.margin),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
340 offsetX, offsetY, trans, tileProperties, tileSetProperties)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
341 return tileset
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
342 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
343
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
344 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
345 -- Process TileLayer from xml table
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
346 function Loader._expandTileLayer(t, map)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
347
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
348 -- Do some checking
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
349 Loader._checkXML(t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
350 assert(t.label == "layer", "Loader._expandTileLayer - Passed table is not a tileset")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
351
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
352 -- Process elements
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
353 local data, properties
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
354 for _, v in ipairs(t) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
355 Loader._checkXML(t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
356
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
357 -- Process data
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
358 if v.label == "data" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
359 data = Loader._expandTileLayerData(v)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
360 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
361
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
362 -- Process TileLayer properties
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
363 if v.label == "properties" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
364 properties = Loader._expandProperties(v)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
365 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
366 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
367
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
368 -- Create the new layer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
369 local layer = TileLayer:new(map, t.xarg.name, t.xarg.opacity, properties)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
370
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
371 -- Set the visibility
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
372 layer.visible = not (t.xarg.visible == "0")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
373
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
374 -- Populate the tiles and return the layer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
375 layer:_populate(data)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
376 return layer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
377 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
378
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
379 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
380 -- Process TileLayer data from xml table
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
381 function Loader._expandTileLayerData(t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
382
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
383 -- Do some checking
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
384 Loader._checkXML(t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
385 assert(t.label == "data", "Loader._expandTileLayerData - Passed table is not TileLayer data")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
386
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
387 local data = {}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
388
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
389 -- If encoded by comma seperated value (csv) then cut each value out and put it into a table.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
390 if t.xarg.encoding == "csv" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
391 string.gsub(t[1], "[%-%d]+", function(a) data[#data+1] = tonumber(a) or 0 end)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
392 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
393
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
394 -- Base64 encoding. See base64.lua for more details.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
395 if t.xarg.encoding == "base64" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
396
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
397 -- If a compression method is used
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
398 if t.xarg.compression == "gzip" or t.xarg.compression == "zlib" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
399 -- Select the appropriate function
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
400 local decomp = t.xarg.compression == "gzip" and decompress.gunzip or decompress.inflate_zlib
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
401 -- Decompress the string into bytes
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
402 local bytes = {}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
403 decomp({input = base64.decode("string", t[1]), output = function(b) bytes[#bytes+1] = b end})
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
404 -- Glue the bytes into ints
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
405 for i=1,#bytes,4 do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
406 data[#data+1] = base64.glueInt(bytes[i],bytes[i+1],bytes[i+2],bytes[i+3])
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
407 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
408 -- If there is no compression then just convert to ints
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
409 else
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
410 data = base64.decode("int", t[1])
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
411 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
412 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
413
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
414 -- If there is no encoding then the file is probably saved as XML
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
415 if t.xarg.encoding == nil then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
416 for k,v in ipairs(t) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
417 if v.label == "tile" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
418 data[#data+1] = tonumber(v.xarg.gid)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
419 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
420 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
421 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
422
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
423 -- Return the data
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
424 return data
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
425 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
426
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
427 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
428 -- Process ObjectLayer from xml table
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
429 function Loader._expandObjectLayer(t, map)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
430
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
431 -- Do some checking
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
432 Loader._checkXML(t)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
433 if t.label ~= "objectgroup" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
434 error("Loader._expandObjectLayer - Passed table is not ObjectLayer data")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
435 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
436
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
437 -- Tiled stores colors in hexidecimal format that looks like "#FFFFFF"
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
438 -- We need go convert them into base 10 RGB format
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
439 if t.xarg.color == nil then t.xarg.color = "#000000" end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
440 local color = { tonumber( "0x" .. t.xarg.color:sub(2,3) ),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
441 tonumber( "0x" .. t.xarg.color:sub(4,5) ),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
442 tonumber( "0x" .. t.xarg.color:sub(6,7) )}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
443
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
444 -- Create a new layer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
445 local layer = ObjectLayer:new(map, Loader._checkName(map.layers, t.xarg.name), color,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
446 t.xarg.opacity)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
447
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
448 -- Process elements
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
449 local objects = {}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
450 local prop, obj, poly
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
451 for _, v in ipairs(t) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
452
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
453 -- Process objects
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
454 local obj
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
455 if v.label == "object" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
456 obj = Object:new(layer, v.xarg.name, v.xarg.type, tonumber(v.xarg.x),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
457 tonumber(v.xarg.y), tonumber(v.xarg.width),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
458 tonumber(v.xarg.height), tonumber(v.xarg.gid) )
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
459 objects[#objects+1] = obj
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
460 for _, v2 in ipairs(v) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
461
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
462 -- Process object properties
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
463 if v2.label == "properties" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
464 obj.properties = Loader._expandProperties(v2)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
465 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
466
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
467 -- Process polyline objects
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
468 local polylineFunct = function(a)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
469 obj.polyline[#obj.polyline+1] = tonumber(a) or 0
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
470 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
471 if v2.label == "polyline" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
472 obj.polyline = {}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
473 string.gsub(v2.xarg.points, "[%-%d]+", polylineFunct)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
474 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
475
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
476 -- Process polyline objects
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
477 local polygonFunct = function(a)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
478 obj.polygon[#obj.polygon+1] = tonumber(a) or 0
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
479 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
480 if v2.label == "polygon" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
481 obj.polygon = {}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
482 string.gsub(v2.xarg.points, "[%-%d]+", polygonFunct)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
483 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
484
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
485 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
486 obj:updateDrawInfo()
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
487 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
488
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
489 -- Process properties
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
490 if v.label == "properties" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
491 prop = Loader._expandProperties(v)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
492 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
493
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
494 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
495
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
496 -- Set the properties and object tables
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
497 layer.properties = prop or {}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
498 layer.objects = objects
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
499
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
500 -- Set the visibility
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
501 layer.visible = not (t.xarg.visible == "0")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
502
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
503 -- Return the layer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
504 return layer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
505 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
506
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
507 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
508 -- Compact a Map
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
509 function Loader._compactMap(map)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
510
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
511 -- Set the ATL properties
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
512 map.properties.atl_directory = map._directory
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
513 map.properties.atl_useSpritebatch = map.useSpriteBatch
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
514 map.properties.atl_viewX = map.viewX
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
515 map.properties.atl_viewY = map.viewY
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
516 map.properties.atl_viewW = map.viewW
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
517 map.properties.atl_viewH = map.viewH
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
518 map.properties.atl_viewScaling = map.viewScaling
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
519 map.properties.atl_viewPadding = map.viewPadding
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
520 map.properties.atl_drawObjects = map.drawObjects
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
521
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
522 -- <map>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
523 local mapx = {label="map", xarg = {
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
524 version = "1.0",
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
525 orientation = map.orientation,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
526 width = map.width,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
527 height = map.height,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
528 tilewidth = map.tileWidth,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
529 tileheight = map.tileHeight,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
530 }}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
531
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
532 -- <tileset>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
533 for k,tileset in pairs(map.tilesets) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
534 mapx[#mapx+1] = Loader._compactTileSet(tileset)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
535 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
536
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
537 local layer, layerx
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
538 for i = 1,#map.layerOrder do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
539 layer = map.layerOrder[i]
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
540
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
541 -- <layer>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
542 if layer.class == "TileLayer" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
543 mapx[#mapx+1] = Loader._compactTileLayer(layer)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
544
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
545 -- <objectgroup>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
546 elseif layer.class == "ObjectLayer" then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
547 mapx[#mapx+1] = Loader._compactObjectLayer(layer)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
548
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
549 -- <custom>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
550 elseif layer.encode then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
551 local layerx = {label="customlayer", xarg={name=layer.name}}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
552 layerx[1] = {label="data", xarg={}}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
553 layerx[1][1] = layer:encode()
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
554 mapx[#mapx+1] = layerx
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
555 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
556
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
557 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
558
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
559 -- <properties>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
560 mapx[#mapx+1] = Loader._compactProperties(map.properties)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
561 return mapx
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
562 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
563
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
564 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
565 -- Compact a TileSet
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
566 function Loader._compactTileSet(tileset)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
567
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
568 -- <Tileset>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
569 local tilesetx = {label="tileset", xarg = {
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
570 firstgid = tileset.firstgid,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
571 name = tileset.name,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
572 tilewidth = tileset.tileWidth,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
573 tileheight = tileset.tileHeight,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
574 spacing = tileset.spacing,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
575 margin = tileset.margin
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
576 }}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
577
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
578 -- <image>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
579 tilesetx[1] = {label="image", xarg = {
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
580 source = tileset.imagePath,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
581 trans = tileset.trans,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
582 }}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
583
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
584 -- <tileoffset>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
585 if tileset.offsetX ~= 0 or tileset.offsetY ~= 0 then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
586 tilesetx[2] = {label="tileoffset", xarg={x = tileset.offsetX, y = tileset.offsetY}}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
587 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
588
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
589 -- <properties>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
590 if next(tileset.properties) then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
591 tilesetx[#tilesetx+1] = Loader._compactProperties(tileset.properties)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
592 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
593
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
594 -- <tile>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
595 if next(tileset.tileProperties) then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
596 local tilex
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
597 for k,props in pairs(tileset.tileProperties) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
598 tilex = {label = "tile", xarg = {id = k - tileset.firstgid}}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
599 tilex[1] = Loader._compactProperties(props)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
600 tilesetx[#tilesetx+1] = tilex
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
601 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
602 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
603
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
604 return tilesetx
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
605 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
606
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
607 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
608 -- Compact a TileLayer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
609 function Loader._compactTileLayer(layer)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
610
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
611 -- Set the ATL properties
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
612 layer.properties.atl_useSpriteBatch = layer.useSpriteBatch
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
613 layer.properties.atl_parallaxX = layer.parallaxX
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
614 layer.properties.atl_parallaxY = layer.parallaxY
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
615 layer.properties.atl_offsetX = layer.offsetX
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
616 layer.properties.atl_offsetY = layer.offsetY
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
617
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
618 -- <layer>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
619 local layerx = {label="layer", xarg = {
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
620 name = layer.name,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
621 opacity = layer.opacity,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
622 visible = layer.visible and 1 or 0,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
623 width = layer.map.width,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
624 height = layer.map.height,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
625 }}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
626
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
627 -- <data>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
628 local tiles = {}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
629 local flipBits = 2^29
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
630 local flipValue
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
631 for x, y, tile in layer:rectangle(0, 0, layer.map.width-1, layer.map.height-1, true) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
632 if tile then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
633 flipValue = layer._flippedTiles(x,y) and layer._flippedTiles(x,y) * flipBits or 0
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
634 tiles[#tiles+1] = tile.id + flipValue
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
635 else
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
636 tiles[#tiles+1] = 0
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
637 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
638 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
639 layerx[1] = {label ="data", xarg = {encoding="csv"}, [1] = table.concat(tiles,",")}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
640
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
641 -- <properties>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
642 if next(layer.properties) then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
643 layerx[2] = Loader._compactProperties(layer.properties)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
644 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
645
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
646 return layerx
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
647 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
648
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
649 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
650 -- Compact an ObjectLayer
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
651 function Loader._compactObjectLayer(layer)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
652
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
653 -- <objectgroup>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
654 local layerx = {label = "objectgroup", xarg = {
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
655 name = layer.name,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
656 color = string.format("#%x%x%x", layer.color[1], layer.color[2], layer.color[3]),
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
657 opacity = layer.opacity,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
658 visible = layer.visible and 1 or 0,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
659 }}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
660
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
661 -- <object>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
662 for i = 1,#layer.objects do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
663 object = layer.objects[i]
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
664 layerx[#layerx+1] = Loader._compactObject(layer.objects[i])
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
665 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
666
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
667 -- <properties>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
668 if next(layer.properties) then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
669 layerx[#layerx+1] = Loader._compactProperties(layer.properties)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
670 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
671
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
672 return layerx
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
673 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
674
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
675 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
676 -- Compact an Object
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
677 function Loader._compactObject(object)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
678
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
679 -- <object>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
680 local objectx = {label="object", xarg = {
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
681 name = object.name,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
682 type = object.type,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
683 x = object.x,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
684 y = object.y,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
685 width = object.width,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
686 height = object.height,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
687 gid = object.gid,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
688 visible = object.visible,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
689 }}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
690
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
691 -- <polyline>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
692 if object.polyline then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
693 local polylinex = {label="polyline", xarg = {}}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
694 local points = {}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
695 for i = 1,#object.polyline,2 do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
696 points[#points+1] = object.polyline[i] .. "," .. object.polyline[i+1]
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
697 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
698 polylinex.xarg.points = table.concat(points, " ")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
699 objectx[#objectx+1] = polylinex
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
700 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
701
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
702 -- <polygon>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
703 if object.polygon then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
704 local polygonx = {label="polygon", xarg = {}}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
705 local points = {}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
706 for i = 1,#object.polygon,2 do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
707 points[#points+1] = object.polygon[i] .. "," .. object.polygon[i+1]
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
708 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
709 polygonx.xarg.points = table.concat(points, " ")
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
710 objectx[#objectx+1] = polygonx
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
711 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
712
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
713 -- <properties>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
714 if next(object.properties) then
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
715 objectx[#objectx+1] = Loader.compactProperties(object.properties)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
716 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
717
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
718 return objectx
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
719 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
720
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
721 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
722 -- Compact Properties
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
723 function Loader._compactProperties(prop)
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
724
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
725 if not prop then return end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
726
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
727 -- <properties>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
728 local propx = {label="properties", xarg={}}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
729
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
730 -- <property>
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
731 for k,v in pairs(prop) do
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
732 propx[#propx+1] = {label="property", xarg={name=k, value=v}}
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
733 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
734
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
735 return propx
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
736 end
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
737
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
738 ----------------------------------------------------------------------------------------------------
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
739 -- Return the loader
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
740 return Loader
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
741
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
742
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
743 --[[Copyright (c) 2011-2012 Casey Baxter
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
744
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
745 Permission is hereby granted, free of charge, to any person obtaining a copy
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
746 of this software and associated documentation files (the "Software"), to deal
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
747 in the Software without restriction, including without limitation the rights
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
748 to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
749 copies of the Software, and to permit persons to whom the Software is
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
750 furnished to do so, subject to the following conditions:
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
751
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
752 The above copyright notice and this permission notice shall be included in
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
753 all copies or substantial portions of the Software.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
754
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
755 Except as contained in this notice, the name(s) of the above copyright holders
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
756 shall not be used in advertising or otherwise to promote the sale, use or
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
757 other dealings in this Software without prior written authorization.
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
758
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
759 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
760 IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
761 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
762 AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
763 LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
764 OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
765 THE SOFTWARE.--]]
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
766
|
Radomir Dopieralski <sheep-devel@sheep.art.pl>
parents:
diff
changeset
|
767
|