annotate src/tools/tileset/main.c @ 320:8f9937403749

misc: improve loading of data
author David Demelier <markand@malikania.fr>
date Fri, 01 Oct 2021 20:30:00 +0200
parents tools/tileset/main.c@d01e83210ca2
children 7d7991f97acf
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
2 * main.c -- convert tiled tilesets JSON files into custom files
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
314
d01e83210ca2 misc: update years
David Demelier <markand@malikania.fr>
parents: 218
diff changeset
4 * Copyright (c) 2020-2021 David Demelier <markand@malikania.fr>
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdarg.h>
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <stdio.h>
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <stdnoreturn.h>
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
23 #include <string.h>
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <jansson.h>
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 static noreturn void
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 die(const char *fmt, ...)
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 {
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 assert(fmt);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 va_list ap;
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 va_start(ap, fmt);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 vfprintf(stderr, fmt, ap);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 va_end(ap);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 exit(1);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 }
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 static void
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 write_dimensions(const json_t *document)
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 {
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 const json_t *tilewidth = json_object_get(document, "tilewidth");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 const json_t *tileheight = json_object_get(document, "tileheight");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 if (!json_is_integer(tilewidth))
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 die("invalid 'tilewidth' property\n");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 if (!json_is_integer(tileheight))
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 die("invalid 'tileheight' property\n");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 printf("tilewidth|%u\n", (unsigned int)json_integer_value(tilewidth));
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 printf("tileheight|%u\n", (unsigned int)json_integer_value(tileheight));
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 }
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 static void
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 write_image(const json_t *document)
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 {
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 const json_t *image = json_object_get(document, "image");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 if (!json_is_string(image))
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 die("invalid 'image' property\n");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 printf("image|%s\n", json_string_value(image));
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 }
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
66 static const json_t *
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
67 find_property_value(const json_t *array, const char *prop)
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
68 {
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
69 const json_t *obj;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
70 size_t i;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
71
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
72 json_array_foreach(array, i, obj) {
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
73 const json_t *name = json_object_get(obj, "name");
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
74
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
75 if (!name || !json_is_string(name))
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
76 die("invalid property object\n");
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
77
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
78 if (strcmp(json_string_value(name), prop) == 0)
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
79 return json_object_get(obj, "value");
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
80 }
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
81
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
82 return NULL;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
83 }
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
84
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
85 static void
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
86 write_animation(const json_t *tile)
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
87 {
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
88 const json_t *id = json_object_get(tile, "id");
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
89 const json_t *properties = json_object_get(tile, "properties");
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
90 const json_t *file = find_property_value(properties, "animation-file");
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
91 const json_t *delay = find_property_value(properties, "animation-delay");
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
92
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
93 /* Animations are completely optional. */
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
94 if (!json_is_array(properties))
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
95 return;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
96
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
97 if (!json_is_integer(id))
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
98 die("invalid 'id' property in tile\n");
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
99
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
100 if (json_is_string(file)) {
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
101 printf("%d|%s|", (int)json_integer_value(id), json_string_value(file));
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
102
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
103 if (json_is_integer(delay))
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
104 printf("%d\n", (int)json_integer_value(delay));
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
105 else
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
106 printf("10\n");
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
107 }
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
108 }
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
109
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 static void
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 write_tiledef(const json_t *tile)
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 {
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 const json_t *id = json_object_get(tile, "id");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 const json_t *objectgroup = json_object_get(tile, "objectgroup");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 const json_t *objects = json_object_get(objectgroup, "objects");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
116 const json_t *first = json_array_get(objects, 0);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 const json_t *x, *y, *w, *h;
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
118
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
119 /* Collisions are optional. */
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
120 if (!json_is_object(objectgroup))
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
121 return;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
122
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 if (!json_is_integer(id))
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 die("invalid 'id' property in tile\n");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 if (!json_is_array(objects))
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 die("invalid 'objects' property in tile\n");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 x = json_object_get(first, "x");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 y = json_object_get(first, "y");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 w = json_object_get(first, "width");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 h = json_object_get(first, "height");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 if (!json_is_integer(x) || !json_is_integer(y) ||
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 !json_is_integer(w) || !json_is_integer(h))
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 die("invalid collide object in tile description\n");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 printf("%d|%d|%d|%d|%d\n",
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 (int)json_integer_value(id),
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 (int)json_integer_value(x),
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 (int)json_integer_value(y),
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 (int)json_integer_value(w),
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 (int)json_integer_value(h));
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 }
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
144
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 static void
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 write_tiledefs(const json_t *tiles)
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 {
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 size_t index;
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 json_t *object;
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 if (!json_is_array(tiles))
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 return;
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
153
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 puts("tiledefs");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 json_array_foreach(tiles, index, object) {
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 if (!json_is_object(object))
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 die("tile is not an object\n");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
159
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 write_tiledef(object);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 }
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 }
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
164 static void
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
165 write_animations(const json_t *tiles)
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
166 {
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
167 size_t index;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
168 json_t *object;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
169
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
170 if (!json_is_array(tiles))
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
171 return;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
172
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
173 puts("animations");
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
174
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
175 json_array_foreach(tiles, index, object) {
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
176 if (!json_is_object(object))
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
177 die("tile is not an object\n");
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
178
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
179 write_animation(object);
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
180 }
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
181 }
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
182
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 int
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 main(int argc, char *argv[])
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 {
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
186 (void)argc;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
187 (void)argv;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
188
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 json_t *document;
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 json_error_t error;
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
191
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 document = json_loadf(stdin, 0, &error);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
193
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 if (!document)
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
195 die("%d:%d: %s\n", error.line, error.column, error.text);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 if (!json_is_object(document))
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
197 die("root value isn't an object\n");
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
198
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
199 write_dimensions(document);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
200 write_image(document);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
201 write_tiledefs(json_object_get(document, "tiles"));
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
202 write_animations(json_object_get(document, "tiles"));
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
203
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
204 json_decref(document);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 }