Mercurial > molko
annotate libmlk-rpg/mlk/rpg/tileset-loader-file.c @ 564:e91f37da2992
core: doxygenize window
author | David Demelier <markand@malikania.fr> |
---|---|
date | Wed, 08 Mar 2023 20:09:21 +0100 |
parents | ffd972a3d084 |
children | f9e85d0aca74 |
rev | line source |
---|---|
552
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
1 /* |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
2 * tileset-file.c -- tileset file loader implementation |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
3 * |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
5 * |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
6 * Permission to use, copy, modify, and/or distribute this software for any |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
7 * purpose with or without fee is hereby granted, provided that the above |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
8 * copyright notice and this permission notice appear in all copies. |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
9 * |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
17 */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
18 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
19 #include <assert.h> |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
20 #include <string.h> |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
21 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
22 #include <mlk/core/alloc.h> |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include <mlk/core/animation.h> |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
24 #include <mlk/core/image.h> |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #include <mlk/core/sprite.h> |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
26 #include <mlk/core/texture.h> |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 #include "tileset-loader-file.h" |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 #include "tileset-loader.h" |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include "tileset.h" |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
32 static inline void * |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 allocate(void ***array, size_t width) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
34 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
35 void **ptr, *elem; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 /* Not yet allocated? Allocate a new pointer element. */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 if (!*array) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 ptr = mlk_alloc_new0(1, sizeof (void *)); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 else |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
41 ptr = mlk_alloc_expand(*array, 1); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
42 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
43 if (!ptr) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
44 return NULL; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
45 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 /* Now allocate the element itself because. */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 if (!(elem = mlk_alloc_new0(1, width))) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
48 return NULL; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 /* Store it into the array of elements. */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 ptr[mlk_alloc_getn(ptr) - 1] = elem; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
52 *array = ptr; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
54 return elem; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
55 } |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
56 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
57 static void * |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 expand(void **array, size_t n, size_t w) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 void *ptr; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
61 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
62 if (!*array) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 ptr = mlk_alloc_new0(n, w); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 else |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
65 ptr = mlk_alloc_expand(*array, n); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
66 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 if (ptr) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
68 *array = ptr; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
69 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
70 return ptr; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
71 } |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
72 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
73 static void |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
74 finish(void ***ptr, void (*finish)(void *)) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
75 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
76 size_t len; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
77 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
78 /* Already cleared. */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
79 if (!*ptr) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
80 return; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
81 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 len = mlk_alloc_getn(*ptr); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 for (size_t i = 0; i < len; ++i) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 finish((*ptr)[i]); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
87 mlk_alloc_free(*ptr); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
88 *ptr = NULL; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
89 } |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
90 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
91 static void |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
92 finish_texture(void *element) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
93 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
94 mlk_texture_finish(element); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
95 mlk_alloc_free(element); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
96 } |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
97 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
98 static struct mlk_texture * |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
99 init_texture(struct mlk_tileset_loader *self, const char *ident) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
100 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
101 struct mlk_tileset_loader_file *file = self->data; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
102 struct mlk_texture *texture; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
103 char path[MLK_PATH_MAX]; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
104 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
105 snprintf(path, sizeof (path), "%s/%s", file->directory, ident); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
106 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
107 /* No need to deallocate, already done in finish anyway. */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
108 if (!(texture = allocate((void ***)&file->textures, sizeof (struct mlk_texture)))) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
109 return NULL; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
110 if (mlk_image_open(texture, path) < 0) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
111 return NULL; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
112 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
113 return texture; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
114 } |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
115 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
116 static struct mlk_sprite * |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
117 init_sprite(struct mlk_tileset_loader *self) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
118 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
119 struct mlk_tileset_loader_file *file = self->data; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
120 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
121 return allocate((void ***)&file->sprites, sizeof (struct mlk_sprite)); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
122 } |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
123 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
124 static struct mlk_animation * |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
125 init_animation(struct mlk_tileset_loader *self) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
126 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
127 struct mlk_tileset_loader_file *file = self->data; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
128 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
129 return allocate((void ***)&file->animations, sizeof (struct mlk_animation)); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
130 } |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
131 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
132 struct mlk_tileset_collision * |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
133 expand_collisions(struct mlk_tileset_loader *self, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 struct mlk_tileset_collision *array, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 size_t arraysz) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
136 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
137 (void)array; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
138 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
139 struct mlk_tileset_loader_file *file = self->data; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
140 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
141 return expand((void **)&file->tilecollisions, arraysz, sizeof (struct mlk_tileset_collision)); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
142 } |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
143 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
144 struct mlk_tileset_animation * |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 expand_animations(struct mlk_tileset_loader *self, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 struct mlk_tileset_animation *array, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 size_t arraysz) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
149 (void)array; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
150 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 struct mlk_tileset_loader_file *file = self->data; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
152 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
153 return expand((void **)&file->tileanimations, arraysz, sizeof (struct mlk_tileset_animation)); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
154 } |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
155 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
156 void |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
157 mlk_tileset_loader_file_init(struct mlk_tileset_loader_file *file, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
158 struct mlk_tileset_loader *loader, |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
159 const char *filename) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
160 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
161 assert(file); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
162 assert(loader); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
163 assert(filename); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
164 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
165 char filepath[MLK_PATH_MAX]; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
166 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 memset(file, 0, sizeof (*file)); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 memset(loader, 0, sizeof (*loader)); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
169 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
170 /* Determine base filename base directory. */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 mlk_util_strlcpy(filepath, filename, sizeof (filepath)); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
172 mlk_util_strlcpy(file->directory, mlk_util_dirname(filepath), sizeof (file->directory)); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 loader->data = file; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 loader->init_texture = init_texture; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 loader->init_sprite = init_sprite; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 loader->init_animation = init_animation; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 loader->expand_collisions = expand_collisions; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
179 loader->expand_animations = expand_animations; |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 } |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 void |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 mlk_tileset_loader_file_finish(struct mlk_tileset_loader_file *file) |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
184 { |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
185 assert(file); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
187 /* Finalize individual elements. */ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
188 finish((void ***)&file->textures, finish_texture); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
189 finish((void ***)&file->sprites, mlk_alloc_free); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
190 finish((void ***)&file->animations, mlk_alloc_free); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
191 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
192 /* Clear array of collisions/animations .*/ |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
193 mlk_alloc_free(file->tilecollisions); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 mlk_alloc_free(file->tileanimations); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
195 |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
196 memset(file, 0, sizeof (*file)); |
ffd972a3d084
rpg: major rewrite of tilesets
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
197 } |