2D_Engine_C/assets/maps/tiled-extensions/json_export_tool.mjs

217 lines
6.9 KiB
JavaScript

function stringifyFloat(floatNumber)
{
if(floatNumber == Math.trunc(floatNumber))
return String(floatNumber) + ".0"
return String(floatNumber);
}
function writeTileLayer(tileLayer, file)
{
file.writeLine(" \"" + tileLayer.name + "\": [");
for(let cell_y = 0; cell_y < tileLayer.height; ++cell_y)
{
file.write(" ");
for(let cell_x = 0; cell_x < tileLayer.width; ++cell_x)
{
file.write(" " + tileLayer.cellAt(cell_x, cell_y).tileId)
if(cell_x < tileLayer.width - 1 || cell_y < tileLayer.height - 1)
file.write(",");
}
file.writeLine("");
}
file.writeLine(" ],");
}
function writeEntities(objectLayer, file)
{
file.writeLine(" \"Entities\": [");
let entities = [];
for(let i = 0; i < objectLayer.objectCount; i++)
{
let entity = objectLayer.objectAt(i);
if(entity.name)
{
entities.push(entity);
}
}
entities.sort((a, b) => {
if(Number(a.name) > Number(b.name))
return 1;
return -1;
});
for(let i = 0; i < entities.length; i++)
{
let entity = entities[i];
file.writeLine(" {");
file.writeLine(" \"ID\":" + entity.name + ",");
file.writeLine(" \"Components\": [");
let components = entity.properties()["components"];
let nb_components = Object.keys(components).length;
for(let j = 0; j < nb_components; j++)
{
let component = components[j];
let component_type = component[0];
file.writeLine(" {");
file.write(" \"Type\": \"" + component_type + "\"");
if(component.length > 1)
{
file.writeLine(",");
file.writeLine(" \"Attributes\": [");
}
// Write atributes, speciale cases need speciale treatment.
if(component_type == "TRANSFORM_COMPONENT")
{
file.writeLine(",");
file.writeLine(" \"Attributes\": [");
file.writeLine(" " + stringifyFloat(entity.x) + ",");
file.writeLine(" " + stringifyFloat(entity.y) + ",");
file.writeLine(" " + stringifyFloat(entity.width) + ",");
file.writeLine(" " + stringifyFloat(entity.height));
file.writeLine(" ]");
}
else if(component_type == "HITBOX_COMPONENT")
{
let hitbox;
for(let k = 0; k < objectLayer.objectCount; k++)
{
hitbox = objectLayer.objectAt(k);
if(hitbox.id === component[1].id)
break;
}
let x = (hitbox.x - entity.x) / entity.width;
let y = (hitbox.y - entity.y) / entity.height;
let width = hitbox.width / entity.width;
let height = hitbox.height / entity.height;
file.writeLine(" " + stringifyFloat(x) + ",");
file.writeLine(" " + stringifyFloat(y) + ",");
file.writeLine(" " + stringifyFloat(width) + ",");
file.writeLine(" " + stringifyFloat(height));
}
else if(component_type == "INTERACT_COMPONENT")
{
let interact_box;
for(let k = 0; k < objectLayer.objectCount; k++)
{
interact_box = objectLayer.objectAt(k);
if(interact_box.id === component[1].id)
break;
}
let x = (interact_box.x - entity.x) / entity.width;
let y = (interact_box.y - entity.y) / entity.height;
let width = interact_box.width / entity.width;
let height = interact_box.height / entity.height;
file.writeLine(" " + stringifyFloat(x) + ",");
file.writeLine(" " + stringifyFloat(y) + ",");
file.writeLine(" " + stringifyFloat(width) + ",");
file.writeLine(" " + stringifyFloat(height) + ",");
file.writeLine(" " + component[2] + ",");
file.writeLine(" " + component[3] + ",");
file.writeLine(" " + component[4]);
}
else if(component_type == "SPRITE_COMPONENT")
{
file.writeLine(" \"" + component[1] + "\"");
}
else if(component_type == "ANIMATION_SYSTEM")
{
file.writeLine(" " + component[1] + ",");
file.writeLine(" " + component[2] + ",");
file.writeLine(" " + stringifyFloat(component[3]) + ",");
file.writeLine(" " + component[4] + ",");
file.writeLine(" " + component[5] + ",");
file.writeLine(" " + component[6]);
}
else if(component_type == "LEVER_COMPONENT")
{
file.writeLine(" " + component[1] + ",");
file.writeLine(" " + component[2]);
}
else if(component_type == "DOOR_COMPONENT")
{
file.writeLine(" " + component[1] + ",");
file.writeLine(" " + component[2]);
}
else
{
throw new Error("Component type not supported for exporting : " + component_type);
}
if(component.length > 1)
file.writeLine(" ]");
if(j == nb_components - 1)
file.writeLine(" }");
else
file.writeLine(" },");
}
file.writeLine(" ]");
if(i == entities.length - 1)
file.writeLine(" }");
else
file.writeLine(" },");
}
file.writeLine(" ]");
}
var customMapFormat = {
name: "Custom MAP format",
extension: "map",
write: function(map, fileName)
{
let file = new TextFile(fileName, TextFile.WriteOnly);
file.writeLine("{");
file.writeLine(" \"MapWidth\": " + map.width + ",");
file.writeLine(" \"MapHeight\": " + map.height + ",");
file.writeLine("");
for(let i = 0; i < map.layerCount; i++)
{
let layer = map.layerAt(i);
if(layer.isTileLayer)
{
writeTileLayer(layer, file);
}
else if(layer.isObjectLayer)
{
writeEntities(layer, file);
}
}
file.write("}");
file.commit();
},
}
tiled.registerMapFormat("custom", customMapFormat)