annotate libmlk-adventure/adventure/state/panic.c @ 243:71b3b7036de7

misc: lot of cleanups, - prefix libraries with libmlk, - move assets from source directories closes #2520, - prefix header guards closes #2519
author David Demelier <markand@malikania.fr>
date Sat, 28 Nov 2020 22:37:30 +0100
parents libadventure/adventure/state/panic.c@e71039d820a7
children 16be1ad3ddba
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
1 /*
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
2 * panic_state.c -- panic state
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
3 *
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
4 * Copyright (c) 2020 David Demelier <markand@malikania.fr>
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
5 *
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
6 * Permission to use, copy, modify, and/or distribute this software for any
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
7 * purpose with or without fee is hereby granted, provided that the above
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
8 * copyright notice and this permission notice appear in all copies.
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
9 *
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
10 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
11 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
12 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
13 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
14 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
15 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
16 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
17 */
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
18
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
19 #include <assert.h>
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
20 #include <stdio.h>
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
21 #include <stdlib.h>
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
22 #include <string.h>
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
23
182
f6497ec74b49 core: add alloc module, closes #2512
David Demelier <markand@malikania.fr>
parents: 174
diff changeset
24 #include <core/alloc.h>
121
789b23e01f52 misc: reorganize hierarchy, closes #2490
David Demelier <markand@malikania.fr>
parents: 117
diff changeset
25 #include <core/error.h>
789b23e01f52 misc: reorganize hierarchy, closes #2490
David Demelier <markand@malikania.fr>
parents: 117
diff changeset
26 #include <core/event.h>
789b23e01f52 misc: reorganize hierarchy, closes #2490
David Demelier <markand@malikania.fr>
parents: 117
diff changeset
27 #include <core/font.h>
789b23e01f52 misc: reorganize hierarchy, closes #2490
David Demelier <markand@malikania.fr>
parents: 117
diff changeset
28 #include <core/game.h>
789b23e01f52 misc: reorganize hierarchy, closes #2490
David Demelier <markand@malikania.fr>
parents: 117
diff changeset
29 #include <core/painter.h>
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
30 #include <core/panic.h>
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
31 #include <core/state.h>
121
789b23e01f52 misc: reorganize hierarchy, closes #2490
David Demelier <markand@malikania.fr>
parents: 117
diff changeset
32 #include <core/sys.h>
789b23e01f52 misc: reorganize hierarchy, closes #2490
David Demelier <markand@malikania.fr>
parents: 117
diff changeset
33 #include <core/texture.h>
789b23e01f52 misc: reorganize hierarchy, closes #2490
David Demelier <markand@malikania.fr>
parents: 117
diff changeset
34 #include <core/window.h>
148
c577c15df07f misc: split libraries, closes #2496
David Demelier <markand@malikania.fr>
parents: 135
diff changeset
35
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
36 #include <ui/align.h>
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
37 #include <ui/theme.h>
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
38
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
39 #include "panic.h"
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
40
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
41 #define BACKGROUND 0x4f5070ff
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
42 #define FOREGROUND 0xffffffff
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
43
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
44 #define OUT "molko-adventure.txt"
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
45
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
46 struct view {
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
47 struct {
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
48 struct texture tex;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
49 int x;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
50 int y;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
51 } texts[4];
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
52 };
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
53
229
e71039d820a7 doc: improve documentation
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
54 static void
95
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
55 die(const char *fmt, ...)
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
56 {
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
57 assert(fmt);
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
58
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
59 va_list ap;
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
60
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
61 va_start(ap, fmt);
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
62 fprintf(stderr, "abort: ");
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
63 vfprintf(stderr, fmt, ap);
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
64 va_end(ap);
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
65 abort();
95
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
66 exit(1);
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
67 }
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
68
229
e71039d820a7 doc: improve documentation
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
69 static void
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
70 stop(void)
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
71 {
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
72 die("%s", error());
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 }
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
74
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 static void
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
76 dump(void)
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
77 {
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
78 FILE *fp;
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
79
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
80 if ((fp = fopen(OUT, "w"))) {
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
81 /* TODO: add more info here. */
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
82 fprintf(fp, "Molko's Adventure crash dump report\n");
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
83 fclose(fp);
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
84 }
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
85
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
86 abort();
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
87 }
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
88
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
89 static struct view *
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
90 init(void)
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
91 {
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
92 struct theme *theme;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
93 struct view *view;
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 162
diff changeset
94 struct font *font;
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
95
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
96 theme = theme_default();
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 162
diff changeset
97 font = theme->fonts[THEME_FONT_INTERFACE];
227
befa2e855d3b core: reinterface the alloc module
David Demelier <markand@malikania.fr>
parents: 197
diff changeset
98 view = alloc_new0(sizeof (*view));
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
99
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 162
diff changeset
100 if (!font_render(font, &view->texts[0].tex, "An unrecoverable error occured and the game cannot continue.", FOREGROUND) ||
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 162
diff changeset
101 !font_render(font, &view->texts[1].tex, "Please report the detailed error as provided below.", FOREGROUND) ||
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 162
diff changeset
102 !font_render(font, &view->texts[2].tex, "Press <s> to save information and generate a core dump.", FOREGROUND) ||
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 162
diff changeset
103 !font_render(font, &view->texts[3].tex, "Press <q> to quit without saving information.", FOREGROUND))
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
104 die("%s", error());
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
105
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
106 /* All align x the same. */
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
107 for (size_t i = 0; i < NELEM(view->texts); ++i)
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
108 view->texts[i].x = theme->padding;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
109
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
110 /* Header (0-1). */
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
111 view->texts[0].y = theme->padding;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
112 view->texts[1].y = view->texts[0].y + view->texts[0].tex.h + theme->padding;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
113
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
114 /* Footer. (2-3). */
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
115 view->texts[3].y = window.h - view->texts[2].tex.h - theme->padding;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
116 view->texts[2].y = view->texts[3].y - view->texts[3].tex.h - theme->padding;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
117
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
118 return view;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
119 }
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
120
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
121 static void
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
122 handle_keydown(const struct event_key *ev)
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
123 {
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
124 assert(ev);
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
125
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
126 switch (ev->key) {
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
127 case KEY_q:
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
128 game_quit();
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
129 break;
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
130 case KEY_s:
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
131 dump();
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
132 break;
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
133 default:
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
134 break;
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
135 }
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
136 }
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
137
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
138 static void
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
139 start(struct state *state)
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
140 {
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
141 (void)state;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
142
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
143 /* We remove the panic handler to avoid infinite recursion. */
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
144 panic_handler = stop;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
145 }
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
146
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
147 static void
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
148 handle(struct state *state, const union event *ev)
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
149 {
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
150 assert(ev);
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
151
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
152 (void)state;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
153
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
154 switch (ev->type) {
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
155 case EVENT_KEYDOWN:
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
156 handle_keydown(&ev->key);
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
157 break;
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
158 default:
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
159 break;
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
160 }
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
161 }
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
162
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
163 static void
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
164 draw(struct state *state)
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 {
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
166 struct theme *theme = theme_default();
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
167 struct view *view = state->data;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
168 struct texture tex;
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 162
diff changeset
169 struct font *font;
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
170 int x, y;
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
171
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
172 painter_set_color(BACKGROUND);
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
173 painter_clear();
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
174
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
175 for (size_t i = 0; i < NELEM(view->texts); ++i)
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
176 texture_draw(&view->texts[i].tex, view->texts[i].x, view->texts[i].y);
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
177
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
178 /* The error is only available here. */
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 162
diff changeset
179 font = theme->fonts[THEME_FONT_INTERFACE];
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
180
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 162
diff changeset
181 if (!font_render(font, &tex, error(), FOREGROUND))
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
182 die("%s\n", error());
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
184 align(ALIGN_LEFT, &x, &y, tex.w, tex.h, 0, 0, window.w, window.h);
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
185
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
186 texture_draw(&tex, x + theme->padding, y);
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
187 texture_finish(&tex);
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
188 }
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
189
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
190 static void
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
191 finish(struct state *state)
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
192 {
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
193 struct view *view = state->data;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
194
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
195 if (!view)
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
196 return;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
197
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
198 for (size_t i = 0; i < NELEM(view->texts); ++i)
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
199 texture_finish(&view->texts[i].tex);
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
200
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
201 free(view);
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
202 memset(state, 0, sizeof (*state));
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
203 }
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
204
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
205 void
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
206 panic_state(struct state *state)
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
207 {
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
208 assert(state);
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
209
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
210 memset(state, 0, sizeof (*state));
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
211 state->data = init();
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
212 state->start = start;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
213 state->handle = handle;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
214 state->draw = draw;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
215 state->finish = finish;
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
216 }