annotate src/libmlk-rpg/rpg/map-file.c @ 404:7321511052f6

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