Mercurial > molko
annotate libmlk-rpg/mlk/rpg/tileset-loader.c @ 646:7e1eb7f6c049 default tip @
misc: remove .clang
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sun, 04 Feb 2024 15:24:37 +0100 |
parents | bb67f935a93f |
children |
rev | line source |
---|---|
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
2 * tileset-loader.c -- abstract tileset loader |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
445
773a082f0b91
misc: update copyright years
David Demelier <markand@malikania.fr>
parents:
442
diff
changeset
|
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <errno.h> |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 #include <stdio.h> |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <stdlib.h> |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include <string.h> |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 |
432
38cf60f5a1c4
util: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
431
diff
changeset
|
25 #include <mlk/util/util.h> |
315
3bfaaf5342a9
cmake: add support for Visual Studio 2019
David Demelier <markand@malikania.fr>
parents:
314
diff
changeset
|
26 |
431
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
428
diff
changeset
|
27 #include <mlk/core/animation.h> |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
28 #include <mlk/core/err.h> |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
29 #include <mlk/core/sprite.h> |
431
8f59201dc76b
core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents:
428
diff
changeset
|
30 #include <mlk/core/util.h> |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
32 #include "tileset-loader.h" |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 #include "tileset.h" |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
35 static int |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
36 collision_cmp(const void *d1, const void *d2) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
37 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
38 const struct mlk_tileset_collision *c1 = d1; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
39 const struct mlk_tileset_collision *c2 = d2; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
41 if (c1->id < c2->id) |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 return -1; |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
43 if (c1->id > c2->id) |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 return 1; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 return 0; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
49 static int |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
50 animation_cmp(const void *d1, const void *d2) |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
51 { |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
52 const struct mlk_tileset_animation *a1 = d1; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
53 const struct mlk_tileset_animation *a2 = d2; |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
54 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
55 if (a1->id < a2->id) |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
56 return -1; |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
57 if (a1->id > a2->id) |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
58 return 1; |
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
59 |
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
60 return 0; |
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
61 } |
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
62 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
63 static int |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
64 parse_tilewidth(struct mlk_tileset_loader *loader, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
65 struct mlk_tileset *tileset, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
66 const char *line, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
67 FILE *fp) |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 { |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
69 (void)loader; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
70 (void)tileset; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
71 (void)fp; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
72 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
73 if (sscanf(line, "tilewidth|%u", &loader->tilewidth) != 1 || loader->tilewidth == 0) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
74 return mlk_errf("tilewidth is null or invalid"); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
76 return 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
79 static int |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
80 parse_tileheight(struct mlk_tileset_loader *loader, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
81 struct mlk_tileset *tileset, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
82 const char *line, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
83 FILE *fp) |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 { |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
85 (void)loader; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
86 (void)tileset; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
87 (void)fp; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
88 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
89 if (sscanf(line, "tileheight|%u", &loader->tileheight) != 1 || loader->tileheight == 0) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
90 return mlk_errf("tileheight is null or invalid"); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
92 return 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
95 static int |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
96 parse_collisions(struct mlk_tileset_loader *loader, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
97 struct mlk_tileset *tileset, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
98 const char *line, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
99 FILE *fp) |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 { |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 (void)line; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
103 struct mlk_tileset_collision *array, *collision, *collisions = NULL; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
104 unsigned int id, w, h; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
105 int x, y; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
106 size_t collisionsz = 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
108 while (fscanf(fp, "%u|%d|%d|%u|%u\n", &id, &x, &y, &w, &h) == 5) { |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
109 if (!(array = loader->expand_collisions(loader, tileset, collisions, collisionsz + 1))) |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
110 return -1; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
111 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
112 collisions = array; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
113 collision = &collisions[collisionsz++]; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
114 collision->id = id; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
115 collision->x = x; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
116 collision->y = y; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
117 collision->w = w; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
118 collision->h = h; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
121 /* |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
122 * Sort and link this array in the final tileset, user has ownership of |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
123 * the data. |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
124 */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
125 qsort(collisions, collisionsz, sizeof (*collisions), collision_cmp); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
126 tileset->collisions = collisions; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
127 tileset->collisionsz = collisionsz; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
129 return 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
132 static int |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
133 parse_animations(struct mlk_tileset_loader *loader, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
134 struct mlk_tileset *tileset, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
135 const char *line, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
136 FILE *fp) |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
137 { |
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
138 (void)line; |
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
139 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
140 char fmt[64], filename[MLK_PATH_MAX]; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
141 unsigned int id, delay; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
142 struct mlk_tileset_animation *array, *tileanimation, *tileanimations = NULL; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
143 struct mlk_texture *texture; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
144 struct mlk_sprite *sprite; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
145 struct mlk_animation *animation; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
146 size_t tileanimationsz = 0; |
228
2734223d3daf
core: add a alloc_pool module
David Demelier <markand@malikania.fr>
parents:
227
diff
changeset
|
147 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
148 /* Create a format string for fscanf. */ |
554
cdbc13ceff85
rpg: do the same for map
David Demelier <markand@malikania.fr>
parents:
552
diff
changeset
|
149 snprintf(fmt, sizeof (fmt), "%%u|%%%zu[^|]|%%u", sizeof (filename) - 1); |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
150 |
238
b30c3af37a01
rpg: fix possible dangling pointer in tileset-file
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
151 /* |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
152 * When parsing animations, we have to create three different |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
153 * structures: |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
154 * |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
155 * 1. The texture itself. |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
156 * 2. The sprite object that will use the above texture. |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
157 * 3. The animation object. |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
158 * 4. Link the animation to the tileset animation. |
238
b30c3af37a01
rpg: fix possible dangling pointer in tileset-file
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
159 */ |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
160 while (fscanf(fp, fmt, &id, filename, &delay) == 3) { |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
161 if (!(texture = loader->new_texture(loader, tileset, filename))) |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
162 return -1; |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
163 if (!(sprite = loader->new_sprite(loader, tileset))) |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
164 return -1; |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
165 if (!(animation = loader->new_animation(loader, tileset))) |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
166 return -1; |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
167 if (!(array = loader->expand_animations(loader, tileset, tileanimations, tileanimationsz + 1))) |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
168 return -1; |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
169 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
170 /* Bind the texture to the new sprite. */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
171 sprite->texture = texture; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
172 sprite->cellw = loader->tilewidth; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
173 sprite->cellh = loader->tileheight; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
174 mlk_sprite_init(sprite); |
514 | 175 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
176 /* Bind the sprite to the new animation. */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
177 animation->sprite = sprite; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
178 animation->delay = delay; |
516 | 179 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
180 /* Add the animation to the array. */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
181 tileanimations = array; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
182 tileanimation = &tileanimations[tileanimationsz++]; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
183 tileanimation->id = id; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
184 tileanimation->animation = animation; |
238
b30c3af37a01
rpg: fix possible dangling pointer in tileset-file
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
185 } |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
186 |
238
b30c3af37a01
rpg: fix possible dangling pointer in tileset-file
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
187 /* |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
188 * Sort and link this array in the final tileset, user has ownership of |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
189 * the data. |
238
b30c3af37a01
rpg: fix possible dangling pointer in tileset-file
David Demelier <markand@malikania.fr>
parents:
228
diff
changeset
|
190 */ |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
191 qsort(tileanimations, tileanimationsz, sizeof (*tileanimations), animation_cmp); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
192 tileset->animations = tileanimations; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
193 tileset->animationsz = tileanimationsz; |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
194 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
195 return 0; |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
196 } |
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
197 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
198 static int |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
199 parse_image(struct mlk_tileset_loader *loader, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
200 struct mlk_tileset *tileset, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
201 const char *line, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
202 FILE *fp) |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
203 { |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
204 (void)fp; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
206 const char *p; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
207 struct mlk_texture *texture; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
208 struct mlk_sprite *sprite; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
209 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
210 if (loader->tilewidth == 0 || loader->tileheight == 0) |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
524
diff
changeset
|
211 return mlk_errf("missing tile dimensions before image"); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
212 if (!(p = strchr(line, '|'))) |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
524
diff
changeset
|
213 return mlk_errf("could not parse image"); |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
214 if (!(texture = loader->new_texture(loader, tileset, p + 1))) |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
215 return -1; |
593
f9e85d0aca74
rpg: introduce private loader_file to help allocating map/tileset
David Demelier <markand@malikania.fr>
parents:
571
diff
changeset
|
216 if (!(sprite = loader->new_sprite(loader, tileset))) |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
524
diff
changeset
|
217 return -1; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
219 /* Initialize the sprite with the texture. */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
220 sprite->texture = texture; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
221 sprite->cellw = loader->tilewidth; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
222 sprite->cellh = loader->tileheight; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
223 mlk_sprite_init(sprite); |
516 | 224 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
225 /* Link this texture to the final tileset. */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
226 tileset->sprite = sprite; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
227 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
228 return 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
229 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
230 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
231 static int |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
232 parse_line(struct mlk_tileset_loader *loader, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
233 struct mlk_tileset *tileset, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
234 const char *line, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
235 FILE *fp) |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
236 { |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
237 static const struct { |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
238 const char *property; |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
239 int (*read)(struct mlk_tileset_loader *, struct mlk_tileset *, const char *, FILE *); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
240 } props[] = { |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
241 { "tilewidth", parse_tilewidth }, |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
242 { "tileheight", parse_tileheight }, |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
243 { "collisions", parse_collisions }, |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
244 { "animations", parse_animations }, |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
245 { "image", parse_image } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
246 }; |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
247 |
474
ca30ff96bbe0
core: util -> mlk_util
David Demelier <markand@malikania.fr>
parents:
472
diff
changeset
|
248 for (size_t i = 0; i < MLK_UTIL_SIZE(props); ++i) { |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
249 if (strncmp(line, props[i].property, strlen(props[i].property)) == 0) |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
250 return props[i].read(loader, tileset, line, fp); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
251 } |
411
d74f53299252
make: add basic GNU make support
David Demelier <markand@malikania.fr>
parents:
404
diff
changeset
|
252 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
253 return 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
254 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
255 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
256 static int |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
257 check(const struct mlk_tileset *tileset) |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
258 { |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
259 if (!tileset->sprite) |
547
c7664b679a95
misc: remove error codes for now
David Demelier <markand@malikania.fr>
parents:
524
diff
changeset
|
260 return mlk_errf("missing tileset image"); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
261 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
262 return 0; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
263 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
264 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
265 static int |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
266 parse(struct mlk_tileset_loader *loader, struct mlk_tileset *tileset, FILE *fp) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
267 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
268 char line[128]; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
269 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
270 while (fgets(line, sizeof (line), fp)) { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
271 /* Remove \n if any */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
272 line[strcspn(line, "\r\n")] = 0; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
273 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
274 if (parse_line(loader, tileset, line, fp) < 0) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
275 return -1; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
276 } |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
277 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
278 return check(tileset); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
279 } |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
280 |
298
196264679079
misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents:
295
diff
changeset
|
281 int |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
282 mlk_tileset_loader_open(struct mlk_tileset_loader *loader, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
283 struct mlk_tileset *tileset, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
284 const char *path) |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
285 { |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
286 assert(loader); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
287 assert(tileset); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
288 assert(path); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
289 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
290 FILE *fp; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
291 |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
292 memset(tileset, 0, sizeof (*tileset)); |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
293 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
294 if (!(fp = fopen(path, "r"))) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
295 return mlk_errf("%s", strerror(errno)); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
296 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
297 return parse(loader, tileset, fp); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
298 } |
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
299 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
300 int |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
301 mlk_tileset_loader_openmem(struct mlk_tileset_loader *loader, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
302 struct mlk_tileset *tileset, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
303 const void *data, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
304 size_t datasz) |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
305 { |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
306 assert(loader); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
307 assert(tileset); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
308 assert(data); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
309 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
310 FILE *fp; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
311 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
312 memset(tileset, 0, sizeof (*tileset)); |
218
71f989ae8de9
rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents:
215
diff
changeset
|
313 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
314 if (!(fp = mlk_util_fmemopen((void *)data, datasz, "r"))) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
315 return -1; |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
316 |
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
547
diff
changeset
|
317 return parse(loader, tileset, fp); |
215
64f24b482722
rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
318 } |
631
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
319 |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
320 void |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
321 mlk_tileset_loader_clear(struct mlk_tileset_loader *loader, |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
322 struct mlk_tileset *tileset) |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
323 { |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
324 assert(loader); |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
325 assert(tileset); |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
326 |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
327 if (loader->clear) |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
328 loader->clear(loader, tileset); |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
329 |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
330 memset(tileset, 0, sizeof (*tileset)); |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
331 } |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
332 |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
333 void |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
334 mlk_tileset_loader_finish(struct mlk_tileset_loader *loader) |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
335 { |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
336 assert(loader); |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
337 |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
338 if (loader->finish) |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
339 loader->finish(loader); |
bb67f935a93f
rpg: rework a little tileset/map loaders
David Demelier <markand@malikania.fr>
parents:
593
diff
changeset
|
340 } |