Mercurial > molko
annotate libmlk-rpg/mlk/rpg/map-loader-file.c @ 555:6c911cbc1fd7
core: alloc_pool is no more
author | David Demelier <markand@malikania.fr> |
---|---|
date | Tue, 07 Mar 2023 22:35:43 +0100 |
parents | cdbc13ceff85 |
children | 7eebac09fcb7 |
rev | line source |
---|---|
554 | 1 /* |
2 * map-loader-file.c -- map file loader implementation | |
3 * | |
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr> | |
5 * | |
6 * Permission to use, copy, modify, and/or distribute this software for any | |
7 * purpose with or without fee is hereby granted, provided that the above | |
8 * copyright notice and this permission notice appear in all copies. | |
9 * | |
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | |
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | |
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | |
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | |
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | |
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | |
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | |
17 */ | |
18 | |
19 #include <assert.h> | |
20 | |
21 #include <mlk/core/alloc.h> | |
22 | |
23 #include "map-loader-file.h" | |
24 #include "map-loader.h" | |
25 #include "map.h" | |
26 #include "tileset-loader.h" | |
27 | |
28 static struct mlk_tileset * | |
29 init_tileset(struct mlk_map_loader *self, | |
30 struct mlk_map *map, | |
31 const char *ident) | |
32 { | |
33 (void)map; | |
34 | |
35 struct mlk_map_loader_file *file = self->data; | |
36 char path[MLK_PATH_MAX]; | |
37 | |
38 snprintf(path, sizeof (path), "%s/%s", file->directory, ident); | |
39 | |
40 if (mlk_tileset_loader_open(file->tileset_loader, &file->tileset, path) < 0) | |
41 return NULL; | |
42 | |
43 return &file->tileset; | |
44 } | |
45 | |
46 static unsigned int * | |
47 alloc_tiles(struct mlk_map_loader *self, | |
48 struct mlk_map *map, | |
49 enum mlk_map_layer_type type, | |
50 size_t n) | |
51 { | |
52 (void)map; | |
53 | |
54 struct mlk_map_loader_file *file = self->data; | |
55 | |
56 return file->tiles[type] = mlk_alloc_new0(n, sizeof (unsigned int)); | |
57 } | |
58 | |
59 static struct mlk_map_block * | |
60 expand_blocks(struct mlk_map_loader *self, | |
555
6c911cbc1fd7
core: alloc_pool is no more
David Demelier <markand@malikania.fr>
parents:
554
diff
changeset
|
61 struct mlk_map *map, |
554 | 62 struct mlk_map_block *blocks, |
63 size_t blocksz) | |
64 { | |
555
6c911cbc1fd7
core: alloc_pool is no more
David Demelier <markand@malikania.fr>
parents:
554
diff
changeset
|
65 (void)map; |
6c911cbc1fd7
core: alloc_pool is no more
David Demelier <markand@malikania.fr>
parents:
554
diff
changeset
|
66 |
554 | 67 struct mlk_map_loader_file *file = self->data; |
68 struct mlk_map_block *ptr; | |
69 | |
70 if (!file->blocks) | |
71 ptr = mlk_alloc_new0(1, sizeof (*ptr)); | |
72 else | |
73 ptr = mlk_alloc_expand(file->blocks, blocksz); | |
74 | |
75 if (ptr) | |
76 file->blocks = blocks; | |
77 | |
78 return ptr; | |
79 } | |
80 | |
81 void | |
82 mlk_map_loader_file_init(struct mlk_map_loader_file *file, | |
83 struct mlk_map_loader *loader, | |
84 const char *filename) | |
85 { | |
86 assert(file); | |
87 assert(loader); | |
88 | |
89 char filepath[MLK_PATH_MAX]; | |
90 | |
91 /* Determine base filename base directory. */ | |
92 mlk_util_strlcpy(filepath, filename, sizeof (filepath)); | |
93 mlk_util_strlcpy(file->directory, mlk_util_dirname(filepath), sizeof (file->directory)); | |
94 | |
95 loader->data = file; | |
96 loader->init_tileset = init_tileset; | |
97 loader->alloc_tiles = alloc_tiles; | |
98 loader->expand_blocks = expand_blocks; | |
99 } | |
100 | |
101 void | |
102 mlk_map_loader_file_finish(struct mlk_map_loader_file *file) | |
103 { | |
104 assert(file); | |
105 | |
106 for (int i = 0; i < MLK_MAP_LAYER_TYPE_LAST; ++i) { | |
107 mlk_alloc_free(file->tiles[i]); | |
108 file->tiles[i] = NULL; | |
109 } | |
110 | |
111 mlk_alloc_free(file->blocks); | |
112 file->blocks = NULL; | |
113 } |