shithub: puzzles

Download patch

ref: ac36314b021854a642593be87a99cad9b04333a5
parent: 2ec5a51c35c12b861eacd2e4566ba786c1270803
author: Simon Tatham <anakin@pobox.com>
date: Sun Jul 10 05:27:08 EDT 2005

Subtle UI change to Mines. Although I mostly find the unified left-
button interface (same button to open a closed square or to clear
around an open one) to be a massive help, there is one circumstance
in which it frequently kills me: if I click down on an open square I
want to clear around, then the mouse pointer accidentally drifts
over on to the nearest closed square before I release, I'll end up
opening that square instead and (usually) dying. So this checkin
causes Mines to note which type of square I left-clicked on, and to
do nothing if the button release is on the other type.

[originally from svn r6086]

--- a/mines.c
+++ b/mines.c
@@ -2334,6 +2334,7 @@
 
 struct game_ui {
     int hx, hy, hradius;	       /* for mouse-down highlights */
+    int validradius;
     int flash_is_death;
     int deaths;
 };
@@ -2342,7 +2343,7 @@
 {
     game_ui *ui = snew(game_ui);
     ui->hx = ui->hy = -1;
-    ui->hradius = 0;
+    ui->hradius = ui->validradius = 0;
     ui->deaths = 0;
     ui->flash_is_death = FALSE;	       /* *shrug* */
     return ui;
@@ -2416,6 +2417,10 @@
 	ui->hx = cx;
 	ui->hy = cy;
 	ui->hradius = (from->grid[cy*from->w+cx] >= 0 ? 1 : 0);
+	if (button == LEFT_BUTTON)
+	    ui->validradius = ui->hradius;
+	else if (button == MIDDLE_BUTTON)
+	    ui->validradius = 1;
 	return "";
     }
 
@@ -2456,7 +2461,8 @@
 	 */
 	if (button == LEFT_RELEASE &&
 	    (from->grid[cy * from->w + cx] == -2 ||
-	     from->grid[cy * from->w + cx] == -3)) {
+	     from->grid[cy * from->w + cx] == -3) &&
+	    ui->validradius == 0) {
 	    /* Check if you've killed yourself. */
 	    if (from->layout->mines && from->layout->mines[cy * from->w + cx])
 		ui->deaths++;
@@ -2471,7 +2477,7 @@
 	 * surrounding the tile is equal to its mine count, and if
 	 * so then we open all other surrounding squares.
 	 */
-	if (from->grid[cy * from->w + cx] > 0) {
+	if (from->grid[cy * from->w + cx] > 0 && ui->validradius == 1) {
 	    int dy, dx, n;
 
 	    /* Count mine markers. */