annotate libmlk-rpg/mlk/rpg/tileset-loader-file.c @ 552:ffd972a3d084

rpg: major rewrite of tilesets - Now tilesets can be opened using a custom allocator/loader. - A default mlk_tileset_loader_file implementation is provided. - Put a simple example-tileset example to demonstrate.
author David Demelier <markand@malikania.fr>
date Tue, 07 Mar 2023 20:45:00 +0100
parents
children f9e85d0aca74
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
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 }