annotate src/core/map.c @ 59:52792b863ff7

misc: separate core from game
author David Demelier <markand@malikania.fr>
date Tue, 21 Jan 2020 12:42:33 +0100
parents src/map.c@402aa7dcffe1
children ed72843a7194
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);
50
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
99 else if (strncmp(line, "origin", 6) == 0)
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
100 sscanf(line, "origin|%d|%d", &map->origin_x, &map->origin_y);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 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
102 parse_tileset(map, line);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 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
104 parse_layer(map, line, fp);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
106
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
107 static bool
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
108 check(struct map *map)
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
109 {
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
110 if (strlen(map->title) == 0)
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
111 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
112 if (!map->tileset)
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
113 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
114 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
115 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
116 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
117 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
118 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
119 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
120
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
121 return true;
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
122 }
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
123
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124 static void
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
125 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
126 {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
127 assert(map);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 assert(layer);
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 int x = 0, y = 0;
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
132 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
133 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
134 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
135 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
136 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
137
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138 if (layer->tiles[si] != 0)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 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
140
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 x += map->tilewidth;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
143
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
144 x = 0;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 y += map->tileheight;
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 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
148
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 bool
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 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
151 {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 assert(map);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
153 assert(path);
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 memset(map, 0, sizeof (struct map));
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
156
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
157 FILE *fp = fopen(path, "r");
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
158 char line[BUFSIZ];
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
159
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
160 if (!fp)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 return false;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 while (fgets(line, sizeof (line), fp)) {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
164 /* Remove \n if any */
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 line[strcspn(line, "\n")] = '\0';
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 parse(map, line, fp);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
168
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 fclose(fp);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
171 if (!check(map)) {
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
172 map_close(map);
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
173 return false;
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
174 }
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
175
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
176 size_t pw = map->width * map->tilewidth;
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
177 size_t ph = map->height * map->tileheight;
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
178
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
179 if (!(map->picture = texture_new(pw, ph)))
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
180 return error_sdl();
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
181
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
182 return true;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
184
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 void
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
186 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
187 {
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
188 texture_draw_ex(
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
189 map->picture,
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
190 srcx,
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
191 srcy,
47
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
192 window_width(),
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
193 window_height(),
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
194 0,
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
195 0,
47
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
196 window_width(),
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
197 window_height(),
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
198 0
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 }
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
201
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
202 void
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
203 map_repaint(struct map *map)
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
204 {
43
291be94202c7 core: add PAINTER_(BEGIN|END) helpers, closes #2456
David Demelier <markand@malikania.fr>
parents: 42
diff changeset
205 PAINTER_BEGIN(map->picture);
28
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
206 draw_layer(map, &map->layers[0]);
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 27
diff changeset
207 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
208 PAINTER_END();
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
209 }
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
210
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
211 void
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
212 map_close(struct map *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 assert(map);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
215
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 if (map->tileset)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
217 texture_close(map->tileset);
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
218 if (map->picture)
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
219 texture_close(map->picture);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
220
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
221 free(map->layers[0].tiles);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
222 free(map->layers[1].tiles);
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
223
47
f053a9f38c0e core: implement basic scrolling, closes #2459
David Demelier <markand@malikania.fr>
parents: 46
diff changeset
224 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
225 }