annotate libmlk-rpg/mlk/rpg/tileset.c @ 448:0c4cd552879d

core: animation -> mlk_animation
author David Demelier <markand@malikania.fr>
date Sat, 18 Feb 2023 13:06:04 +0100
parents 773a082f0b91
children 91ce23a36143
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * tileset.c -- map tileset definition
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: 434
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>
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
20 #include <stdlib.h>
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
431
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
22 #include <mlk/core/animation.h>
8f59201dc76b core: cleanup hierarchy
David Demelier <markand@malikania.fr>
parents: 378
diff changeset
23 #include <mlk/core/sprite.h>
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
24
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include "tileset.h"
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
26
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
27 static inline int
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
28 anim_cmp(const void *d1, const void *d2)
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
29 {
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
30 const struct tileset_animation *mtd1 = d1;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
31 const struct tileset_animation *mtd2 = d2;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
32
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
33 if (mtd1->id < mtd2->id)
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
34 return -1;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
35 if (mtd1->id > mtd2->id)
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
36 return 1;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
37
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
38 return 0;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
39 }
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
40
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
41 static inline const struct tileset_animation *
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
42 find(const struct tileset *ts, unsigned int r, unsigned int c)
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
43 {
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
44 const struct tileset_animation key = {
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
45 .id = c + (r * ts->sprite->ncols)
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
46 };
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
47
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
48 return bsearch(&key, ts->anims, ts->animsz, sizeof (key), anim_cmp);
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
49 }
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
50
298
196264679079 misc: remove usage of bool
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
51 int
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 tileset_ok(const struct tileset *ts)
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 {
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 return ts && sprite_ok(ts->sprite);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 }
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 void
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
58 tileset_start(struct tileset *ts)
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 for (size_t i = 0; i < ts->animsz; ++i) {
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
61 struct tileset_animation *ta = &ts->anims[i];
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
62
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
63 if (ta->animation)
448
0c4cd552879d core: animation -> mlk_animation
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
64 mlk_animation_start(ta->animation);
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
65 }
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
66 }
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
67
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
68 void
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
69 tileset_update(struct tileset *ts, unsigned int ticks)
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
70 {
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
71 for (size_t i = 0; i < ts->animsz; ++i) {
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
72 struct tileset_animation *ta = &ts->anims[i];
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
73
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
74 if (!ta->animation)
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
75 continue;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
76
448
0c4cd552879d core: animation -> mlk_animation
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
77 if (mlk_animation_update(ta->animation, ticks))
0c4cd552879d core: animation -> mlk_animation
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
78 mlk_animation_start(ta->animation);
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
79 }
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
80 }
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
81
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
82 void
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 tileset_draw(const struct tileset *ts, unsigned int r, unsigned int c, int x, int y)
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 {
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 assert(ts);
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
86
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
87 const struct tileset_animation *ta;
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
88
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
89 if ((ta = find(ts, r, c)))
448
0c4cd552879d core: animation -> mlk_animation
David Demelier <markand@malikania.fr>
parents: 445
diff changeset
90 mlk_animation_draw(ta->animation, x, y);
218
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
91 else
71f989ae8de9 rpg: add support for animated tiles
David Demelier <markand@malikania.fr>
parents: 215
diff changeset
92 sprite_draw(ts->sprite, r, c, x, y);
215
64f24b482722 rpg: implement tilesets separately, closes #2515 @4h
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 }