Mercurial > molko
annotate src/libmlk-rpg/rpg/map-file.c @ 420:7d2ebc334c8c
misc: rename core to util
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 12 Oct 2022 15:26:12 +0200 |
parents | d74f53299252 |
children | 26d23999a54b |
rev | line source |
---|---|
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * map-file.c -- map file loader |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
378
460c78706989
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
348
diff
changeset
|
4 * Copyright (c) 2020-2022 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 <limits.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <stddef.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include <stdio.h> |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
24 #include <stdlib.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #include <string.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 |
420
7d2ebc334c8c
misc: rename core to util
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
27 #include <util/util.h> |
315
3bfaaf5342a9
cmake: add support for Visual Studio 2019
David Demelier <markand@malikania.fr>
parents:
314
diff
changeset
|
28 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 #include <core/alloc.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include <core/error.h> |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 #include <core/image.h> |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
32 #include <core/trace.h> |
295
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
33 #include <core/zfile.h> |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 #include "map-file.h" |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 #define MAX_F(v) MAX_F_(v) |
257
251de91394b7
rpg: fix invalid use of %c in sscanf
David Demelier <markand@malikania.fr>
parents:
250
diff
changeset
|
38 #define MAX_F_(v) "%" #v "[^\n|]" |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
40 struct context { |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 struct map_file *mf; /* Map loader. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 struct map *map; /* Map object to fill. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 FILE *fp; /* Map file pointer. */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 char basedir[PATH_MAX]; /* Parent map directory */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 }; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
47 static int |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
48 parse_layer_tiles(struct context *ctx, const char *layer_name) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 enum map_layer_type layer_type; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 size_t amount, current; |
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 if (strcmp(layer_name, "background") == 0) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 layer_type = MAP_LAYER_TYPE_BACKGROUND; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 else if (strcmp(layer_name, "foreground") == 0) |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 layer_type = MAP_LAYER_TYPE_FOREGROUND; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
57 else if (strcmp(layer_name, "above") == 0) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
58 layer_type = MAP_LAYER_TYPE_ABOVE; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 else |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
60 return errorf("invalid layer type: %s", layer_name); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
62 amount = ctx->map->columns * ctx->map->rows; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 current = 0; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 |
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 * 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
|
67 * that fill the layer tiles. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 */ |
227
befa2e855d3b
core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
69 if (!(ctx->mf->layers[layer_type].tiles = alloc_array0(amount, sizeof (unsigned short)))) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
70 return -1; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
72 for (int tile; fscanf(ctx->fp, "%d\n", &tile) && current < amount; ++current) |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
73 ctx->mf->layers[layer_type].tiles[current] = tile; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
75 ctx->map->layers[layer_type].tiles = ctx->mf->layers[layer_type].tiles; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
77 return 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
80 static int |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
81 parse_actions(struct context *ctx) |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
82 { |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
83 char exec[128 + 1]; |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
84 int x = 0, y = 0, block = 0; |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
85 unsigned int w = 0, h = 0; |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
86 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
87 while (fscanf(ctx->fp, "%d|%d|%u|%u|%d|%128[^\n]\n", &x, &y, &w, &h, &block, exec) >= 5) { |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
88 struct map_block *reg; |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
89 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
90 if (!ctx->mf->load_action) { |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
91 tracef("ignoring action %d,%d,%u,%u,%d,%s", x, y, w, h, block, exec); |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
92 continue; |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
93 } |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
94 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
95 ctx->mf->load_action(ctx->map, x, y, w, h, exec); |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
96 |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
97 /* |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
98 * 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
|
99 * 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
|
100 * 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
|
101 * 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
|
102 * directive has one. |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
103 */ |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
104 if (block) { |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
105 if (!(reg = alloc_pool_new(&ctx->mf->blocks))) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
106 return -1; |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
107 |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
108 reg->x = x; |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
109 reg->y = y; |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
110 reg->w = w; |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
111 reg->h = h; |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
112 } |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
113 } |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
114 |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
115 /* Reference the blocks array from map_file. */ |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
116 ctx->map->blocks = ctx->mf->blocks.data; |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
117 ctx->map->blocksz = ctx->mf->blocks.size; |
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
118 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
119 return 0; |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
120 } |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
121 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
122 static int |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
123 parse_layer(struct context *ctx, const char *line) |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
124 { |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
125 char layer_name[32 + 1] = {0}; |
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. */ |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
128 if (ctx->map->columns == 0 || ctx->map->rows == 0) |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
129 return errorf("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. */ |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
132 if (sscanf(line, "layer|%32s", layer_name) <= 0) |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
133 return errorf("missing layer type definition"); |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
134 |
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
135 if (strcmp(layer_name, "actions") == 0) |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
136 return parse_actions(ctx); |
212
ddfe0a211169
rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
211
diff
changeset
|
137 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
138 return parse_layer_tiles(ctx, layer_name); |
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 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
142 parse_tileset(struct context *ctx, const char *line) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 { |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
144 char path[PATH_MAX] = {0}, *p; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
145 struct map_file *mf = ctx->mf; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
146 struct tileset_file *tf = &mf->tileset_file; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
148 if (!(p = strchr(line, '|'))) |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
149 return errorf("could not parse tileset"); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
150 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
151 snprintf(path, sizeof (path), "%s/%s", ctx->basedir, p + 1); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
153 if (tileset_file_open(tf, &mf->tileset, path) < 0) |
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 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
156 ctx->map->tileset = &mf->tileset; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
158 return 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
159 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
160 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
161 static int |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
162 parse_title(struct context *ctx, const char *line) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
163 { |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
164 if (sscanf(line, "title|" MAX_F(MAP_FILE_TITLE_MAX), ctx->mf->title) != 1 || strlen(ctx->mf->title) == 0) |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
165 return errorf("null map title"); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
166 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
167 ctx->map->title = ctx->mf->title; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
169 return 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
170 } |
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 static int |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
173 parse_columns(struct context *ctx, const char *line) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 { |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
175 if (sscanf(line, "columns|%u", &ctx->map->columns) != 1 || ctx->map->columns == 0) |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
176 return errorf("null map columns"); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
178 return 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
181 static int |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
182 parse_rows(struct context *ctx, const char *line) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 { |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
184 if (sscanf(line, "rows|%u", &ctx->map->rows) != 1 || ctx->map->rows == 0) |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
185 return errorf("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 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
191 parse_origin(struct context *ctx, const char *line) |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
192 { |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
193 if (sscanf(line, "origin|%d|%d", &ctx->map->player_x, &ctx->map->player_y) != 2) |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
194 return errorf("invalid origin"); |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
195 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
196 return 0; |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
197 } |
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
198 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
199 static int |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
200 parse_line(struct context *ctx, const char *line) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 static const struct { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
203 const char *property; |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
204 int (*read)(struct context *, const char *); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 } props[] = { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
206 { "title", parse_title }, |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
207 { "columns", parse_columns }, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
208 { "rows", parse_rows }, |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 { "tileset", parse_tileset }, |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
210 { "origin", parse_origin }, |
210
70e6ed74940d
rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents:
197
diff
changeset
|
211 { "layer", parse_layer }, |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
212 }; |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
213 |
261
bfde372bf152
core: prefix utilities with util_
David Demelier <markand@malikania.fr>
parents:
258
diff
changeset
|
214 for (size_t i = 0; i < UTIL_SIZE(props); ++i) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
215 if (strncmp(line, props[i].property, strlen(props[i].property)) == 0) |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
216 return props[i].read(ctx, line); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
218 return 0; |
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 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
221 static int |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
222 parse(struct context *ctx, const char *path) |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
223 { |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
224 char line[1024]; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
225 char basedir[PATH_MAX]; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
226 |
420
7d2ebc334c8c
misc: rename core to util
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
227 util_strlcpy(basedir, path, sizeof (basedir)); |
7d2ebc334c8c
misc: rename core to util
David Demelier <markand@malikania.fr>
parents:
411
diff
changeset
|
228 util_strlcpy(ctx->basedir, util_dirname(basedir), sizeof (ctx->basedir)); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
229 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
230 while (fgets(line, sizeof (line), ctx->fp)) { |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
231 /* Remove \n if any */ |
309
0858e33a762d
misc: initial windows support
David Demelier <markand@malikania.fr>
parents:
298
diff
changeset
|
232 line[strcspn(line, "\r\n")] = '\0'; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
233 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
234 if (parse_line(ctx, line) < 0) |
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
235 return -1; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
236 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
237 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
238 return 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
239 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
240 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
241 static int |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
242 check(struct map *map) |
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 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
245 * Check that we have parsed every required components. |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
246 */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
247 if (!map->title) |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
248 return errorf("missing title"); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
249 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
250 /* |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
251 * 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
|
252 * 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
|
253 */ |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
254 if (!map->layers[0].tiles) |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
255 return errorf("missing background layer"); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
256 if (!map->layers[1].tiles) |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
257 return errorf("missing foreground layer"); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
258 if (!tileset_ok(map->tileset)) |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
259 return errorf("missing tileset"); |
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 int |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
265 map_file_open(struct map_file *file, struct map *map, const char *path) |
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 assert(file); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
268 assert(path); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
269 assert(map); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
270 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
271 struct context ctx = { |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
272 .mf = file, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
273 .map = map, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
274 }; |
295
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
275 struct zfile zf; |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
276 int ret = 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
277 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
278 memset(map, 0, sizeof (*map)); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
279 |
404
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
280 alloc_pool_init(&file->blocks, sizeof (*map->blocks), NULL); |
7321511052f6
core: rework alloc module
David Demelier <markand@malikania.fr>
parents:
378
diff
changeset
|
281 |
295
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
282 if (zfile_open(&zf, path) < 0) |
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
283 goto fail; |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
284 |
295
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
285 ctx.fp = zf.fp; |
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
286 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
287 if ((ret = parse(&ctx, path)) < 0 || (ret = check(map)) < 0) |
295
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
288 goto fail; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
289 |
295
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
290 zfile_close(&zf); |
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
291 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
292 return 0; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
293 |
295
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
294 fail: |
313
dbfe05b88627
cmake: bring back for good
David Demelier <markand@malikania.fr>
parents:
309
diff
changeset
|
295 errorf("%s: %s", path, strerror(errno)); |
295
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
296 map_finish(map); |
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
297 map_file_finish(file); |
aec448037320
rpg: add support for compressed tilesets/maps
David Demelier <markand@malikania.fr>
parents:
266
diff
changeset
|
298 zfile_close(&zf); |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
299 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
300 return -1; |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
301 } |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
302 |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
303 void |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
304 map_file_finish(struct map_file *file) |
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 assert(file); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
307 |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
308 free(file->layers[0].tiles); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
309 free(file->layers[1].tiles); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
310 free(file->layers[2].tiles); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
311 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
312 tileset_file_finish(&file->tileset_file); |
250
8ef7fb7f14ad
rpg: add support for collisions with actions
David Demelier <markand@malikania.fr>
parents:
243
diff
changeset
|
313 alloc_pool_finish(&file->blocks); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
212
diff
changeset
|
314 |
197
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
315 memset(file, 0, sizeof (*file)); |
852d0b7817ce
rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
316 } |