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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }