From d62b8f3ae629540137824e79d33847c21ee50447 Mon Sep 17 00:00:00 2001
From: rswindell <>
Date: Tue, 12 May 2020 09:20:13 +0000
Subject: [PATCH] Use Synchronet mouse hotspots to mouse-enable all the menu
 keys. Uses the new CON_MOUSE_PASSTHRU console status. Also fixed a place or
 two where the mouse could be left disabled after a command or a text input a
 prompt. Use the cached ansiterm_lib.js.

---
 xtrn/minesweeper/minesweeper.js | 64 ++++++++++++++++++++-------------
 1 file changed, 39 insertions(+), 25 deletions(-)

diff --git a/xtrn/minesweeper/minesweeper.js b/xtrn/minesweeper/minesweeper.js
index 2cc0f1cd0b..29d26b4059 100644
--- a/xtrn/minesweeper/minesweeper.js
+++ b/xtrn/minesweeper/minesweeper.js
@@ -84,13 +84,15 @@ var best = null;
 
 log(LOG_DEBUG, title + " options: " + JSON.stringify(options));
 
-var ansi = load({}, 'ansiterm_lib.js');
+var ansiterm = bbs.mods.ansiterm_lib;
+if(!ansiterm)
+	ansiterm = bbs.mods.ansiterm_lib = load({}, "ansiterm_lib.js");
 
 function mouse_enable(enable)
 {
 	if(console.term_supports(USER_ANSI)) {
-		ansi.send('mouse', enable ? 'set' : 'clear', 'x10_compatible');
-		ansi.send('mouse', enable ? 'set' : 'clear', 'extended_coord');
+		ansiterm.send('mouse', enable ? 'set' : 'clear', 'x10_compatible');
+		ansiterm.send('mouse', enable ? 'set' : 'clear', 'extended_coord');
 	}
 }
 
@@ -641,28 +643,29 @@ function draw_board(full)
 	var cmds = "";
 	if(gameover) {
 		if(!gamewon)
-			cmds += "\x01n\x01hD\x01nisplay  ";
+			cmds += "\x01n\x01h\x01~D\x01nisplay  ";
 	} else {
 		if(!board[selected.y][selected.x].covered) {
 			if(can_chord(selected.x, selected.y))
-				cmds += "\x01h\x01kDig  \x01n\x01hC\x01nhord  ";
+				cmds += "\x01h\x01k\x01~Dig  \x01n\x01h\x01~C\x01nhord  ";
 			else
-				cmds += "\x01h\x01kDig  Flag  ";
+				cmds += "\x01h\x01k\x01~Dig  Flag  ";
 		}
 		else 
-			cmds += "\x01hD\x01nig  \x01hF\x01nlag  ";
+			cmds += "\x01h\x01~D\x01nig  \x01h\x01~F\x01nlag  ";
 	}
-	cmds += "\x01n\x01hN\x01new  \x01hQ\x01nuit";
+	cmds += "\x01n\x01h\x01~N\x01new  \x01h\x01~Q\x01nuit";
 	if(full || cmds !== cmds_shown) {
+		console.clear_hotspots();
 		draw_border();
 		console.attributes = LIGHTGRAY;		
 		console_center(cmds);
 		cmds_shown = cmds;
 		draw_border();
-		cmds = "\x01hW\x01ninners  \x01hL\x01nog  ";
+		cmds = "\x01h\x01~W\x01ninners  \x01h\x01~L\x01nog  ";
 		if(best)
-			cmds += "\x01hB\x01nest  ";
-		cmds += "\x01hH\x01nelp"
+			cmds += "\x01h\x01~B\x01nest  ";
+		cmds += "\x01h\x01~H\x01nelp"
 		console_center(cmds);
 	} else if(!console.term_supports(USER_ANSI)) {
 		console.creturn();
@@ -800,9 +803,13 @@ function get_difficulty(all)
 	console.cleartoeol();
 	draw_border();
 	console.attributes = WHITE;
+	console.clear_hotspots();
+	var lvls = "";
+	for(var i = 1; i <= max_difficulty; i++)
+		lvls += "\x01~" + i;
 	if(all) {
 		console.right((console.screen_columns - 20) / 2);
-		console.print(format("Level (1-%u) [All]: ", max_difficulty));
+		console.print(format("Level (%s) [\x01~All]: ", lvls));
 		var key = console.getkeys("QA", max_difficulty);
 		if(key == 'A')
 			return 0;
@@ -811,7 +818,7 @@ function get_difficulty(all)
 		return key;
 	}
 	console.right((console.screen_columns - 24) / 2);
-	console.print(format("Difficulty Level (1-%u): ", max_difficulty));
+	console.print(format("Difficulty Level (%s): ", lvls));
 	return console.getnum(max_difficulty);
 }
 
