Mercurial > molko
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 |
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 | 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 | 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 | 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 | 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 | 205 map->tileset = tileset; |
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 } |