annotate libmlk-rpg/rpg/teleport.c @ 258:f978fa0137ce

extern: provide libcompat
author David Demelier <markand@malikania.fr>
date Sat, 05 Dec 2020 15:57:02 +0100
parents 71b3b7036de7
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
212
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * teleport.c -- animate and teleport
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
20 #include <string.h>
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
21
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include <core/action.h>
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
23 #include <core/game.h>
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
24 #include <core/painter.h>
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include <core/panic.h>
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include <core/window.h>
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
27
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
28 #include "map.h"
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include "teleport.h"
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
30
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
31 static bool
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
32 update(struct action *act, unsigned int ticks)
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
33 {
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
34 return teleport_update(act->data, ticks);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
35 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
36
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
37 static void
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
38 draw(struct action *act)
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
39 {
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
40 teleport_draw(act->data);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
42
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
43 static void
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
44 finish(struct action *act)
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
45 {
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
46 teleport_finish(act->data);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
47 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
48
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
49 void
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
50 teleport_start(struct teleport *tp)
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
51 {
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 assert(tp);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
53
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 if (!texture_new(&tp->fade, window.w, window.h))
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
55 panic();
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
56
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
57 texture_set_blend_mode(&tp->fade, TEXTURE_BLEND_BLEND);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
58
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
59 PAINTER_BEGIN(&tp->fade);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
60 painter_set_color(0x000000ff);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
61 painter_clear();
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
62 PAINTER_END();
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
63
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
64 tp->elapsed = tp->alpha = 0;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
65 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
66
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
67 bool
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
68 teleport_update(struct teleport *tp, unsigned int ticks)
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
69 {
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
70 assert(tp);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
71
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
72 tp->elapsed += ticks;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
73
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
74 if (tp->elapsed >= 10) {
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 if (tp->alpha >= 255) {
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
76 game_switch(tp->state, false);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 return true;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
78 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
79
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
80 tp->elapsed = 0;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
81 tp->alpha += 5;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
82 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
83
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
84 return false;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
85 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
86
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
87 void
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
88 teleport_draw(struct teleport *tp)
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
89 {
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 texture_set_alpha_mod(&tp->fade, tp->alpha);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 texture_draw(&tp->fade, 0, 0);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
93
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
94 void
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 teleport_finish(struct teleport *tp)
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 {
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
97 assert(tp);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
98
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
99 texture_finish(&tp->fade);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
100 }
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
101
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
102 void
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
103 teleport_action(struct teleport *tp, struct action *act)
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
104 {
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
105 assert(tp && tp->state);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
106 assert(act);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
107
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
108 memset(act, 0, sizeof (*act));
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
109 act->data = tp;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
110 act->update = update;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
111 act->draw = draw;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
112 act->finish = finish;
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
113
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
114 teleport_start(tp);
ddfe0a211169 rpg: experiment with map teleport
David Demelier <markand@malikania.fr>
parents:
diff changeset
115 }