changeset 91:8bfb90e85b28

adventure: add more details in panic
author David Demelier <markand@malikania.fr>
date Sat, 21 Mar 2020 14:39:43 +0100
parents a6d6497adb60
children cccbea0d0ff1
files src/adventure/main.c src/adventure/panic_state.c
diffstat 2 files changed, 99 insertions(+), 13 deletions(-) [+]
line wrap: on
line diff
--- a/src/adventure/main.c	Thu Mar 12 20:31:50 2020 +0100
+++ b/src/adventure/main.c	Sat Mar 21 14:39:43 2020 +0100
@@ -78,6 +78,7 @@
 	struct clock clock;
 	struct font *font;
 	struct texture *frame;
+	int panic_trigger = 0;
 
 	if (!(font = font_openf(sys_datapath("fonts/DejaVuSans.ttf"), 15)))
 		error_fatal();
@@ -99,8 +100,16 @@
 			/* TODO: this must be handled by states. */
 			if (ev.type == EVENT_QUIT)
 				return;
-			if (ev.type == EVENT_KEYDOWN)
-				panic("test");
+
+			/*
+			 * TODO: user panic request.
+			 */
+			if (game.state != &panic_state &&
+			    ev.type == EVENT_KEYDOWN &&
+			    ev.key.key == KEY_F12) {
+				if (++panic_trigger == 3)
+					panic("User panic request.");
+			}
 
 			game_handle(&ev);
 		}
--- a/src/adventure/panic_state.c	Thu Mar 12 20:31:50 2020 +0100
+++ b/src/adventure/panic_state.c	Sat Mar 21 14:39:43 2020 +0100
@@ -16,13 +16,20 @@
  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  */
 
+#include <assert.h>
+#include <stdio.h>
+#include <stdlib.h>
+
 #include <error.h>
+#include <event.h>
 #include <font.h>
+#include <game.h>
 #include <painter.h>
 #include <sys.h>
 #include <texture.h>
 #include <util.h>
 #include <window.h>
+#include <map_state.h>
 
 #include "panic_state.h"
 
@@ -32,6 +39,10 @@
 #define FONT "fonts/Lato-Regular.ttf"
 #define FONT_SZ 16
 
+#define PADDING 20
+
+#define OUT "molko-adventure.txt"
+
 struct label {
 	const char *text;
 	struct texture *texture;
@@ -51,27 +62,87 @@
 	{ "Press <q> to quit without saving information.", NULL }
 };
 
+static struct label lerror;
+
 static void
 enter(void)
 {
 }
 
 static void
+dump(void)
+{
+	FILE *fp;
+
+	if (!(fp = fopen(OUT, "w")))
+		goto dump;
+
+	/* Print various information. */
+	fprintf(fp, "Molko's Adventure crash dump report\n");
+	fprintf(fp, "== state map dump ==\n");
+	fprintf(fp, "map:\n");
+	fprintf(fp, "  w     %u\n", map_state_data.map.w);
+	fprintf(fp, "  h     %u\n", map_state_data.map.h);
+	fprintf(fp, "player:\n");
+	fprintf(fp, "  x:    %u\n", map_state_data.player.x);
+	fprintf(fp, "  y:    %u\n", map_state_data.player.y);
+	fprintf(fp, "view:\n");
+	fprintf(fp, "  w:    %u\n", map_state_data.view.w);
+	fprintf(fp, "  h:    %u\n", map_state_data.view.h);
+	fprintf(fp, "  x:    %u\n", map_state_data.view.x);
+	fprintf(fp, "  y:    %u\n", map_state_data.view.y);
+
+dump:
+	if (fp)
+		fclose(fp);
+
+	abort();
+}
+
+static void
+handle_keydown(const struct event_key *ev)
+{
+	assert(ev);
+
+	switch (ev->key) {
+	case KEY_q:
+		game_quit();
+		break;
+	case KEY_s:
+		dump();
+		break;
+	default:
+		break;
+	}
+}
+
+static void
 handle(const union event *ev)
 {
-	(void)ev;
+	assert(ev);
+
+	switch (ev->type) {
+	case EVENT_KEYDOWN:
+		handle_keydown(&ev->key);
+		break;
+	default:
+		break;
+	}
 }
 
 static void
 generate(struct label labels[], size_t labelsz)
 {
-	for (size_t i = 0; i < labelsz; ++i) {
-		if (!labels[i].texture) {
-			labels[i].texture = font_render(data.font, labels[i].text, FOREGROUND);
+	assert(labels);
 
-			if (!labels[i].texture)
-				error_fatal();
-		}
+	for (size_t i = 0; i < labelsz; ++i) {
+		if (labels[i].texture)
+			continue;
+
+		labels[i].texture = font_render(data.font, labels[i].text, FOREGROUND);
+
+		if (!labels[i].texture)
+			error_fatal();
 	}
 }
 
@@ -80,14 +151,17 @@
 {
 	(void)ticks;
 
+	lerror.text = error();
+
 	generate(headers, NELEM(headers));
+	generate(&lerror, 1);
 	generate(bottom, NELEM(bottom));
 }
 
 static void
 draw(void)
 {
-	int y = 10;
+	int y = PADDING;
 
 	painter_set_target(NULL);
 	painter_set_color(BACKGROUND);
@@ -95,16 +169,19 @@
 
 	/* Header. */
 	for (size_t i = 0; i < NELEM(headers); ++i) {
-		texture_draw(headers[i].texture, 10, y);
+		texture_draw(headers[i].texture, PADDING, y);
 		y += texture_height(headers[i].texture) + 2;
 	}
 
+	/* Error message. */
+	texture_draw(lerror.texture, PADDING, y + PADDING);
+
 	/* Bottom. */
-	y = window_height() - 10;
+	y = window_height() - PADDING;
 	y -= texture_height(bottom[0].texture);
 
 	for (size_t i = 0; i < NELEM(bottom); ++i) {
-		texture_draw(bottom[i].texture, 10, y);
+		texture_draw(bottom[i].texture, PADDING, y);
 		y -= texture_height(bottom[i].texture) + 2;
 	}
 }