annotate librpg/rpg/map.c @ 192:4ad7420ab678

rpg: add minimalist battle system, continue #2477 @60h - Implement battle as states, - Add basic support for spells (no calculation yet), - Add won/lost state, - Add animations and messages, - Add order.
author David Demelier <markand@malikania.fr>
date Sat, 07 Nov 2020 16:00:39 +0100
parents eb0a7ab71023
children 852d0b7817ce
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
148
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
24 #include <core/error.h>
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
25 #include <core/image.h>
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
26 #include <core/painter.h>
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
27 #include <core/sprite.h>
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
28 #include <core/sys.h>
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
29 #include <core/texture.h>
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
30 #include <core/window.h>
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 131
diff changeset
31
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 #include "map.h"
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
33
38
83ae0e13c416 core: improve parsing of strings in map.c
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
34 /* 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
35 #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
36 #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
37
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 static void
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
39 parse_layer(struct map_data *data, const char *line, FILE *fp)
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 {
38
83ae0e13c416 core: improve parsing of strings in map.c
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
41 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
42 struct map_layer *layer;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 size_t amount, current;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
44
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 /* Determine layer. */
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 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
47 return;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
48 if (strcmp(layer_name, "background") == 0)
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
49 layer = &data->layers[0];
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 else if (strcmp(layer_name, "foreground") == 0)
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
51 layer = &data->layers[1];
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 else
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 return;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 /* Check if weight/height has been specified. */
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
56 if (data->w == 0 || data->h == 0)
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 return;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
59 amount = data->w * data->h;
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 current = 0;
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
61
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
62 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
63 return;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
64
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 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
66 layer->tiles[current] = tile;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
68
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 static void
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
70 parse(struct map_data *data, const char *line, FILE *fp)
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 if (strncmp(line, "title", 5) == 0)
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
73 sscanf(line, "title|" MAX_F(MAP_TITLE_MAX), data->title);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 else if (strncmp(line, "width", 5) == 0)
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
75 sscanf(line, "width|%u", &data->w);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 else if (strncmp(line, "height", 6) == 0)
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
77 sscanf(line, "height|%u", &data->h);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 else if (strncmp(line, "tilewidth", 9) == 0)
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
79 sscanf(line, "tilewidth|%hu", &data->tile_w);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 else if (strncmp(line, "tileheight", 10) == 0)
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
81 sscanf(line, "tileheight|%hu", &data->tile_h);
50
402aa7dcffe1 core: implement map origin, closes #2462 @1h
David Demelier <markand@malikania.fr>
parents: 47
diff changeset
82 else if (strncmp(line, "origin", 6) == 0)
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
83 sscanf(line, "origin|%d|%d", &data->origin_x, &data->origin_y);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 else if (strncmp(line, "tileset", 7) == 0)
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
85 sscanf(line, "tileset|" MAX_F(MAP_TILESET_MAX), data->tileset);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 else if (strncmp(line, "layer", 5) == 0)
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
87 parse_layer(data, line, fp);
27
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
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
90 static bool
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
91 check(struct map_data *data)
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
92 {
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
93 if (strlen(data->title) == 0)
168
aab824406d3d misc: all printf-like function are name foof and vfoof
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
94 return errorf("data has no title");
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
95 if (data->w == 0 || data->h == 0)
168
aab824406d3d misc: all printf-like function are name foof and vfoof
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
96 return errorf("data has null sizes");
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
97 if (data->tile_w == 0 || data->tile_h == 0)
168
aab824406d3d misc: all printf-like function are name foof and vfoof
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
98 return errorf("data has null tile sizes");
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
99 if (!data->layers[0].tiles || !data->layers[1].tiles)
168
aab824406d3d misc: all printf-like function are name foof and vfoof
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
100 return errorf("could not allocate data");
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
101
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
102 return true;
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
103 }
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
104
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 static void
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 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
107 {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 assert(map);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 assert(layer);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
110
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
111 struct sprite sprite;
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 43
diff changeset
112 int x = 0, y = 0;
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
113
131
c679e08b32b2 molko: fix startup
David Demelier <markand@malikania.fr>
parents: 124
diff changeset
114 sprite_init(&sprite, map->tileset, map->data->tile_w, map->data->tile_h);
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
115
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
116 for (unsigned int r = 0; r < map->data->w; ++r) {
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
117 for (unsigned int c = 0; c < map->data->h; ++c) {
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
118 unsigned int si = r * map->data->w + c;
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
119 unsigned int sr = (layer->tiles[si] - 1) / sprite.ncols;
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
120 unsigned int sc = (layer->tiles[si] - 1) % sprite.nrows;
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
121
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
122 if (layer->tiles[si] != 0)
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
123 sprite_draw(&sprite, sr, sc, x, y);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
124
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
125 x += map->data->tile_w;
27
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
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 x = 0;
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
129 y += map->data->tile_h;
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 bool
124
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
134 map_data_open_fp(struct map_data *data, FILE *fp)
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 {
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
136 assert(data);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137
124
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
138 char line[1024];
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 if (!fp)
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
141 return false;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
142
124
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
143 memset(data, 0, sizeof (*data));
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
144
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
145 while (fgets(line, sizeof (line), fp)) {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 /* Remove \n if any */
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
147 line[strcspn(line, "\n")] = '\0';
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
148 parse(data, line, fp);
27
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
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 fclose(fp);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
153 if (!check(data)) {
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
154 map_data_finish(data);
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
155 return false;
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
156 }
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
157
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
158 /* Compute real size. */
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
159 data->real_w = data->w * data->tile_w;
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
160 data->real_h = data->h * data->tile_h;
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
161
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162 return true;
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 }
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
164
124
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
165 bool
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
166 map_data_open(struct map_data *data, const char *path)
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
167 {
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
168 assert(data);
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
169 assert(path);
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
170
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
171 return map_data_open_fp(data, fopen(path, "r"));
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
172 }
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
173
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
174 bool
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
175 map_data_openmem(struct map_data *data, const void *buf, size_t bufsz)
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
176 {
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
177 assert(data);
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
178 assert(buf);
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
179
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
180 return map_data_open_fp(data, fmemopen((void *)buf, bufsz, "r"));
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
181 }
7b84764741b6 core: allows loading maps from memory, closes #2489
David Demelier <markand@malikania.fr>
parents: 121
diff changeset
182
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 void
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
184 map_data_finish(struct map_data *data)
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
185 {
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
186 assert(data);
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
187
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
188 free(data->layers[0].tiles);
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
189 free(data->layers[1].tiles);
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
190
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
191 memset(data, 0, sizeof (*data));
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
192 }
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
193
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
194 bool
131
c679e08b32b2 molko: fix startup
David Demelier <markand@malikania.fr>
parents: 124
diff changeset
195 map_init(struct map *map, struct map_data *data, struct texture *tileset)
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
196 {
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
197 assert(map);
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
198 assert(data);
131
c679e08b32b2 molko: fix startup
David Demelier <markand@malikania.fr>
parents: 124
diff changeset
199 assert(tileset && texture_ok(tileset));
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
200
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
201 if (!(texture_new(&map->picture, data->real_w, data->real_h)))
131
c679e08b32b2 molko: fix startup
David Demelier <markand@malikania.fr>
parents: 124
diff changeset
202 return false;
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
203
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
204 map->data = data;
131
c679e08b32b2 molko: fix startup
David Demelier <markand@malikania.fr>
parents: 124
diff changeset
205 map->tileset = tileset;
c679e08b32b2 molko: fix startup
David Demelier <markand@malikania.fr>
parents: 124
diff changeset
206
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
207 map_repaint(map);
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
208
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
209 return true;
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
210 }
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
211
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
212 void
42
22a09a5ee476 core: add better map check and unit tests
David Demelier <markand@malikania.fr>
parents: 41
diff changeset
213 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
214 {
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
215 texture_scale(&map->picture, srcx, srcy, window.w, window.h,
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
216 0, 0, window.w, window.h, 0.0);
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
217 }
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
218
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
219 void
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
220 map_repaint(struct map *map)
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
221 {
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
222 PAINTER_BEGIN(&map->picture);
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
223 draw_layer(map, &map->data->layers[0]);
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
224 draw_layer(map, &map->data->layers[1]);
43
291be94202c7 core: add PAINTER_(BEGIN|END) helpers, closes #2456
David Demelier <markand@malikania.fr>
parents: 42
diff changeset
225 PAINTER_END();
41
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
226 }
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
227
3996f873a54b core: implement walksprite, closes #2455
David Demelier <markand@malikania.fr>
parents: 38
diff changeset
228 void
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
229 map_finish(struct map *map)
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
230 {
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
231 assert(map);
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
232
94
ed72843a7194 core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
233 texture_finish(&map->picture);
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
234
98
c7e993455985 map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents: 97
diff changeset
235 memset(map, 0, sizeof (*map));
27
607bd90aba63 core: finalize map converter and opener, closes #2448 @6h
David Demelier <markand@malikania.fr>
parents:
diff changeset
236 }