annotate mlk-map/mlk-map.c @ 592:1560ef13146c

rpg: map support player sprite
author David Demelier <markand@malikania.fr>
date Mon, 20 Mar 2023 21:59:02 +0100
parents f271681ce015
children e070fdcc592b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
16
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
2 * mlk-map.c -- convert tiled tiled JSON files into custom files
16
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
445
773a082f0b91 misc: update copyright years
David Demelier <markand@malikania.fr>
parents: 435
diff changeset
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr>
16
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
20 #include <limits.h>
16
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <stdbool.h>
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <stdio.h>
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <string.h>
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
25 #include <jansson.h>
16
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
432
38cf60f5a1c4 util: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 420
diff changeset
27 #include <mlk/util/util.h>
315
3bfaaf5342a9 cmake: add support for Visual Studio 2019
David Demelier <markand@malikania.fr>
parents: 314
diff changeset
28
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
29 static bool
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
30 is_layer(const char *name)
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
31 {
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
32 return strcmp(name, "background") == 0 ||
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
33 strcmp(name, "foreground") == 0 ||
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
34 strcmp(name, "above") == 0 ||
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
35 strcmp(name, "actions") == 0;
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
36 }
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
37
93
d4a72fa16225 misc: miscellaneous issues
David Demelier <markand@malikania.fr>
parents: 50
diff changeset
38 static const json_t *
50
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
39 find_property(const json_t *props, const char *which)
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
40 {
578
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
41 const json_t *obj, *key, *value;
50
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
42 size_t index;
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
43
250
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
44 json_array_foreach(props, index, obj) {
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
45 if (!json_is_object(obj))
50
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
46 continue;
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
47
578
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
48 key = json_object_get(obj, "name");
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
49 value = json_object_get(obj, "value");
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
50
250
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
51 if (json_is_string(key) && value && strcmp(json_string_value(key), which) == 0)
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
52 return value;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
53 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
54
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
55 return NULL;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
56 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
57
50
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
58 static void
592
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
59 write_player_origin(const json_t *props)
50
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
60 {
592
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
61 const json_t *x, *y;
578
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
62
592
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
63 x = find_property(props, "player-origin-x");
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
64 y = find_property(props, "player-origin-y");
50
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
65
592
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
66 if (!x || !json_is_integer(x) ||
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
67 !y || !json_is_integer(y))
50
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
68 return;
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
69
592
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
70 printf("player-origin|%d|%d\n",
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
71 (int)json_integer_value(x),
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
72 (int)json_integer_value(y));
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
73 }
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
74
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
75 static void
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
76 write_player_sprite(const json_t *props)
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
77 {
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
78 const json_t *sprite, *w, *h;
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
79
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
80 sprite = find_property(props, "player-sprite");
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
81 w = find_property(props, "player-sprite-w");
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
82 h = find_property(props, "player-sprite-h");
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
83
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
84 if (!sprite || !json_is_string(sprite) ||
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
85 !w || !json_is_integer(w) ||
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
86 !h || !json_is_integer(h))
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
87 return;
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
88
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
89 printf("player-sprite|%d|%d|%s\n",
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
90 (int)json_integer_value(w),
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
91 (int)json_integer_value(h),
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
92 json_string_value(sprite)
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
93 );
50
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
94 }
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
95
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
96 static void
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
97 write_properties(const json_t *props)
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
98 {
592
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
99 write_player_origin(props);
1560ef13146c rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents: 578
diff changeset
100 write_player_sprite(props);
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
101 }
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
102
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
103 static void
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
104 write_dimensions(const json_t *document)
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
105 {
578
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
106 json_t *width, *height;
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
107
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
108 width = json_object_get(document, "width");
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
109 height = json_object_get(document, "height");
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
110
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents: 25
diff changeset
111 if (!width || !json_is_integer(width))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
112 mlk_util_die("missing 'width' property\n");
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
113 if (!height || !json_is_integer(height))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
114 mlk_util_die("missing 'height' property\n");
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
115
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
116 printf("columns|%d\n", (int)json_integer_value(width));
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
117 printf("rows|%d\n", (int)json_integer_value(height));
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
118 }
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
119
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
120 static void
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
121 write_object(const json_t *object)
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
122 {
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
123 assert(json_is_object(object));
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
124
578
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
125 const json_t *x, *y, *width, *height, *props, *exec, *block;
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
126
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
127 x = json_object_get(object, "x");
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
128 y = json_object_get(object, "y");
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
129 width = json_object_get(object, "width");
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
130 height = json_object_get(object, "height");
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
131 props = json_object_get(object, "properties");
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
132
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
133 if (!x || !json_is_number(x))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
134 mlk_util_die("invalid 'x' property in object\n");
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
135 if (!y || !json_is_number(y))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
136 mlk_util_die("invalid 'y' property in object\n");
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
137 if (!width || !json_is_number(width))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
138 mlk_util_die("invalid 'width' property in object\n");
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
139 if (!height || !json_is_number(height))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
140 mlk_util_die("invalid 'height' property in object\n");
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
141
250
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
142 /* This is optional and set to 0 if not present. */
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
143 block = find_property(props, "block");
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
144
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
145 /* In tiled, those properties are float but we only use ints in MA */
250
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
146 printf("%d|%d|%d|%d|%d",
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
147 (int)json_integer_value(x),
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
148 (int)json_integer_value(y),
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
149 (int)json_integer_value(width),
250
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
150 (int)json_integer_value(height),
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
151 (int)json_is_true(block)
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
152 );
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
153
250
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
154 if ((exec = find_property(props, "exec")) && json_is_string(exec))
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
155 printf("|%s", json_string_value(exec));
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
156
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
157 printf("\n");
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
158 }
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
159
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
160 static void
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
161 write_layer(const json_t *layer)
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
162 {
578
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
163 json_t *objects, *data, *name, *tile, *object;
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
164 size_t index;
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
165
578
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
166 objects = json_object_get(layer, "objects");
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
167 data = json_object_get(layer, "data");
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
168 name = json_object_get(layer, "name");
f271681ce015 mlk-map: follow conventions
David Demelier <markand@malikania.fr>
parents: 557
diff changeset
169
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
170 if (!name || !json_is_string(name))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
171 mlk_util_die("invalid 'name' property in layer");
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
172 if (!is_layer(json_string_value(name)))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
173 mlk_util_die("invalid 'name' layer: %s\n", json_string_value(name));
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
174
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
175 printf("layer|%s\n", json_string_value(name));
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
176
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
177 /* Only foreground/background have 'data' property */
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
178 if (json_is_array(data)) {
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
179 json_array_foreach(data, index, tile) {
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
180 if (!json_is_integer(tile))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
181 mlk_util_die("invalid 'data' property in layer\n");
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
182
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
183 printf("%d\n", (int)json_integer_value(tile));
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
184 }
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
185 }
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
186
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
187 /* Only objects has 'objects' property */
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
188 if (json_is_array(objects)) {
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
189 json_array_foreach(objects, index, object) {
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
190 if (!json_is_object(object))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
191 mlk_util_die("invalid 'objects' property in layer\n");
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
192
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
193 write_object(object);
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
194 }
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
195 }
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
196 }
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
197
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
198 static void
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
199 write_layers(const json_t *layers)
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
200 {
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
201 size_t index;
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
202 json_t *layer;
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
203
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
204 if (!layers)
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
205 return;
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
206
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
207 json_array_foreach(layers, index, layer) {
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
208 if (!json_is_object(layer))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
209 mlk_util_die("layer is not an object\n");
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
210
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
211 write_layer(layer);
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
212 }
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
213 }
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
214
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
215 static void
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
216 write_tileset(const json_t *tilesets)
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 116
diff changeset
217 {
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 524
diff changeset
218 char path[MLK_PATH_MAX], *ext;
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
219 const json_t *tileset, *source;
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 116
diff changeset
220
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
221 if (json_array_size(tilesets) != 1)
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
222 mlk_util_die("map must contain exactly one tileset");
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 116
diff changeset
223
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
224 tileset = json_array_get(tilesets, 0);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
225 source = json_object_get(tileset, "source");
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 116
diff changeset
226
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
227 if (!json_is_string(source))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
228 mlk_util_die("invalid 'source' property in tileset\n");
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 116
diff changeset
229
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
230 /* We need to replace the .json extension to .tileset. */
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
231 snprintf(path, sizeof (path), "%s", json_string_value(source));
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
232
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 524
diff changeset
233 if (!(ext = strstr(path, ".json")))
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
234 mlk_util_die("could not determine tileset extension");
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
235
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
236 *ext = '\0';
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
237
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 524
diff changeset
238 printf("tileset|%s.tileset\n", path);
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
239 }
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
240
16
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 int
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 main(void)
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
243 {
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
244 json_t *document;
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
245 json_error_t error;
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
246
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
247 document = json_loadf(stdin, 0, &error);
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
248
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
249 if (!document)
557
944798a59b8a util: introduce mlk_util_die
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
250 mlk_util_die("%d:%d: %s\n", error.line, error.column, error.text);
16
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
251
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
252 write_properties(json_object_get(document, "properties"));
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
253 write_dimensions(document);
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
254 write_layers(json_object_get(document, "layers"));
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
255 write_tileset(json_object_get(document, "tilesets"));
16
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
256
25
0d5ecefcccd3 molko-map: reimplement using JSON as it is supported by tiled, closes #2448 @4h
David Demelier <markand@malikania.fr>
parents: 16
diff changeset
257 json_decref(document);
16
621c815c9509 tools: implement basic molko-map stub, continue #2448
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 }