Mercurial > molko
annotate libmlk-rpg/mlk/rpg/map-loader.c @ 629:fee7bd30725c
rpg: cleanup tileset-loader-file
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 26 Aug 2023 16:09:35 +0200 |
parents | f9e85d0aca74 |
children | bb67f935a93f |
rev | line source |
---|---|
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
2 * map-loader.c -- abstract map loader |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
445
773a082f0b91
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
442
diff
changeset
|
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <errno.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <stdio.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <string.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 |
432
38cf60f5a1c4
util: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
431
diff
changeset
|
24 #include <mlk/util/util.h> |
315
3bfaaf5342a9
cmake: add support for Visual Studio 2019
David Demelier <markand@malikania.fr>
parents:
314
diff
changeset
|
25 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
26 #include <mlk/core/err.h> |
592
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
27 #include <mlk/core/sprite.h> |
431
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
428
diff
changeset
|
28 #include <mlk/core/trace.h> |
433
862b15c3a3ae
ui: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
432
diff
changeset
|
29 #include <mlk/core/util.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
31 #include "map-loader.h" |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
32 #include "map.h" |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
34 static int |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
35 parse_layer_tiles(struct mlk_map_loader *loader, struct mlk_map *map, const char *layer_name, FILE *fp) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
37 enum mlk_map_layer_type layer_type; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 size_t amount, current; |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
39 unsigned int *tiles; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 if (strcmp(layer_name, "background") == 0) |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
42 layer_type = MLK_MAP_LAYER_TYPE_BG; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 else if (strcmp(layer_name, "foreground") == 0) |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
44 layer_type = MLK_MAP_LAYER_TYPE_FG; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
45 else if (strcmp(layer_name, "above") == 0) |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
46 layer_type = MLK_MAP_LAYER_TYPE_ABOVE; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 else |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
524
diff
changeset
|
48 return mlk_errf("invalid layer type: %s", layer_name); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
50 amount = map->columns * map->rows; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 current = 0; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 * The next line after a layer declaration is a list of plain integer |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 * that fill the layer tiles. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 */ |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
592
diff
changeset
|
57 if (!(tiles = loader->new_tiles(loader, map, layer_type, amount))) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
58 return -1; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
60 for (unsigned int tile; fscanf(fp, "%u\n", &tile) && current < amount; ++current) |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
61 tiles[current] = tile; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
63 map->layers[layer_type].tiles = tiles; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
65 return 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
68 static int |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
69 parse_objects(struct mlk_map_loader *loader, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
70 struct mlk_map *map, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
71 const char *line, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
72 FILE *fp) |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
73 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
74 (void)line; |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
75 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
76 char fmt[64] = {0}, exec[256] = {0}; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
77 int x = 0, y = 0, isblock = 0; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
78 unsigned int w = 0, h = 0; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
79 struct mlk_map_block *array, *block, *blocks = NULL; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
80 size_t blocksz = 0; |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
81 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
82 snprintf(fmt, sizeof (fmt), "%%d|%%d|%%u|%%u|%%d|%%%zu[^\n]\n", sizeof (exec) - 1); |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
83 |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
84 while (fscanf(fp, fmt, &x, &y, &w, &h, &isblock, exec) >= 5) { |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
592
diff
changeset
|
85 if (!loader->new_object) { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
86 mlk_tracef("ignoring object %d,%d,%u,%u,%d,%s", x, y, w, h, isblock, exec); |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
87 continue; |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
88 } |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
89 |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
592
diff
changeset
|
90 loader->new_object(loader, map, x, y, w, h, exec); |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
91 |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
92 /* |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
93 * Actions do not have concept of collisions because they are |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
94 * not only used on maps. The map structure has its very own |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
95 * object to manage collisions but the .map file use the same |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
96 * directive for simplicity. So create a block region if the |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
97 * directive has one. |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
98 */ |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
99 if (isblock) { |
555
6c911cbc1fd7
core: alloc_pool is no more
David Demelier <markand@malikania.fr>
parents:
554
diff
changeset
|
100 if (!(array = loader->expand_blocks(loader, map, blocks, blocksz + 1))) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
101 return -1; |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
102 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
103 blocks = array; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
104 block = &blocks[blocksz++]; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
105 block->x = x; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
106 block->y = y; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
107 block->w = w; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
108 block->h = h; |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
109 } |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
110 } |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
111 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
112 /* Reference the blocks array from map_file. */ |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
113 map->blocks = blocks; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
114 map->blocksz = blocksz; |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
115 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
116 return 0; |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
117 } |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
118 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
119 static int |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
120 parse_layer(struct mlk_map_loader *loader, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
121 struct mlk_map *map, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
122 const char *line, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
123 FILE *fp) |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
124 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
125 char fmt[32] = {0}, layer_name[32] = {0}; |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
126 |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
127 /* Check if weight/height has been specified. */ |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
128 if (map->columns == 0 || map->rows == 0) |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
524
diff
changeset
|
129 return mlk_errf("missing map dimensions before layer"); |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
130 |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
131 /* Determine layer type. */ |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
132 snprintf(fmt, sizeof (fmt), "layer|%%%zus", sizeof (layer_name) - 1); |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
133 |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
134 if (sscanf(line, fmt, layer_name) <= 0) |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
524
diff
changeset
|
135 return mlk_errf("missing layer type definition"); |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
136 if (strcmp(layer_name, "actions") == 0) |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
137 return parse_objects(loader, map, line, fp); |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
138 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
139 return parse_layer_tiles(loader, map, layer_name, fp); |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
140 } |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
141 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
142 static int |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
143 parse_tileset(struct mlk_map_loader *loader, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
144 struct mlk_map *map, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
145 const char *line, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
146 FILE *fp) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
148 (void)fp; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
149 |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
150 const char *p; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
152 if (!(p = strchr(line, '|'))) |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
524
diff
changeset
|
153 return mlk_errf("could not parse tileset"); |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
592
diff
changeset
|
154 if (!(map->tileset = loader->new_tileset(loader, map, p + 1))) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
155 return -1; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
157 return 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
159 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
160 static int |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
161 parse_columns(struct mlk_map_loader *loader, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
162 struct mlk_map *map, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
163 const char *line, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
164 FILE *fp) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
165 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
166 (void)loader; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
167 (void)fp; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
169 if (sscanf(line, "columns|%u", &map->columns) != 1 || map->columns == 0) |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
524
diff
changeset
|
170 return mlk_errf("null map columns"); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
172 return 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
175 static int |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
176 parse_rows(struct mlk_map_loader *loader, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
177 struct mlk_map *map, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
178 const char *line, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
179 FILE *fp) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
181 (void)loader; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
182 (void)fp; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
183 |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
184 if (sscanf(line, "rows|%u", &map->rows) != 1 || map->rows == 0) |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
524
diff
changeset
|
185 return mlk_errf("null map rows"); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
187 return 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
188 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
190 static int |
592
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
191 parse_player_origin(struct mlk_map_loader *loader, |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
192 struct mlk_map *map, |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
193 const char *line, |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
194 FILE *fp) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
195 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
196 (void)loader; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
197 (void)fp; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
198 |
592
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
199 if (sscanf(line, "player-origin|%d|%d", &map->player_x, &map->player_y) != 2) |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
200 return mlk_errf("invalid player origin"); |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
201 |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
202 return 0; |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
203 } |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
204 |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
205 static int |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
206 parse_player_sprite(struct mlk_map_loader *loader, |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
207 struct mlk_map *map, |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
208 const char *line, |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
209 FILE *fp) |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
210 { |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
211 (void)fp; |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
212 |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
213 char format[32], ident[FILENAME_MAX + 1] = {0}; |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
214 unsigned int w = 0, h = 0; |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
215 struct mlk_sprite *sprite; |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
216 struct mlk_texture *texture; |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
217 |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
218 snprintf(format, sizeof (format), "player-sprite|%%u|%%u|%%%zu[^\n]", sizeof (ident) - 1); |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
219 |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
220 if (sscanf(line, format, &w, &h, ident) != 3) |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
221 return mlk_errf("invalid player sprite"); |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
592
diff
changeset
|
222 if (!(texture = loader->new_texture(loader, map, ident))) |
592
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
223 return -1; |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
592
diff
changeset
|
224 if (!(sprite = loader->new_sprite(loader, map))) |
592
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
225 return -1; |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
226 |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
227 sprite->cellw = w; |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
228 sprite->cellh = h; |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
229 sprite->texture = texture; |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
230 mlk_sprite_init(sprite); |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
231 |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
232 /* Add this sprite into the final map. */ |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
233 map->player_sprite = sprite; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
234 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
235 return 0; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
236 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
237 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
238 static int |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
239 parse_line(struct mlk_map_loader *loader, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
240 struct mlk_map *map, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
241 const char *line, |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
242 FILE *fp) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
243 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
244 static const struct { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
245 const char *property; |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
246 int (*read)(struct mlk_map_loader *, struct mlk_map *, const char *, FILE *); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
247 } props[] = { |
592
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
248 { "columns", parse_columns }, |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
249 { "rows", parse_rows }, |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
250 { "tileset", parse_tileset }, |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
251 { "player-origin", parse_player_origin }, |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
252 { "player-sprite", parse_player_sprite }, |
1560ef13146c
rpg: map support player sprite
David Demelier <markand@malikania.fr>
parents:
574
diff
changeset
|
253 { "layer", parse_layer }, |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
254 }; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
255 |
571
cba66f7d8a53
misc: various windows fixes
David Demelier <markand@malikania.fr>
parents:
561
diff
changeset
|
256 for (size_t i = 0; i < MLK_UTIL_SIZE(props); ++i) { |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
257 if (strncmp(line, props[i].property, strlen(props[i].property)) == 0) |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
258 return props[i].read(loader, map, line, fp); |
571
cba66f7d8a53
misc: various windows fixes
David Demelier <markand@malikania.fr>
parents:
561
diff
changeset
|
259 } |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
260 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
261 return 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
262 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
263 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
264 static int |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
265 check(struct mlk_map *map) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
266 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
267 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
268 * We don't need to check width/height because parsing layers and |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
269 * tilesets already check for their presence, so only check layers. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
270 */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
271 if (!map->layers[0].tiles) |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
524
diff
changeset
|
272 return mlk_errf("missing background layer"); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
273 if (!map->layers[1].tiles) |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
524
diff
changeset
|
274 return mlk_errf("missing foreground layer"); |
574
8cf895e51fb6
win: various improvements
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
275 if (!map->tileset) |
8cf895e51fb6
win: various improvements
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
276 return mlk_errf("missing tileset"); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
277 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
278 return 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
279 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
280 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
281 static int |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
282 parse(struct mlk_map_loader *loader, struct mlk_map *map, FILE *fp) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
283 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
284 char line[128]; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
285 |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
286 while (fgets(line, sizeof (line), fp)) { |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
287 /* Remove \n if any */ |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
288 line[strcspn(line, "\r\n")] = '\0'; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
289 |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
290 if (parse_line(loader, map, line, fp) < 0) |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
291 return -1; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
292 } |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
293 |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
294 return check(map); |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
295 } |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
296 |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
297 int |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
298 mlk_map_loader_open(struct mlk_map_loader *loader, struct mlk_map *map, const char *path) |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
299 { |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
300 assert(loader); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
301 assert(map); |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
302 assert(path); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
303 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
304 FILE *fp; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
305 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
306 memset(map, 0, sizeof (*map)); |
295
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
307 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
308 if (!(fp = fopen(path, "r"))) |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
309 return mlk_errf("%s", strerror(errno)); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
310 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
311 return parse(loader, map, fp); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
312 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
313 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
314 int |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
315 mlk_map_loader_openmem(struct mlk_map_loader *loader, struct mlk_map *map, const void *data, size_t datasz) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
316 { |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
317 assert(loader); |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
318 assert(map); |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
319 assert(data); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
320 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
321 FILE *fp; |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
322 |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
323 memset(map, 0, sizeof (*map)); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
324 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
325 if (!(fp = mlk_util_fmemopen((void *)data, datasz, "r"))) |
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
326 return -1; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
327 |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
328 return parse(loader, map, fp); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
329 } |