Mercurial > molko
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 |
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 } |