annotate src/map.c @ 47:f053a9f38c0e

core: implement basic scrolling, closes #2459
author David Demelier <markand@malikania.fr>
date Thu, 16 Jan 2020 13:32:20 +0100
parents b815621df3e3
children 402aa7dcffe1
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * map.c -- game map
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <stdio.h>
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <stdlib.h>
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <string.h>
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
23
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
24 #include "error.h"
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
25 #include "error_p.h"
47
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
26 #include "image.h"
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
27 #include "map.h"
47
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
28 #include "painter.h"
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include "sprite.h"
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
30 #include "sys.h"
47
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
31 #include "texture.h"
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
32 #include "window.h"
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 #include <SDL.h>
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
35
38
83ae0e13c416 core: improve parsing of strings in map.c
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
36 /* Create %<v>c string literal for scanf */
83ae0e13c416 core: improve parsing of strings in map.c
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
37 #define MAX_F(v) MAX_F_(v)
83ae0e13c416 core: improve parsing of strings in map.c
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
38 #define MAX_F_(v) "%" #v "c"
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
39
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 static void
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 parse_layer(struct map *map, const char *line, FILE *fp)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 {
38
83ae0e13c416 core: improve parsing of strings in map.c
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
43 char layer_name[32 + 1] = { 0 };
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 struct map_layer *layer;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 size_t amount, current;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 /* Determine layer. */
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 if (sscanf(line, "layer|%32s", layer_name) <= 0)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 return;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 if (strcmp(layer_name, "background") == 0)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 layer = &map->layers[0];
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 else if (strcmp(layer_name, "foreground") == 0)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 layer = &map->layers[1];
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 else
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 return;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 /* Check if weight/height has been specified. */
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 if (map->width == 0 || map->height == 0)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 return;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 amount = map->width * map->height;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 current = 0;
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
63
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
64 if (!(layer->tiles = calloc(amount, sizeof (unsigned short))))
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 return;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 for (int tile; fscanf(fp, "%d", &tile) && current < amount; ++current)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 layer->tiles[current] = tile;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
70
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 static void
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 parse_tileset(struct map *map, const char *line)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 char filename[128 + 1] = { 0 };
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 sscanf(line, "tileset|%128s", filename);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
77
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
78 if (map->tilewidth == 0 || map->tileheight == 0)
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
79 return;
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
80 if (!(map->tileset = image_openf(sys_datapath("tilesets/%s", filename))))
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 return;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
82
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 sprite_init(&map->sprite, map->tileset, map->tilewidth, map->tileheight);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 static void
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 parse(struct map *map, const char *line, FILE *fp)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 if (strncmp(line, "title", 5) == 0)
38
83ae0e13c416 core: improve parsing of strings in map.c
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
90 sscanf(line, "title|" MAX_F(MAP_TITLE_MAX), map->title);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 else if (strncmp(line, "width", 5) == 0)
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
92 sscanf(line, "width|%u", &map->width);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 else if (strncmp(line, "height", 6) == 0)
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
94 sscanf(line, "height|%u", &map->height);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 else if (strncmp(line, "tilewidth", 9) == 0)
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
96 sscanf(line, "tilewidth|%hu", &map->tilewidth);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 else if (strncmp(line, "tileheight", 10) == 0)
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
98 sscanf(line, "tileheight|%hu", &map->tileheight);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 else if (strncmp(line, "tileset", 7) == 0)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 parse_tileset(map, line);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 else if (strncmp(line, "layer", 5) == 0)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 parse_layer(map, line, fp);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
104
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
105 static bool
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
106 check(struct map *map)
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
107 {
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
108 if (strlen(map->title) == 0)
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
109 return error_printf("map has no title");
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
110 if (!map->tileset)
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
111 return error_printf("unable to open tileset");
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
112 if (map->width == 0 || map->height == 0)
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
113 return error_printf("map has null sizes");
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
114 if (map->tilewidth == 0 || map->tileheight == 0)
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
115 return error_printf("map has null tile sizes");
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
116 if (!map->layers[0].tiles || !map->layers[1].tiles)
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
117 return error_printf("could not allocate data");
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
118
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
119 return true;
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
120 }
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
121
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 static void
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
123 draw_layer(struct map *map, const struct map_layer *layer)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 assert(map);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
126 assert(layer);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
127
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
128 int x = 0, y = 0;
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
129
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
130 for (unsigned int r = 0; r < map->width; ++r) {
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
131 for (unsigned int c = 0; c < map->height; ++c) {
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
132 unsigned int si = r * map->width + c;
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
133 unsigned int sr = (layer->tiles[si] - 1) / map->sprite.ncols;
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
134 unsigned int sc = (layer->tiles[si] - 1) % map->sprite.nrows;
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136 if (layer->tiles[si] != 0)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 sprite_draw(&map->sprite, sr, sc, x, y);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 x += map->tilewidth;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 x = 0;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143 y += map->tileheight;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 bool
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148 map_open(struct map *map, const char *path)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 assert(map);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 assert(path);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 memset(map, 0, sizeof (struct map));
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
154
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155 FILE *fp = fopen(path, "r");
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 char line[BUFSIZ];
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
157
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 if (!fp)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
159 return false;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
160
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 while (fgets(line, sizeof (line), fp)) {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 /* Remove \n if any */
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 line[strcspn(line, "\n")] = '\0';
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 parse(map, line, fp);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 fclose(fp);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
168
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
169 if (!check(map)) {
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
170 map_close(map);
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
171 return false;
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
172 }
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
173
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
174 size_t pw = map->width * map->tilewidth;
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
175 size_t ph = map->height * map->tileheight;
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
176
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
177 if (!(map->picture = texture_new(pw, ph)))
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
178 return error_sdl();
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
179
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
180 return true;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
181 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
182
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 void
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
184 map_draw(struct map *map, int srcx, int srcy)
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 {
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
186 texture_draw_ex(
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
187 map->picture,
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
188 srcx,
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
189 srcy,
47
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
190 window_width(),
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
191 window_height(),
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
192 0,
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
193 0,
47
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
194 window_width(),
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
195 window_height(),
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
196 0
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
197 );
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
198 }
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
199
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
200 void
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
201 map_repaint(struct map *map)
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
202 {
43
291be94202c7 core: add PAINTER_(BEGIN|END) helpers, closes #2456
David Demelier <markand@malikania.fr>
parents: 42
diff changeset
203 PAINTER_BEGIN(map->picture);
28
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
204 draw_layer(map, &map->layers[0]);
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
205 draw_layer(map, &map->layers[1]);
43
291be94202c7 core: add PAINTER_(BEGIN|END) helpers, closes #2456
David Demelier <markand@malikania.fr>
parents: 42
diff changeset
206 PAINTER_END();
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
207 }
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
208
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
209 void
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 map_close(struct map *map)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 assert(map);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
213
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 if (map->tileset)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 texture_close(map->tileset);
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
216 if (map->picture)
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
217 texture_close(map->picture);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 free(map->layers[0].tiles);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 free(map->layers[1].tiles);
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
221
47
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
222 memset(map, 0, sizeof (struct map));
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
223 }