Mercurial > molko
annotate src/adventure/panic_state.c @ 117:445035ace840
core: fix panic handling early
author | David Demelier <markand@malikania.fr> |
---|---|
date | Sat, 03 Oct 2020 19:03:22 +0200 |
parents | c7e993455985 |
children |
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> |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
22 |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
23 #include <error.h> |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
24 #include <event.h> |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
25 #include <font.h> |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
26 #include <game.h> |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
27 #include <painter.h> |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
28 #include <sys.h> |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
29 #include <texture.h> |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
30 #include <util.h> |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
31 #include <window.h> |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
32 #include <map_state.h> |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
33 |
117
445035ace840
core: fix panic handling early
David Demelier <markand@malikania.fr>
parents:
98
diff
changeset
|
34 #include <assets/fonts/Lato-Regular.h> |
445035ace840
core: fix panic handling early
David Demelier <markand@malikania.fr>
parents:
98
diff
changeset
|
35 |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
36 #include "panic_state.h" |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
37 |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
38 #define BACKGROUND 0x4f5070ff |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
39 #define FOREGROUND 0xffffffff |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
40 |
117
445035ace840
core: fix panic handling early
David Demelier <markand@malikania.fr>
parents:
98
diff
changeset
|
41 #define SIZE 16 |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
42 #define PADDING 20 |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
43 |
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 |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
46 struct label { |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
47 const char *text; |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
48 struct texture texture; |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
49 }; |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
50 |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
51 static struct { |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
52 struct font font; |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
53 } data; |
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 static struct label headers[] = { |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
56 { "An unrecoverable error occured and the game cannot continue.", 0 }, |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
57 { "Please report the detailed error as provided below.", 0 }, |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
58 }; |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
59 |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
60 static struct label bottom[] = { |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
61 { "Press <s> to save information and generate a core dump.", 0 }, |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
62 { "Press <q> to quit without saving information.", 0 } |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
63 }; |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
64 |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
65 static struct label lerror; |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
66 |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
67 static void |
95
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
68 die(const char *fmt, ...) |
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 assert(fmt); |
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
71 |
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
72 va_list ap; |
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
73 |
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
74 va_start(ap, fmt); |
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
75 fprintf(stderr, "abort: "); |
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
76 vfprintf(stderr, fmt, ap); |
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
77 va_end(ap); |
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
78 exit(1); |
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
79 } |
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
80 |
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
81 static void |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
82 enter(void) |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
83 { |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
84 } |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
85 |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
86 static void |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
87 dump(void) |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
88 { |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
89 FILE *fp; |
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 if (!(fp = fopen(OUT, "w"))) |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
92 goto dump; |
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 /* Print various information. */ |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
95 fprintf(fp, "Molko's Adventure crash dump report\n"); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
96 fprintf(fp, "== state map dump ==\n"); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
97 fprintf(fp, "map:\n"); |
98
c7e993455985
map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents:
97
diff
changeset
|
98 fprintf(fp, " w %u\n", map_state_data.map.data.w); |
c7e993455985
map: split the map structure into two definitions
David Demelier <markand@malikania.fr>
parents:
97
diff
changeset
|
99 fprintf(fp, " h %u\n", map_state_data.map.data.h); |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
100 fprintf(fp, "player:\n"); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
101 fprintf(fp, " x: %u\n", map_state_data.player.x); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
102 fprintf(fp, " y: %u\n", map_state_data.player.y); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
103 fprintf(fp, "view:\n"); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
104 fprintf(fp, " w: %u\n", map_state_data.view.w); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
105 fprintf(fp, " h: %u\n", map_state_data.view.h); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
106 fprintf(fp, " x: %u\n", map_state_data.view.x); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
107 fprintf(fp, " y: %u\n", map_state_data.view.y); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
108 |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
109 dump: |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
110 if (fp) |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
111 fclose(fp); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
112 |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
113 abort(); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
114 } |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
115 |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
116 static void |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
117 handle_keydown(const struct event_key *ev) |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
118 { |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
119 assert(ev); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
120 |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
121 switch (ev->key) { |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
122 case KEY_q: |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
123 game_quit(); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
124 break; |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
125 case KEY_s: |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
126 dump(); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
127 break; |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
128 default: |
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 } |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
131 } |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
132 |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
133 static void |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
134 handle(const union event *ev) |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
135 { |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
136 assert(ev); |
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 switch (ev->type) { |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
139 case EVENT_KEYDOWN: |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
140 handle_keydown(&ev->key); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
141 break; |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
142 default: |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
143 break; |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
144 } |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
145 } |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
146 |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
147 static void |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
148 generate(struct label labels[], size_t labelsz) |
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(labels); |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
151 |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
152 for (size_t i = 0; i < labelsz; ++i) { |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
153 if (texture_ok(&labels[i].texture)) |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
154 continue; |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
155 |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
156 data.font.color = FOREGROUND; |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
157 font_render(&data.font, &labels[i].texture, labels[i].text); |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
158 |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
159 if (!texture_ok(&labels[i].texture)) |
95
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
160 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
|
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 |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
164 static void |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
165 update(unsigned int ticks) |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
166 { |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
167 (void)ticks; |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
168 |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
169 lerror.text = error(); |
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
170 |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
171 generate(headers, NELEM(headers)); |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
172 generate(&lerror, 1); |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
173 generate(bottom, NELEM(bottom)); |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
174 } |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
175 |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
176 static void |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
177 draw(void) |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
178 { |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
179 int y = PADDING; |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
180 |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
181 painter_set_target(NULL); |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
182 painter_set_color(BACKGROUND); |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
183 painter_clear(); |
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 /* Header. */ |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
186 for (size_t i = 0; i < NELEM(headers); ++i) { |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
187 texture_draw(&headers[i].texture, PADDING, y); |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
188 y += headers[i].texture.h + 2; |
89
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 |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
191 /* Error message. */ |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
192 texture_draw(&lerror.texture, PADDING, y + PADDING); |
91
8bfb90e85b28
adventure: add more details in panic
David Demelier <markand@malikania.fr>
parents:
89
diff
changeset
|
193 |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
194 /* Bottom. */ |
97
58133933ea17
window: expose some data to avoid functions
David Demelier <markand@malikania.fr>
parents:
95
diff
changeset
|
195 y = window.h - PADDING; |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
196 y -= bottom[0].texture.h; |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
197 |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
198 for (size_t i = 0; i < NELEM(bottom); ++i) { |
94
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
199 texture_draw(&bottom[i].texture, PADDING, y); |
ed72843a7194
core: simplify font/texture interfaces
David Demelier <markand@malikania.fr>
parents:
91
diff
changeset
|
200 y -= bottom[i].texture.h + 2; |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
201 } |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
202 } |
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 static void |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
205 leave(void) |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
206 { |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
207 } |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
208 |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
209 struct state panic_state = { |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
210 .enter = enter, |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
211 .handle = handle, |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
212 .update = update, |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
213 .draw = draw, |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
214 .leave = leave |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
215 }; |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
216 |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
217 void |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
218 panic_state_init(void) |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
219 { |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
220 /* |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
221 * If the panic state can not be loaded we're unable to show any |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
222 * useful information to the screen so as last resort print them |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
223 * on the console. |
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
224 */ |
117
445035ace840
core: fix panic handling early
David Demelier <markand@malikania.fr>
parents:
98
diff
changeset
|
225 if (!(font_openmem(&data.font, Lato_Regular, sizeof (Lato_Regular), SIZE))) |
95
e82eca4f8606
core: simplify error/panic routines
David Demelier <markand@malikania.fr>
parents:
94
diff
changeset
|
226 die("%s", error()); |
89
30baadb6f6a2
core: add a panic_state in the adventure, continue #2484 @2h
David Demelier <markand@malikania.fr>
parents:
diff
changeset
|
227 } |