diff mlk-tileset/mlk-tileset.c @ 435:556c8e2ff995

misc: move tools/* in /
author David Demelier <markand@malikania.fr>
date Sun, 16 Oct 2022 08:31:01 +0200
parents src/tools/tileset/mlk-tileset.c@6947c1fefe5c
children 773a082f0b91
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mlk-tileset/mlk-tileset.c	Sun Oct 16 08:31:01 2022 +0200
@@ -0,0 +1,204 @@
+/*
+ * main.c -- convert tiled tilesets JSON files into custom files
+ *
+ * Copyright (c) 2020-2022 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <assert.h>
+#include <stdarg.h>
+#include <stdio.h>
+#include <string.h>
+
+#include <jansson.h>
+
+static void
+die(const char *fmt, ...)
+{
+	assert(fmt);
+
+	va_list ap;
+
+	va_start(ap, fmt);
+	vfprintf(stderr, fmt, ap);
+	va_end(ap);
+	exit(1);
+}
+
+static void
+write_dimensions(const json_t *document)
+{
+	const json_t *tilewidth = json_object_get(document, "tilewidth");
+	const json_t *tileheight = json_object_get(document, "tileheight");
+
+	if (!json_is_integer(tilewidth))
+		die("invalid 'tilewidth' property\n");
+	if (!json_is_integer(tileheight))
+		die("invalid 'tileheight' property\n");
+
+	printf("tilewidth|%u\n", (unsigned int)json_integer_value(tilewidth));
+	printf("tileheight|%u\n", (unsigned int)json_integer_value(tileheight));
+}
+
+static void
+write_image(const json_t *document)
+{
+	const json_t *image = json_object_get(document, "image");
+
+	if (!json_is_string(image))
+		die("invalid 'image' property\n");
+
+	printf("image|%s\n", json_string_value(image));
+}
+
+static const json_t *
+find_property_value(const json_t *array, const char *prop)
+{
+	const json_t *obj;
+	size_t i;
+
+	json_array_foreach(array, i, obj) {
+		const json_t *name = json_object_get(obj, "name");
+
+		if (!name || !json_is_string(name))
+			die("invalid property object\n");
+
+		if (strcmp(json_string_value(name), prop) == 0)
+			return json_object_get(obj, "value");
+	}
+
+	return NULL;
+}
+
+static void
+write_animation(const json_t *tile)
+{
+	const json_t *id = json_object_get(tile, "id");
+	const json_t *properties = json_object_get(tile, "properties");
+	const json_t *file = find_property_value(properties, "animation-file");
+	const json_t *delay = find_property_value(properties, "animation-delay");
+
+	/* Animations are completely optional. */
+	if (!json_is_array(properties))
+		return;
+
+	if (!json_is_integer(id))
+		die("invalid 'id' property in tile\n");
+
+	if (json_is_string(file)) {
+		printf("%d|%s|", (int)json_integer_value(id), json_string_value(file));
+
+		if (json_is_integer(delay))
+			printf("%d\n", (int)json_integer_value(delay));
+		else
+			printf("10\n");
+	}
+}
+
+static void
+write_tiledef(const json_t *tile)
+{
+	const json_t *id = json_object_get(tile, "id");
+	const json_t *objectgroup = json_object_get(tile, "objectgroup");
+	const json_t *objects = json_object_get(objectgroup, "objects");
+	const json_t *first = json_array_get(objects, 0);
+	const json_t *x, *y, *w, *h;
+
+	/* Collisions are optional. */
+	if (!json_is_object(objectgroup))
+		return;
+
+	if (!json_is_integer(id))
+		die("invalid 'id' property in tile\n");
+	if (!json_is_array(objects))
+		die("invalid 'objects' property in tile\n");
+
+	x = json_object_get(first, "x");
+	y = json_object_get(first, "y");
+	w = json_object_get(first, "width");
+	h = json_object_get(first, "height");
+
+	if (!json_is_integer(x) || !json_is_integer(y) ||
+	    !json_is_integer(w) || !json_is_integer(h))
+		die("invalid collide object in tile description\n");
+
+	printf("%d|%d|%d|%d|%d\n",
+	    (int)json_integer_value(id),
+	    (int)json_integer_value(x),
+	    (int)json_integer_value(y),
+	    (int)json_integer_value(w),
+	    (int)json_integer_value(h));
+}
+
+static void
+write_tiledefs(const json_t *tiles)
+{
+	size_t index;
+	json_t *object;
+
+	if (!json_is_array(tiles))
+		return;
+
+	puts("tiledefs");
+
+	json_array_foreach(tiles, index, object) {
+		if (!json_is_object(object))
+			die("tile is not an object\n");
+
+		write_tiledef(object);
+	}
+}
+
+static void
+write_animations(const json_t *tiles)
+{
+	size_t index;
+	json_t *object;
+
+	if (!json_is_array(tiles))
+		return;
+
+	puts("animations");
+
+	json_array_foreach(tiles, index, object) {
+		if (!json_is_object(object))
+			die("tile is not an object\n");
+
+		write_animation(object);
+	}
+}
+
+int
+main(int argc, char *argv[])
+{
+	(void)argc;
+	(void)argv;
+
+	json_t *document;
+	json_error_t error;
+
+	document = json_loadf(stdin, 0, &error);
+
+	if (!document)
+		die("%d:%d: %s\n", error.line, error.column, error.text);
+	if (!json_is_object(document))
+		die("root value isn't an object\n");
+
+	write_dimensions(document);
+	write_image(document);
+	write_tiledefs(json_object_get(document, "tiles"));
+	write_animations(json_object_get(document, "tiles"));
+
+	json_decref(document);
+}