annotate libmlk-adventure/adventure/state/panic.c @ 260:60a214ec1ab4

adventure: change the way states are stored
author David Demelier <markand@malikania.fr>
date Sun, 06 Dec 2020 22:50:48 +0100
parents 16be1ad3ddba
children bfde372bf152
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
259
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
46 struct self {
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
47 struct state state;
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
48
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
49 struct {
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
50 struct texture tex;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
51 int x;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
52 int y;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
53 } texts[4];
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
54 };
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
55
229
e71039d820a7 doc: improve documentation
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
56 static void
95
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
57 die(const char *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 assert(fmt);
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_list ap;
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
62
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
63 va_start(ap, fmt);
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
64 fprintf(stderr, "abort: ");
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
65 vfprintf(stderr, fmt, ap);
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
66 va_end(ap);
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
67 abort();
95
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
68 exit(1);
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
69 }
e82eca4f8606 core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents: 94
diff changeset
70
229
e71039d820a7 doc: improve documentation
David Demelier <markand@malikania.fr>
parents: 227
diff changeset
71 static void
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
72 stop(void)
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
73 {
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
74 die("%s", error());
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
75 }
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
76
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
77 static void
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
78 dump(void)
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
79 {
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
80 FILE *fp;
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
81
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
82 if ((fp = fopen(OUT, "w"))) {
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
83 /* TODO: add more info here. */
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
84 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
85 fclose(fp);
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
86 }
91
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 abort();
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
89 }
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
90
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
91 static void
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
92 handle_keydown(const struct event_key *ev)
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
93 {
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
94 assert(ev);
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
95
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
96 switch (ev->key) {
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
97 case KEY_q:
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
98 game_quit();
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
99 break;
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
100 case KEY_s:
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
101 dump();
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
102 break;
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
103 default:
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
104 break;
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
105 }
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
106 }
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
107
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
108 static void
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
109 start(struct state *state)
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
110 {
259
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
111 struct self *self = state->data;
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
112 struct theme *theme;
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
113 struct font *font;
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
114
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
115 /* We remove the panic handler to avoid infinite recursion. */
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
116 panic_handler = stop;
259
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
117
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
118 theme = theme_default();
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
119 font = theme->fonts[THEME_FONT_INTERFACE];
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
120
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
121 if (!font_render(font, &self->texts[0].tex, "An unrecoverable error occured and the game cannot continue.", FOREGROUND) ||
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
122 !font_render(font, &self->texts[1].tex, "Please report the detailed error as provided below.", FOREGROUND) ||
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
123 !font_render(font, &self->texts[2].tex, "Press <s> to save information and generate a core dump.", FOREGROUND) ||
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
124 !font_render(font, &self->texts[3].tex, "Press <q> to quit without saving information.", FOREGROUND))
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
125 die("%s", error());
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
126
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
127 /* All align x the same. */
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
128 for (size_t i = 0; i < NELEM(self->texts); ++i)
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
129 self->texts[i].x = theme->padding;
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
130
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
131 /* Header (0-1). */
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
132 self->texts[0].y = theme->padding;
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
133 self->texts[1].y = self->texts[0].y + self->texts[0].tex.h + theme->padding;
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
134
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
135 /* Footer. (2-3). */
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
136 self->texts[3].y = window.h - self->texts[2].tex.h - theme->padding;
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
137 self->texts[2].y = self->texts[3].y - self->texts[3].tex.h - theme->padding;
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
138 }
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
139
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
140 static void
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
141 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
142 {
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
143 assert(ev);
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
144
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
145 (void)state;
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
146
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
147 switch (ev->type) {
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
148 case EVENT_KEYDOWN:
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
149 handle_keydown(&ev->key);
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
150 break;
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
151 default:
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
152 break;
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
153 }
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
154 }
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
155
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
156 static void
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
157 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
158 {
259
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
159 struct self *self = state->data;
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
160 struct theme *theme = theme_default();
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
161 struct texture tex;
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 162
diff changeset
162 struct font *font;
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
163 int x, y;
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
164
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
165 painter_set_color(BACKGROUND);
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
166 painter_clear();
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
167
259
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
168 for (size_t i = 0; i < NELEM(self->texts); ++i)
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
169 texture_draw(&self->texts[i].tex, self->texts[i].x, self->texts[i].y);
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
170
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
171 /* The error is only available here. */
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 162
diff changeset
172 font = theme->fonts[THEME_FONT_INTERFACE];
91
8bfb90e85b28 adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents: 89
diff changeset
173
174
6992085d47fd ui: major theme overhaul, closes #2509 @1h
David Demelier <markand@malikania.fr>
parents: 162
diff changeset
174 if (!font_render(font, &tex, error(), FOREGROUND))
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
175 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
176
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
177 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
178
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
179 texture_draw(&tex, x + theme->padding, y);
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
180 texture_finish(&tex);
259
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
181
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
182 painter_present();
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
183 }
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
184
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
185 static void
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
186 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
187 {
259
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
188 struct self *self = state->data;
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
189
259
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
190 for (size_t i = 0; i < NELEM(self->texts); ++i)
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
191 texture_finish(&self->texts[i].tex);
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
192
259
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
193 free(self);
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
194 }
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
195
259
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
196 struct state *
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
197 panic_state_new(void)
162
629f55f3961e core: rework states
David Demelier <markand@malikania.fr>
parents: 148
diff changeset
198 {
259
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
199 struct self *self;
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
200
259
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
201 self = alloc_new0(sizeof (*self));
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
202 self->state.data = self;
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
203 self->state.start = start;
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
204 self->state.handle = handle;
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
205 self->state.draw = draw;
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
206 self->state.finish = finish;
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
207
16be1ad3ddba adventure: start working on maps and teleport
David Demelier <markand@malikania.fr>
parents: 243
diff changeset
208 return &self->state;
89
30baadb6f6a2 core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff changeset
209 }