annotate examples/example-action/chest.c @ 630:8d8fe99b357c

core: fix buffer overflow in sndfile
author David Demelier <markand@malikania.fr>
date Sun, 27 Aug 2023 11:04:57 +0200
parents 95792046d3d2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
481
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * chest.c -- animated chest
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020-2023 David Demelier <markand@malikania.fr>
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
21 #include <mlk/core/event.h>
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <mlk/core/maths.h>
482
f78455f45bf6 examples: improve example-action more
David Demelier <markand@malikania.fr>
parents: 481
diff changeset
23 #include <mlk/core/sound.h>
481
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <mlk/core/sprite.h>
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
25
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <mlk/example/registry.h>
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include "chest.h"
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
29
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #define CHEST_DELAY 80
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 static void
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 handle(struct mlk_action *act, const union mlk_event *ev)
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 {
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 struct chest *chest = act->data;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
36 unsigned int cw, ch;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
37
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 /* Make sure that we don't operate on a already opened chest. */
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 if (chest->state == CHEST_STATE_OPENED)
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 return;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
41
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 /*
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 * We are only interested if the event is a click on the chest itself
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 * so we have to test because actions have no notion of geometry.
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 */
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 if (ev->type != MLK_EVENT_CLICKDOWN)
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 return;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
500
d7855791a2b8 examples: prefix mlk
David Demelier <markand@malikania.fr>
parents: 482
diff changeset
49 cw = mlk_registry_sprites[MLK_REGISTRY_TEXTURE_CHEST].cellw;
d7855791a2b8 examples: prefix mlk
David Demelier <markand@malikania.fr>
parents: 482
diff changeset
50 ch = mlk_registry_sprites[MLK_REGISTRY_TEXTURE_CHEST].cellh;
481
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
51
528
95792046d3d2 core: doxygenize maths
David Demelier <markand@malikania.fr>
parents: 514
diff changeset
52 if (!mlk_maths_is_boxed(ev->click.x, ev->click.y, chest->x, chest->y, cw, ch))
481
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
53 return;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
54
500
d7855791a2b8 examples: prefix mlk
David Demelier <markand@malikania.fr>
parents: 482
diff changeset
55 mlk_sound_play(&mlk_registry_sounds[MLK_REGISTRY_SOUND_OPEN_CHEST]);
481
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
56 mlk_animation_start(&chest->animation);
482
f78455f45bf6 examples: improve example-action more
David Demelier <markand@malikania.fr>
parents: 481
diff changeset
57
481
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
58 chest->state = CHEST_STATE_OPENING;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 }
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
60
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 static int
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 update(struct mlk_action *act, unsigned int ticks)
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
63 {
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 struct chest *chest = act->data;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
65
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
66 if (chest->state != CHEST_STATE_OPENING)
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 return 0;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
68
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 if (mlk_animation_update(&chest->animation, ticks)) {
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 chest->state = CHEST_STATE_OPENED;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
71
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 if (chest->run)
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 chest->run(chest);
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 }
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
75
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 /* The chest never dies. */
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 return 0;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 }
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 static void
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 draw(struct mlk_action *act)
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 {
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
83 const struct chest *chest = act->data;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
84
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 switch (chest->state) {
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
86 case CHEST_STATE_CLOSED:
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 mlk_sprite_draw(chest->animation.sprite, 0, 0, chest->x, chest->y);
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 break;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 case CHEST_STATE_OPENING:
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 mlk_animation_draw(&chest->animation, chest->x, chest->y);
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 break;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 case CHEST_STATE_OPENED:
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 mlk_sprite_draw(chest->animation.sprite,
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 chest->animation.sprite->nrows - 1,
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 chest->animation.sprite->ncols - 1,
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 chest->x,
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 chest->y);
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
98 break;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 default:
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 break;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
101 }
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 }
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
103
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 struct mlk_action *
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 chest_init(struct chest *chest)
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 {
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
107 assert(chest);
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
108
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 chest->state = CHEST_STATE_CLOSED;
514
daf085bf8a8c misc: fix build
David Demelier <markand@malikania.fr>
parents: 500
diff changeset
110 chest->animation.sprite = &mlk_registry_sprites[MLK_REGISTRY_TEXTURE_CHEST];
daf085bf8a8c misc: fix build
David Demelier <markand@malikania.fr>
parents: 500
diff changeset
111 chest->animation.delay = CHEST_DELAY;
481
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 chest->action.data = chest;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
113 chest->action.handle = handle;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 chest->action.update = update;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 chest->action.draw = draw;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
116
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
117 return &chest->action;
4b99b760e99c examples: add chest for simplicity
David Demelier <markand@malikania.fr>
parents:
diff changeset
118 }