annotate src/core/message.c @ 65:80a913d25aa9

core: implement script, closes #2465 @2h
author David Demelier <markand@malikania.fr>
date Mon, 27 Jan 2020 12:24:20 +0100
parents da9b7462ab92
children 7187c0d9b9c0
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * message.c -- message dialog
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
19 #include <assert.h>
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
20
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
21 #include "event.h"
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22 #include "font.h"
28
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
23 #include "message.h"
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
24 #include "painter.h"
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
25 #include "sprite.h"
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
26 #include "texture.h"
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
27 #include "window.h"
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
28
65
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents: 64
diff changeset
29 #define MESSAGE_SPEED 200 /* Time delay for animations */
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
30 #define MESSAGE_TIMEOUT 5000 /* Time for auto-closing */
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
31
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
32 static unsigned int
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
33 average(const struct message *msg)
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
34 {
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
35 unsigned int n = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
36 unsigned int total = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
37
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
38 for (int i = 0; i < 6; ++i) {
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
39 if (msg->textures[i]) {
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
40 n += 1;
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
41 total += texture_height(msg->textures[i]);
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
42 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
43 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
44
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
45 return n > 0 ? total / n : 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
46 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
47
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
48 static void
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
49 clear(struct message *msg)
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
50 {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
51 for (unsigned int i = 0; i < 12; ++i) {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
52 if (msg->textures[i]) {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
53 texture_close(msg->textures[i]);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
54 msg->textures[i] = NULL;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
55 }
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
56 }
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
57 }
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
58
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
59 static void
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
60 redraw(struct message *msg)
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
61 {
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
62 clear(msg);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
63
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
64 /* Generate textures if not already done. */
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
65 for (unsigned int i = 0; i < 6; ++i) {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
66 if (!msg->text[i])
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
67 continue;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
68
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
69 /* Normal lines of text. */
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
70 unsigned long color = msg->colors[0];
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
71
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
72 if (msg->flags & MESSAGE_QUESTION && msg->index == i)
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
73 color = msg->colors[1];
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
74
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
75 if (!msg->textures[i])
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
76 msg->textures[i] = font_render(
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
77 msg->font,
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
78 msg->text[i],
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
79 color
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
80 );
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
81 if (!msg->textures[i + 6])
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
82 msg->textures[i + 6] = font_render(
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
83 msg->font,
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
84 msg->text[i],
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
85 0x000000ff
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
86 );
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
87 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
88 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
89
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
90 void
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
91 message_start(struct message *msg)
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
92 {
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
93 assert(msg);
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
94
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
95 msg->elapsed = 0;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
96 msg->state = MESSAGE_OPENING;
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
97 msg->height[0] = texture_height(msg->frame);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
98 msg->height[1] = 0;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
99
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
100 redraw(msg);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
101 }
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
102
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
103 void
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
104 message_handle(struct message *msg, const union event *ev)
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
105 {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
106 assert(msg);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
107 assert(ev);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
108
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
109 if (ev->type != EVENT_KEYDOWN || msg->state == MESSAGE_NONE)
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
110 return;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
111
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
112 switch (ev->key.key) {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
113 case KEY_UP:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
114 if (msg->index > 0)
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
115 msg->index--;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
116 break;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
117 case KEY_DOWN:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
118 if (msg->index < 5 && msg->text[msg->index + 1])
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
119 msg->index++;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
120 break;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
121 case KEY_ENTER:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
122 msg->state = MESSAGE_HIDING;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
123 msg->elapsed = 0;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
124 break;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
125 default:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
126 break;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
127 }
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
128
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
129 redraw(msg);
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
130 }
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
131
60
7266c750b649 core: simplify message
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
132 bool
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
133 message_update(struct message *msg, unsigned int ticks)
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 {
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
135 assert(msg);
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
136
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
137 msg->elapsed += ticks;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
138
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
139 switch (msg->state) {
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
140 case MESSAGE_OPENING:
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
141 msg->height[1] += texture_height(msg->frame) * ticks / MESSAGE_SPEED;
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
142
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
143 if (msg->height[1] > msg->height[0])
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
144 msg->height[1] = msg->height[0];
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
145 if (msg->elapsed >= MESSAGE_SPEED) {
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
146 msg->state = MESSAGE_SHOWING;
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
147 msg->elapsed = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
148 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
149
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
150 break;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
151 case MESSAGE_SHOWING:
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
152 /* Do automatically switch state if requested by the user. */
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
153 if (msg->flags & MESSAGE_AUTOMATIC && msg->elapsed >= MESSAGE_TIMEOUT) {
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 msg->state = MESSAGE_HIDING;
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
155 msg->elapsed = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
156 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
157
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
158 break;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
159 case MESSAGE_HIDING:
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
160 msg->height[1] -= texture_height(msg->frame) * ticks / MESSAGE_SPEED;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
161
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
162 if (msg->elapsed >= MESSAGE_SPEED) {
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
163 msg->state = MESSAGE_NONE;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
164 msg->elapsed = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
165 }
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
166
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
167 break;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 default:
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
169 break;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170 }
60
7266c750b649 core: simplify message
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
171
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
172 return msg->state == MESSAGE_NONE;
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 }
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
174
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
175 void
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
176 message_draw(struct message *msg)
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 {
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 assert(msg);
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
179 assert(msg->frame);
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
180
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
181 const unsigned int w = texture_width(msg->frame);
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
182 const unsigned int h = texture_height(msg->frame);
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
183 const unsigned int x = (window_width() / 2) - (w / 2);
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
184 const unsigned int y = 80;
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
185 const unsigned int avgh = average(msg);
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
186 const unsigned int gapy = (h - (avgh * 6)) / 7;
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
187
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
188 switch (msg->state) {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
189 case MESSAGE_OPENING:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
190 case MESSAGE_HIDING:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
191 texture_draw_ex(msg->frame, 0, 0, w, msg->height[1], x, y, w, msg->height[1], 0);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
192 break;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
193 case MESSAGE_SHOWING:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
194 texture_draw(msg->frame, x, y);
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
195
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
196 for (int i = 0; i < 6; ++i) {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
197 /* TODO: avatar handling */
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
198 const int real_x = x + 20;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
199 const int real_y = y + ((i + 1) * gapy) + (i * avgh);
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
200
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
201 if (!msg->textures[i])
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
202 continue;
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
203
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
204 texture_draw(msg->textures[i + 6], real_x + 2, real_y + 2);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
205 texture_draw(msg->textures[i], real_x, real_y);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
206 }
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
207 break;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
208 default:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
209 break;
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
210 }
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
211 }
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
212
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
213 void
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
214 message_hide(struct message *msg)
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
215 {
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 assert(msg);
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
217
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
218 msg->state = MESSAGE_HIDING;
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
219 msg->elapsed = 0;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
220 }
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
221
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
222 void
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
223 message_close(struct message *msg)
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
224 {
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
225 assert(msg);
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
226
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
227 clear(msg);
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
228 }