Mercurial > molko
annotate libmlk-rpg/mlk/rpg/tileset.c @ 466:39dd7c66ebfd
core: script -> mlk_action_script
While here, don't create a static array and let the user specify the storage
area where actions will be put (similar to mlk_action_stack).
Remove example-action for now which requires a major rewrite.
author | David Demelier <markand@malikania.fr> |
---|---|
date | Mon, 27 Feb 2023 11:03:13 +0100 |
parents | 0c4cd552879d |
children | 91ce23a36143 |
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 } |