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