annotate libmlk-rpg/mlk/rpg/map-loader.c @ 561:7732e789bcdd

rpg: conditionally enable fmemopen functions
author David Demelier <markand@malikania.fr>
date Wed, 08 Mar 2023 21:03:00 +0100
parents 6c911cbc1fd7
children cba66f7d8a53
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>
431
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 428
diff changeset
27 #include <mlk/core/trace.h>
433
862b15c3a3ae ui: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 432
diff changeset
28 #include <mlk/core/util.h>
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
30 #include "map-loader.h"
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
31 #include "map.h"
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
33 static int
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
34 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
35 {
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
36 enum mlk_map_layer_type layer_type;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 size_t amount, current;
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
38 unsigned int *tiles;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 if (strcmp(layer_name, "background") == 0)
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
41 layer_type = MLK_MAP_LAYER_TYPE_BG;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 else if (strcmp(layer_name, "foreground") == 0)
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
43 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
44 else if (strcmp(layer_name, "above") == 0)
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
45 layer_type = MLK_MAP_LAYER_TYPE_ABOVE;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 else
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 524
diff changeset
47 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
48
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
49 amount = map->columns * map->rows;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 current = 0;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
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 * 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
54 * that fill the layer tiles.
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 */
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
56 if (!(tiles = loader->alloc_tiles(loader, map, layer_type, amount)))
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
57 return -1;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
59 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
60 tiles[current] = tile;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
62 map->layers[layer_type].tiles = tiles;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
64 return 0;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
67 static int
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
68 parse_objects(struct mlk_map_loader *loader,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
69 struct mlk_map *map,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
70 const char *line,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
71 FILE *fp)
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
72 {
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
73 (void)line;
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
74
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
75 char fmt[64] = {0}, exec[256] = {0};
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
76 int x = 0, y = 0, isblock = 0;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
77 unsigned int w = 0, h = 0;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
78 struct mlk_map_block *array, *block, *blocks = NULL;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
79 size_t blocksz = 0;
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
80
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
81 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
82
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
83 while (fscanf(fp, fmt, &x, &y, &w, &h, &isblock, exec) >= 5) {
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
84 if (!loader->load_object) {
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
85 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
86 continue;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
87 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
88
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
89 loader->load_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
90
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 * 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
93 * 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
94 * 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
95 * 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
96 * directive has one.
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
97 */
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
98 if (isblock) {
555
6c911cbc1fd7 core: alloc_pool is no more
David Demelier <markand@malikania.fr>
parents: 554
diff changeset
99 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
100 return -1;
250
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
101
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
102 blocks = array;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
103 block = &blocks[blocksz++];
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
104 block->x = x;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
105 block->y = y;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
106 block->w = w;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
107 block->h = h;
250
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
108 }
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
109 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
110
250
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
111 /* Reference the blocks array from map_file. */
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
112 map->blocks = blocks;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
113 map->blocksz = blocksz;
250
8ef7fb7f14ad rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
114
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
115 return 0;
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
116 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
117
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
118 static int
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
119 parse_layer(struct mlk_map_loader *loader,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
120 struct mlk_map *map,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
121 const char *line,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
122 FILE *fp)
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
123 {
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
124 char fmt[32] = {0}, layer_name[32] = {0};
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
125
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
126 /* Check if weight/height has been specified. */
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
127 if (map->columns == 0 || map->rows == 0)
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 524
diff changeset
128 return mlk_errf("missing map dimensions before layer");
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
129
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
130 /* Determine layer type. */
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
131 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
132
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
133 if (sscanf(line, fmt, layer_name) <= 0)
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 524
diff changeset
134 return mlk_errf("missing layer type definition");
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
135 if (strcmp(layer_name, "actions") == 0)
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
136 return parse_objects(loader, map, line, fp);
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
137
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
138 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
139 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents: 211
diff changeset
140
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
141 static int
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
142 parse_tileset(struct mlk_map_loader *loader,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
143 struct mlk_map *map,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
144 const char *line,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
145 FILE *fp)
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 {
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
147 (void)fp;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
148
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
149 const char *p;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
151 if (!(p = strchr(line, '|')))
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 524
diff changeset
152 return mlk_errf("could not parse tileset");
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
153 if (!(map->tileset = loader->init_tileset(loader, map, p + 1)))
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
154 return -1;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
156 return 0;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
158
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
159 static int
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
160 parse_columns(struct mlk_map_loader *loader,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
161 struct mlk_map *map,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
162 const char *line,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
163 FILE *fp)
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 {
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
165 (void)loader;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
166 (void)fp;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
167
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
168 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
169 return mlk_errf("null map columns");
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
171 return 0;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
174 static int
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
175 parse_rows(struct mlk_map_loader *loader,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
176 struct mlk_map *map,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
177 const char *line,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
178 FILE *fp)
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 {
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
180 (void)loader;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
181 (void)fp;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
182
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
183 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
184 return mlk_errf("null map rows");
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
186 return 0;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
188
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
189 static int
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
190 parse_origin(struct mlk_map_loader *loader,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
191 struct mlk_map *map,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
192 const char *line,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
193 FILE *fp)
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
194 {
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
195 (void)loader;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
196 (void)fp;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
197
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
198 if (sscanf(line, "origin|%d|%d", &map->player_x, &map->player_y) != 2)
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 524
diff changeset
199 return mlk_errf("invalid origin");
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
200
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
201 return 0;
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
202 }
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
203
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
204 static int
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
205 parse_line(struct mlk_map_loader *loader,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
206 struct mlk_map *map,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
207 const char *line,
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
208 FILE *fp)
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 static const struct {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 const char *property;
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
212 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
213 } props[] = {
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
214 { "columns", parse_columns },
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
215 { "rows", parse_rows },
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 { "tileset", parse_tileset },
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 { "origin", parse_origin },
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
218 { "layer", parse_layer },
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 };
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
220
474
ca30ff96bbe0 core: util -> mlk_util
David Demelier <markand@malikania.fr>
parents: 473
diff changeset
221 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
222 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
223 return props[i].read(loader, map, line, fp);
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
224
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
225 return 0;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
227
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
228 static int
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
229 check(struct mlk_map *map)
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 /*
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 * 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
233 * 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
234 */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 if (!map->layers[0].tiles)
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 524
diff changeset
236 return mlk_errf("missing background layer");
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
237 if (!map->layers[1].tiles)
547
c7664b679a95 misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents: 524
diff changeset
238 return mlk_errf("missing foreground layer");
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
239
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 295
diff changeset
240 return 0;
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
242
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
243 static int
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
244 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
245 {
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
246 char line[128];
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
247
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
248 while (fgets(line, sizeof (line), fp)) {
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
249 /* Remove \n if any */
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
250 line[strcspn(line, "\r\n")] = '\0';
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
251
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
252 if (parse_line(loader, map, line, fp) < 0)
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
253 return -1;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
254 }
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
255
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
256 return check(map);
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
257 }
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
258
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
259 int
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
260 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
261 {
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
262 assert(loader);
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 assert(map);
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
264 assert(path);
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
265
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
266 FILE *fp;
197
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 memset(map, 0, sizeof (*map));
295
aec448037320 rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents: 266
diff changeset
269
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
270 if (!(fp = fopen(path, "r")))
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
271 return mlk_errf("%s", strerror(errno));
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
272
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
273 return parse(loader, map, fp);
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
275
561
7732e789bcdd rpg: conditionally enable fmemopen functions
David Demelier <markand@malikania.fr>
parents: 555
diff changeset
276 #if defined(MLK_HAVE_FMEMOPEN)
7732e789bcdd rpg: conditionally enable fmemopen functions
David Demelier <markand@malikania.fr>
parents: 555
diff changeset
277
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
278 int
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
279 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
280 {
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
281 assert(loader);
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
282 assert(map);
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
283 assert(data);
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
284
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
285 FILE *fp;
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
286
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
287 memset(map, 0, sizeof (*map));
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
288
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
289 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
290 return -1;
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents: 212
diff changeset
291
554
cdbc13ceff85 rpg: do the same for map
David Demelier <markand@malikania.fr>
parents: 547
diff changeset
292 return parse(loader, map, fp);
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 }
561
7732e789bcdd rpg: conditionally enable fmemopen functions
David Demelier <markand@malikania.fr>
parents: 555
diff changeset
294
7732e789bcdd rpg: conditionally enable fmemopen functions
David Demelier <markand@malikania.fr>
parents: 555
diff changeset
295 #endif