annotate librpg/rpg/map-file.c @ 210:70e6ed74940d

rpg: attempt of collide detection in map
author David Demelier <markand@malikania.fr>
date Sat, 14 Nov 2020 16:59:11 +0100
parents 852d0b7817ce
children adcbb7ccfdee
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 *
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
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 #define _XOPEN_SOURCE 700
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <assert.h>
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <errno.h>
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <libgen.h>
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <limits.h>
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <stddef.h>
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <stdio.h>
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
26 #include <stdlib.h>
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include <string.h>
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
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>
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 #include "map-file.h"
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 /* Create %<v>c string literal for scanf */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 #define MAX_F(v) MAX_F_(v)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 #define MAX_F_(v) "%" #v "c"
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 struct parser {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 struct map_file *mf; /* Map loader. */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 struct map *map; /* Map object to fill. */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 FILE *fp; /* Map file pointer. */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 char basedir[PATH_MAX]; /* Parent map directory */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 };
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
46 static int
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
47 tile_cmp(const void *d1, const void *d2)
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
48 {
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
49 const struct map_tile *mt1 = d1;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
50 const struct map_tile *mt2 = d2;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
51
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
52 if (mt1->id < mt2->id)
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
53 return -1;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
54 if (mt1->id > mt2->id)
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
55 return 1;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
56
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
57 return 0;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
58 }
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
59
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 static bool
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 parse_layer(struct parser *ps, const char *line)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 char layer_name[32 + 1] = {0};
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 enum map_layer_type layer_type;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 size_t amount, current;
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 /* Check if weight/height has been specified. */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 if (ps->map->w == 0 || ps->map->h == 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 return errorf("missing map dimensions before layer");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 /* Determine layer type. */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 if (sscanf(line, "layer|%32s", layer_name) <= 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 return errorf("missing layer type definition");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 if (strcmp(layer_name, "background") == 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 layer_type = MAP_LAYER_TYPE_BACKGROUND;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 else if (strcmp(layer_name, "foreground") == 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 layer_type = MAP_LAYER_TYPE_FOREGROUND;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
79 else
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 return errorf("invalid layer type: %s", layer_name);
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
81
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 amount = ps->map->w * ps->map->h;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 current = 0;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 /*
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 * 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
87 * that fill the layer tiles.
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 if (!(ps->mf->layers[layer_type].tiles = alloc_zero(amount, sizeof (unsigned short))))
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 return false;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
91
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
92 for (int tile; fscanf(ps->fp, "%d\n", &tile) && current < amount; ++current)
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 ps->mf->layers[layer_type].tiles[current] = tile;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 ps->map->layers[layer_type].tiles = ps->mf->layers[layer_type].tiles;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
96
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 return true;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
99
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 static bool
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 parse_tileset(struct parser *ps, const char *line)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 char filename[FILENAME_MAX + 1] = {0};
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 char filepath[PATH_MAX];
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 int ret;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 if (ps->map->tile_w == 0 || ps->map->tile_h == 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 return errorf("missing map dimensions before tileset");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
109
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 if ((ret = sscanf(line, "tileset|" MAX_F(FILENAME_MAX), filename)) == 1) {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 snprintf(filepath, sizeof (filepath), "%s/%s", ps->basedir, filename);
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
112
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 if (!image_open(&ps->mf->tileset, filepath))
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 return false;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
116
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 /* Initialize sprite. */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 sprite_init(&ps->mf->sprite, &ps->mf->tileset, ps->map->tile_w, ps->map->tile_h);
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
119 ps->map->tileset = &ps->mf->sprite;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
120
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
121 return true;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
123
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 static bool
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 parse_title(struct parser *ps, const char *line)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 if (sscanf(line, "title|" MAX_F(MAP_FILE_TITLE_MAX), ps->mf->title) != 1 || strlen(ps->mf->title) == 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 return errorf("null map title");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 ps->map->title = ps->mf->title;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132 return true;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 static bool
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 parse_width(struct parser *ps, const char *line)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 if (sscanf(line, "width|%u", &ps->map->w) != 1 || ps->map->w == 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 return errorf("null map width");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 return true;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 static bool
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 parse_height(struct parser *ps, const char *line)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 if (sscanf(line, "height|%u", &ps->map->h) != 1 || ps->map->h == 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 return errorf("null map height");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 return true;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 static bool
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 parse_tilewidth(struct parser *ps, const char *line)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 if (sscanf(line, "tilewidth|%hu", &ps->map->tile_w) != 1 || ps->map->tile_w == 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 return errorf("null map tile width");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 if (ps->map->w == 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 return errorf("missing map width before tilewidth");
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 ps->map->real_w = ps->map->w * ps->map->tile_w;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 return true;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
165
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 static bool
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 parse_tileheight(struct parser *ps, const char *line)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 if (sscanf(line, "tileheight|%hu", &ps->map->tile_h) != 1 || ps->map->tile_h == 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 return errorf("null map tile height");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
171 if (ps->map->h == 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 return errorf("missing map height before tileheight");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
174 ps->map->real_h = ps->map->h * ps->map->tile_h;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
175
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 return true;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
178
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
179 static bool
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 parse_origin(struct parser *ps, const char *line)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 if (sscanf(line, "origin|%d|%d", &ps->map->origin_x, &ps->map->origin_y) != 2)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 return errorf("invalid origin");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
184
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 /*
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
186 * We adjust the player position here because it should not be done in
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
187 * the map_init function. This is because the player should not move
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 * magically each time we re-use the map (saving position).
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 ps->map->player_x = ps->map->origin_x;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
191 ps->map->player_y = ps->map->origin_y;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
192
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
193 return true;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
195
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
196 static bool
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
197 parse_tiles(struct parser *ps, const char *line)
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 (void)line;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
200
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
201 short x, y;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
202 unsigned short id, w, h;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
203 struct map_tile *tiles = NULL;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
204 size_t tilesz = 0;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
205
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
206 while (fscanf(ps->fp, "%hu|%hd|%hd|%hu|%hu\n", &id, &x, &y, &w, &h) == 5) {
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
207 tiles = allocator.realloc(tiles, ++tilesz * sizeof (*tiles));
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
208 tiles[tilesz - 1].id = id;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
209 tiles[tilesz - 1].x = x;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
210 tiles[tilesz - 1].y = y;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
211 tiles[tilesz - 1].w = w;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
212 tiles[tilesz - 1].h = h;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
213 }
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
214
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
215 qsort(tiles, tilesz, sizeof (struct map_tile), tile_cmp);
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
216 ps->map->tiles = ps->mf->tiles = tiles;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
217 ps->map->tilesz = tilesz;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
218
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
219 return true;
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
220 }
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
221
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
222 static bool
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 parse_line(struct parser *ps, const char *line)
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 static const struct {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
226 const char *property;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
227 bool (*read)(struct parser *, const char *);
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
228 } props[] = {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
229 { "title", parse_title },
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 { "width", parse_width },
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 { "height", parse_height },
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
232 { "tilewidth", parse_tilewidth },
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
233 { "tileheight", parse_tileheight },
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
234 { "tileset", parse_tileset },
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
235 { "origin", parse_origin },
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
236 { "layer", parse_layer },
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
237 { "tiles", parse_tiles }
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
238 };
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 for (size_t i = 0; i < NELEM(props); ++i)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
241 if (strncmp(line, props[i].property, strlen(props[i].property)) == 0)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
242 return props[i].read(ps, line);
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 return true;
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
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
247 static bool
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 parse(struct map_file *loader, const char *path, struct map *map, FILE *fp)
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 char line[1024];
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 struct parser ps = {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 .mf = loader,
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 .map = map,
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 .fp = fp
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
255 };
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
256
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 /*
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 * Even though dirname(3) usually not modify the path as argument it may
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
259 * do according to POSIX specification, as such we still need a
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
260 * temporary buffer.
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
261 */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
262 snprintf(ps.basedir, sizeof (ps.basedir), "%s", path);
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
263 snprintf(ps.basedir, sizeof (ps.basedir), "%s", dirname(ps.basedir));
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
264
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
265 while (fgets(line, sizeof (line), fp)) {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
266 /* Remove \n if any */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
267 line[strcspn(line, "\n")] = '\0';
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
268
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
269 if (!parse_line(&ps, line))
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
270 return false;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
271 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
272
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
273 return true;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
274 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
275
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
276 static bool
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
277 check(struct map *map)
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 /*
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
280 * Check that we have parsed every required components.
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
281 */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
282 if (!map->title)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
283 return errorf("missing title");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
284
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
285 /*
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
286 * 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
287 * 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
288 */
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
289 if (!map->layers[0].tiles)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
290 return errorf("missing background layer");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
291 if (!map->layers[1].tiles)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
292 return errorf("missing foreground layer");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
293 if (!sprite_ok(map->tileset))
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
294 return errorf("missing tileset");
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
295
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
296 return true;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
297 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
298
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
299 bool
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
300 map_file_open(struct map_file *file, const char *path, struct map *map)
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 assert(file);
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
303 assert(path);
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
304 assert(map);
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 FILE *fp;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
307 bool ret = true;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
308
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
309 memset(file, 0, sizeof (*file));
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
310 memset(map, 0, sizeof (*map));
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
311
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
312 if (!(fp = fopen(path, "r")))
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
313 return errorf("%s", strerror(errno));
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
314
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
315 if (!(ret = parse(file, path, map, fp)) || !(ret = check(map))) {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
316 map_finish(map);
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
317 map_file_finish(file);
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
318 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
319
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
320 fclose(fp);
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
321
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
322 return ret;
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
323 }
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
324
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
325 void
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
326 map_file_finish(struct map_file *file)
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
327 {
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
328 assert(file);
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
329
210
70e6ed74940d rpg: attempt of collide detection in map
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
330 free(file->tiles);
197
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
331 texture_finish(&file->tileset);
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
332 memset(file, 0, sizeof (*file));
852d0b7817ce rpg: map, extreme cleanup, closes #2508 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
333 }