annotate src/core/message.c @ 67:7187c0d9b9c0

core: implement message action, closes #2467
author David Demelier <markand@malikania.fr>
date Mon, 27 Jan 2020 13:04:19 +0100
parents 80a913d25aa9
children 1aec066bcdae
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>
67
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
20 #include <stdlib.h>
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
21 #include <string.h>
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
22
67
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
23 #include "action.h"
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
24 #include "event.h"
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
25 #include "font.h"
28
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
26 #include "message.h"
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
27 #include "painter.h"
783841af4033 core: implement painter API, closes #2451 @1h
David Demelier <markand@malikania.fr>
parents: 24
diff changeset
28 #include "sprite.h"
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
29 #include "texture.h"
67
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
30 #include "util.h"
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
31 #include "window.h"
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
32
65
80a913d25aa9 core: implement script, closes #2465 @2h
David Demelier <markand@malikania.fr>
parents: 64
diff changeset
33 #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
34 #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
35
67
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
36 static void
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
37 action_handle(struct action *action, const union event *ev)
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
38 {
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
39 assert(action);
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
40 assert(ev);
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
41
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
42 message_handle(action->data, ev);
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
43 }
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
44
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
45 static bool
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
46 action_update(struct action *action, unsigned int ticks)
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
47 {
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
48 assert(action);
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
49
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
50 return message_update(action->data, ticks);
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
51 }
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
52
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
53 static void
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
54 action_draw(struct action *action)
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
55 {
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
56 assert(action);
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
57
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
58 message_draw(action->data);
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
59 }
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
60
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
61 static void
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
62 action_finish(struct action *action)
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
63 {
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
64 assert(action);
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
65
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
66 message_finish(action->data);
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
67 free(action->data);
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
68 }
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
69
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
70 static unsigned int
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
71 average(const struct message *msg)
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
72 {
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
73 unsigned int n = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
74 unsigned int total = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
75
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
76 for (int i = 0; i < 6; ++i) {
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
77 if (msg->textures[i]) {
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
78 n += 1;
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
79 total += texture_height(msg->textures[i]);
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
80 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
81 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
82
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
83 return n > 0 ? total / n : 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
84 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
85
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
86 static void
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
87 clear(struct message *msg)
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
88 {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
89 for (unsigned int i = 0; i < 12; ++i) {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
90 if (msg->textures[i]) {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
91 texture_close(msg->textures[i]);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
92 msg->textures[i] = NULL;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
93 }
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
94 }
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
95 }
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
96
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
97 static void
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
98 redraw(struct message *msg)
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
99 {
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
100 clear(msg);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
101
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
102 /* Generate textures if not already done. */
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
103 for (unsigned int i = 0; i < 6; ++i) {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
104 if (!msg->text[i])
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
105 continue;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
106
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
107 /* Normal lines of text. */
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
108 unsigned long color = msg->colors[0];
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
109
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
110 if (msg->flags & MESSAGE_QUESTION && msg->index == i)
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
111 color = msg->colors[1];
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
112
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
113 if (!msg->textures[i])
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
114 msg->textures[i] = font_render(
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
115 msg->font,
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
116 msg->text[i],
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
117 color
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
118 );
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
119 if (!msg->textures[i + 6])
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
120 msg->textures[i + 6] = font_render(
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
121 msg->font,
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
122 msg->text[i],
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
123 0x000000ff
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
124 );
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
125 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
126 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
127
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
128 void
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
129 message_start(struct message *msg)
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 assert(msg);
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
132
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
133 msg->elapsed = 0;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
134 msg->state = MESSAGE_OPENING;
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
135 msg->height[0] = texture_height(msg->frame);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
136 msg->height[1] = 0;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
137
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
138 redraw(msg);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
139 }
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
140
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
141 void
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
142 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
143 {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
144 assert(msg);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
145 assert(ev);
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
146
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
147 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
148 return;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
149
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
150 switch (ev->key.key) {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
151 case KEY_UP:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
152 if (msg->index > 0)
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
153 msg->index--;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
154 break;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
155 case KEY_DOWN:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
156 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
157 msg->index++;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
158 break;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
159 case KEY_ENTER:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
160 msg->state = MESSAGE_HIDING;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
161 msg->elapsed = 0;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
162 break;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
163 default:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
164 break;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
165 }
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
166
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
167 redraw(msg);
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
168 }
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
169
60
7266c750b649 core: simplify message
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
170 bool
46
b815621df3e3 core: remove all fixed width integers, closes #2460
David Demelier <markand@malikania.fr>
parents: 28
diff changeset
171 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
172 {
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 assert(msg);
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 msg->elapsed += ticks;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
176
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
177 switch (msg->state) {
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
178 case MESSAGE_OPENING:
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
179 msg->height[1] += texture_height(msg->frame) * ticks / MESSAGE_SPEED;
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
180
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
181 if (msg->height[1] > msg->height[0])
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
182 msg->height[1] = msg->height[0];
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
183 if (msg->elapsed >= MESSAGE_SPEED) {
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
184 msg->state = MESSAGE_SHOWING;
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
185 msg->elapsed = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
186 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
187
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 break;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
189 case MESSAGE_SHOWING:
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 /* Do automatically switch state if requested by the user. */
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
191 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
192 msg->state = MESSAGE_HIDING;
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
193 msg->elapsed = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
194 }
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
195
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
196 break;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
197 case MESSAGE_HIDING:
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
198 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
199
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
200 if (msg->elapsed >= MESSAGE_SPEED) {
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
201 msg->state = MESSAGE_NONE;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
202 msg->elapsed = 0;
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
203 }
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
204
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
205 break;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
206 default:
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
207 break;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
208 }
60
7266c750b649 core: simplify message
David Demelier <markand@malikania.fr>
parents: 59
diff changeset
209
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
210 return msg->state == MESSAGE_NONE;
24
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_draw(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);
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
217 assert(msg->frame);
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
218
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
219 const unsigned int w = texture_width(msg->frame);
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
220 const unsigned int h = texture_height(msg->frame);
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
221 const unsigned int x = (window_width() / 2) - (w / 2);
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
222 const unsigned int y = 80;
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
223 const unsigned int avgh = average(msg);
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
224 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
225
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
226 switch (msg->state) {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
227 case MESSAGE_OPENING:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
228 case MESSAGE_HIDING:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
229 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
230 break;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
231 case MESSAGE_SHOWING:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
232 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
233
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
234 for (int i = 0; i < 6; ++i) {
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
235 /* TODO: avatar handling */
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
236 const int real_x = x + 20;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
237 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
238
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
239 if (!msg->textures[i])
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
240 continue;
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
241
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
242 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
243 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
244 }
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
245 break;
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
246 default:
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
247 break;
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
248 }
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
249 }
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
250
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
251 void
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
252 message_hide(struct message *msg)
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
253 {
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
254 assert(msg);
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
255
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
256 msg->state = MESSAGE_HIDING;
24
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
257 msg->elapsed = 0;
4a06503641eb core: start basic implementation of dialog, continue #2449 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
258 }
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
259
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
260 void
67
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
261 message_finish(struct message *msg)
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
262 {
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
263 assert(msg);
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
264
64
da9b7462ab92 core: implement question, closes #2464 @2h
David Demelier <markand@malikania.fr>
parents: 62
diff changeset
265 clear(msg);
62
d07acc6ee4d9 core: improve message
David Demelier <markand@malikania.fr>
parents: 60
diff changeset
266 }
67
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
267
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
268 void
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
269 message_action(const struct message *msg, struct action *action)
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
270 {
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
271 assert(msg);
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
272 assert(action);
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
273
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
274 memset(action, 0, sizeof (struct action));
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
275 action->data = ememdup(msg, sizeof (struct message));
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
276 action->handle = action_handle;
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
277 action->update = action_update;
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
278 action->draw = action_draw;
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
279 action->finish = action_finish;
7187c0d9b9c0 core: implement message action, closes #2467
David Demelier <markand@malikania.fr>
parents: 65
diff changeset
280 }