chiark / gitweb /
Tents: mark squares as non-tents with {Shift,Control}-cursor keys.
authorJonas Kölker <jonaskoelker@yahoo.com>
Mon, 19 Oct 2015 00:48:39 +0000 (02:48 +0200)
committerSimon Tatham <anakin@pobox.com>
Wed, 21 Oct 2015 21:34:12 +0000 (22:34 +0100)
puzzles.but
tents.c

index 7e8eeacb92ec8a703854af8156aff5ec53b6b256..6b39630a93eeaf822a34a46e058b5c880bd181c0 100644 (file)
@@ -2110,7 +2110,9 @@ remainder of a row once you have placed all its tents.)
 You can also use the cursor keys to move around the grid. Pressing the
 return key over an empty square will place a tent, and pressing the
 space bar over an empty square will colour it green; either key will
-clear an occupied square.
+clear an occupied square.  Holding Shift and pressing the cursor keys
+will colour empty squares green.  Holding Control and pressing the
+cursor keys will colour green both empty squares and squares with tents.
 
 (All the actions described in \k{common-actions} are also available.)
 
diff --git a/tents.c b/tents.c
index 0d1483975b846fe8f825c7592a669bd1dc83950a..859b13eae50beb452033bac556999445c70a5e39 100644 (file)
--- a/tents.c
+++ b/tents.c
@@ -1544,6 +1544,9 @@ static char *interpret_move(const game_state *state, game_ui *ui,
 {
     int w = state->p.w, h = state->p.h;
     char tmpbuf[80];
+    int shift = button & MOD_SHFT, control = button & MOD_CTRL;
+
+    button &= ~MOD_MASK;
 
     if (button == LEFT_BUTTON || button == RIGHT_BUTTON) {
         x = FROMCOORD(x);
@@ -1640,8 +1643,26 @@ static char *interpret_move(const game_state *state, game_ui *ui,
     }
 
     if (IS_CURSOR_MOVE(button)) {
-        move_cursor(button, &ui->cx, &ui->cy, w, h, 0);
         ui->cdisp = 1;
+        if (shift || control) {
+            int len = 0, i, indices[2];
+            indices[0] = ui->cx + w * ui->cy;
+            move_cursor(button, &ui->cx, &ui->cy, w, h, 0);
+            indices[1] = ui->cx + w * ui->cy;
+
+            /* NONTENTify all unique traversed eligible squares */
+            for (i = 0; i <= (indices[0] != indices[1]); ++i)
+                if (state->grid[indices[i]] == BLANK ||
+                    (control && state->grid[indices[i]] == TENT)) {
+                    len += sprintf(tmpbuf + len, "%sN%d,%d", len ? ";" : "",
+                                   indices[i] % w, indices[i] / w);
+                    assert(len < lenof(tmpbuf));
+                }
+
+            tmpbuf[len] = '\0';
+            if (len) return dupstr(tmpbuf);
+        } else
+            move_cursor(button, &ui->cx, &ui->cy, w, h, 0);
         return "";
     }
     if (ui->cdisp) {