@@ -1079,26 +1086,29 @@ function play()
 				break;
 			case 'N':
 			{
-				mouse_enable(false);
 				console.home();
 				console.down(top + 1);
+				full_redraw = true;
 				if(game.start && !gameover) {
 					console.cleartoeol();
 					draw_border();
 					console.attributes = LIGHTRED;
 					console.right((console.screen_columns - 15) / 2);
-					console.print("New Game (Y/N) ?");
-					if(console.getkey(K_UPPER) != 'Y')
+					mouse_enable(false);
+					console.clear_hotspots();
+					console.print("New Game (\x01~Y/\x01~N) ?");
+					var key = console.getkey(K_UPPER);
+					mouse_enable(true);
+					if(key != 'Y')
 						break;
 				}
 				var new_difficulty = get_difficulty();
 				if(new_difficulty > 0)
 					difficulty = init_game(new_difficulty);
-				full_redraw = true;
-				mouse_enable(true);
 				break;
 			}
 			case 'W':
+				full_redraw = true;
 				mouse_enable(false);
 				console.home();
 				console.down(top + 1);
@@ -1109,7 +1119,6 @@ function play()
 					console.pause();
 					console.clear();
 					console.aborted = false;
-					full_redraw = true;
 				}
 				mouse_enable(true);
 				break
@@ -1133,10 +1142,10 @@ function play()
 				mouse_enable(true);
 				break
 			case 'B':
-				mouse_enable(false);
 				if(!best)
 					break;
 				console.line_counter = 0;
+				mouse_enable(false);
 				show_best();
 				console.pause();
 				console.clear();
@@ -1150,6 +1159,7 @@ function play()
 				console.line_counter = 0;
 				console.clear();
 				console.printfile(help_file);
+				console.pause();
 				console.clear();
 				console.aborted = false;
 				full_redraw = true;
@@ -1166,19 +1176,21 @@ function play()
 				selector++;
 				break;
 			case 'Q':
-				mouse_enable(false);
 				if(game.start && !gameover) {
+					full_redraw = true;
 					console.home();
 					console.down(top + 1);
 					console.cleartoeol();
 					draw_border();
 					console.attributes = LIGHTRED;
 					console.right((console.screen_columns - 16) / 2);
-					console.print("Quit Game (Y/N) ?");
-					if(console.getkey(K_UPPER) != 'Y') {
-						mouse_enable(true);
+					mouse_enable(false);
+					console.clear_hotspots();
+					console.print("Quit Game (\x01~Y/\x01~N) ?");
+					var key = console.getkey(K_UPPER);
+					mouse_enable(true);
+					if(key != 'Y')
 						break;
-					}
 				}
 				return;
 		}
@@ -1211,6 +1223,8 @@ try {
 	}
 
 	js.on_exit("console.line_counter = 0");
+	js.on_exit("console.status = " + console.status);
+	console.status |= CON_MOUSE_PASSTHRU;
 	js.on_exit("console.ctrlkey_passthru = " + console.ctrlkey_passthru);
 	console.ctrlkey_passthru = "KOPTUZ";
 
-- 
GitLab