2018-02-12 16:01:20 +00:00
|
|
|
/**
|
|
|
|
* @author Richard Davey <rich@photonstorm.com>
|
2020-01-15 12:07:09 +00:00
|
|
|
* @copyright 2020 Photon Storm Ltd.
|
2019-05-10 15:15:04 +00:00
|
|
|
* @license {@link https://opensource.org/licenses/MIT|MIT License}
|
2018-02-12 16:01:20 +00:00
|
|
|
*/
|
|
|
|
|
2017-12-01 19:24:37 +00:00
|
|
|
var Tileset = require('../../Tileset');
|
|
|
|
var ImageCollection = require('../../ImageCollection');
|
|
|
|
var ParseObject = require('./ParseObject');
|
|
|
|
|
2018-02-10 01:50:48 +00:00
|
|
|
/**
|
2019-06-12 11:35:41 +00:00
|
|
|
* Tilesets and Image Collections
|
2018-02-10 01:50:48 +00:00
|
|
|
*
|
|
|
|
* @function Phaser.Tilemaps.Parsers.Tiled.ParseTilesets
|
|
|
|
* @since 3.0.0
|
|
|
|
*
|
|
|
|
* @param {object} json - [description]
|
|
|
|
*
|
|
|
|
* @return {object} [description]
|
|
|
|
*/
|
2017-12-01 19:24:37 +00:00
|
|
|
var ParseTilesets = function (json)
|
|
|
|
{
|
|
|
|
var tilesets = [];
|
|
|
|
var imageCollections = [];
|
|
|
|
var lastSet = null;
|
|
|
|
var stringID;
|
|
|
|
|
|
|
|
for (var i = 0; i < json.tilesets.length; i++)
|
|
|
|
{
|
|
|
|
// name, firstgid, width, height, margin, spacing, properties
|
|
|
|
var set = json.tilesets[i];
|
|
|
|
|
|
|
|
if (set.source)
|
|
|
|
{
|
|
|
|
console.warn('Phaser can\'t load external tilesets. Use the Embed Tileset button and then export the map again.');
|
|
|
|
}
|
|
|
|
else if (set.image)
|
|
|
|
{
|
|
|
|
var newSet = new Tileset(set.name, set.firstgid, set.tilewidth, set.tileheight, set.margin, set.spacing);
|
|
|
|
|
2018-09-26 23:41:11 +00:00
|
|
|
if (json.version > 1)
|
2017-12-01 19:24:37 +00:00
|
|
|
{
|
2018-09-26 23:41:11 +00:00
|
|
|
// Tiled 1.2+
|
|
|
|
|
|
|
|
if (Array.isArray(set.tiles))
|
|
|
|
{
|
|
|
|
var tiles = {};
|
|
|
|
var props = {};
|
|
|
|
|
|
|
|
for (var t = 0; t < set.tiles.length; t++)
|
|
|
|
{
|
|
|
|
var tile = set.tiles[t];
|
|
|
|
|
|
|
|
// Convert tileproperties
|
|
|
|
if (tile.properties)
|
|
|
|
{
|
|
|
|
var newPropData = {};
|
|
|
|
|
|
|
|
tile.properties.forEach(function (propData)
|
|
|
|
{
|
|
|
|
newPropData[propData['name']] = propData['value'];
|
|
|
|
});
|
|
|
|
|
|
|
|
props[tile.id] = newPropData;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Convert objectgroup
|
|
|
|
if (tile.objectgroup)
|
|
|
|
{
|
|
|
|
tiles[tile.id] = { objectgroup: tile.objectgroup };
|
2017-12-01 19:24:37 +00:00
|
|
|
|
2018-09-26 23:41:11 +00:00
|
|
|
if (tile.objectgroup.objects)
|
|
|
|
{
|
|
|
|
var parsedObjects2 = tile.objectgroup.objects.map(
|
|
|
|
function (obj) { return ParseObject(obj); }
|
|
|
|
);
|
|
|
|
|
|
|
|
tiles[tile.id].objectgroup.objects = parsedObjects2;
|
|
|
|
}
|
|
|
|
}
|
2018-10-17 13:12:41 +00:00
|
|
|
|
|
|
|
// Copy animation data
|
2018-10-19 12:51:32 +00:00
|
|
|
if (tile.animation)
|
|
|
|
{
|
|
|
|
if (tiles.hasOwnProperty(tile.id))
|
|
|
|
{
|
2018-10-17 13:12:41 +00:00
|
|
|
tiles[tile.id].animation = tile.animation;
|
|
|
|
}
|
2018-10-19 12:51:32 +00:00
|
|
|
else
|
|
|
|
{
|
2018-10-17 13:12:41 +00:00
|
|
|
tiles[tile.id] = { animation: tile.animation };
|
|
|
|
}
|
|
|
|
}
|
2018-09-26 23:41:11 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
newSet.tileData = tiles;
|
|
|
|
newSet.tileProperties = props;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
2017-12-01 19:24:37 +00:00
|
|
|
{
|
2018-09-26 23:41:11 +00:00
|
|
|
// Tiled 1
|
2017-12-01 19:24:37 +00:00
|
|
|
|
2018-09-26 23:41:11 +00:00
|
|
|
// Properties stored per-tile in object with string indexes starting at "0"
|
|
|
|
if (set.tileproperties)
|
2017-12-01 19:24:37 +00:00
|
|
|
{
|
2018-09-26 23:41:11 +00:00
|
|
|
newSet.tileProperties = set.tileproperties;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Object & terrain shapes stored per-tile in object with string indexes starting at "0"
|
|
|
|
if (set.tiles)
|
|
|
|
{
|
|
|
|
newSet.tileData = set.tiles;
|
|
|
|
|
|
|
|
// Parse the objects into Phaser format to match handling of other Tiled objects
|
|
|
|
for (stringID in newSet.tileData)
|
2017-12-01 19:24:37 +00:00
|
|
|
{
|
2018-09-26 23:41:11 +00:00
|
|
|
var objectGroup = newSet.tileData[stringID].objectgroup;
|
|
|
|
if (objectGroup && objectGroup.objects)
|
|
|
|
{
|
|
|
|
var parsedObjects1 = objectGroup.objects.map(
|
|
|
|
function (obj) { return ParseObject(obj); }
|
|
|
|
);
|
|
|
|
newSet.tileData[stringID].objectgroup.objects = parsedObjects1;
|
|
|
|
}
|
2017-12-01 19:24:37 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// For a normal sliced tileset the row/count/size information is computed when updated.
|
|
|
|
// This is done (again) after the image is set.
|
|
|
|
newSet.updateTileData(set.imagewidth, set.imageheight);
|
|
|
|
|
|
|
|
tilesets.push(newSet);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
var newCollection = new ImageCollection(set.name, set.firstgid, set.tilewidth,
|
|
|
|
set.tileheight, set.margin, set.spacing, set.properties);
|
|
|
|
|
|
|
|
for (stringID in set.tiles)
|
|
|
|
{
|
|
|
|
var image = set.tiles[stringID].image;
|
|
|
|
var gid = set.firstgid + parseInt(stringID, 10);
|
|
|
|
newCollection.addImage(gid, image);
|
|
|
|
}
|
|
|
|
|
|
|
|
imageCollections.push(newCollection);
|
|
|
|
}
|
|
|
|
|
|
|
|
// We've got a new Tileset, so set the lastgid into the previous one
|
|
|
|
if (lastSet)
|
|
|
|
{
|
|
|
|
lastSet.lastgid = set.firstgid - 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
lastSet = set;
|
|
|
|
}
|
|
|
|
|
|
|
|
return { tilesets: tilesets, imageCollections: imageCollections };
|
|
|
|
};
|
|
|
|
|
|
|
|
module.exports = ParseTilesets;
|