chiark / gitweb /
Range: add pencil marks to squares by Shift-cursor keys.
authorJonas Kölker <jonaskoelker@yahoo.com>
Mon, 21 Sep 2015 15:39:47 +0000 (17:39 +0200)
committerSimon Tatham <anakin@pobox.com>
Sat, 3 Oct 2015 15:58:50 +0000 (16:58 +0100)
puzzles.but
range.c

index ef96ad18c6f982028589259bf8559e83cb56e2d1..e22c438c000d197ba3c80da9c05ebad9d73930df 100644 (file)
@@ -2917,7 +2917,9 @@ dotted or empty) in opposite directions.
 
 You can also use the cursor keys to move around the grid squares.
 Pressing Return does the same as clicking with the left button, while
-pressing Space does the same as a right button click.
+pressing Space does the same as a right button click.  Moving with the
+cursor keys while holding Shift will place dots in all squares that
+are moved through.
 
 (All the actions described in \k{common-actions} are also available.)
 
diff --git a/range.c b/range.c
index 4347f7697d1c25f84ca0d3322ffe49e57c35c7e2..f2ea1b77f5124b1bfdc31c5313af220ed3237fd7 100644 (file)
--- a/range.c
+++ b/range.c
@@ -1273,6 +1273,8 @@ static char *interpret_move(const game_state *state, game_ui *ui,
     enum {none, forwards, backwards, hint};
     int const w = state->params.w, h = state->params.h;
     int r = ui->r, c = ui->c, action = none, cell;
+    int shift = button & MOD_SHFT;
+    button &= ~shift;
 
     if (IS_CURSOR_SELECT(button) && !ui->cursor_show) return NULL;
 
@@ -1330,7 +1332,36 @@ static char *interpret_move(const game_state *state, game_ui *ui,
             int i;
             for (i = 0; i < 4 && cursors[i] != button; ++i);
             assert (i < 4);
-            if (!out_of_bounds(ui->r + dr[i], ui->c + dc[i], w, h)) {
+            if (shift) {
+                int pre_r = r, pre_c = c, do_pre, do_post;
+                cell = state->grid[idx(r, c, state->params.w)];
+                do_pre = (cell == EMPTY);
+
+                if (out_of_bounds(ui->r + dr[i], ui->c + dc[i], w, h)) {
+                    if (do_pre)
+                        return nfmtstr(40, "W,%d,%d", pre_r, pre_c);
+                    else
+                        return NULL;
+                }
+
+                ui->r += dr[i];
+                ui->c += dc[i];
+
+                cell = state->grid[idx(ui->r, ui->c, state->params.w)];
+                do_post = (cell == EMPTY);
+
+                /* (do_pre ? "..." : "") concat (do_post ? "..." : "") */
+                if (do_pre && do_post)
+                    return nfmtstr(80, "W,%d,%dW,%d,%d",
+                                   pre_r, pre_c, ui->r, ui->c);
+                else if (do_pre)
+                    return nfmtstr(40, "W,%d,%d", pre_r, pre_c);
+                else if (do_post)
+                    return nfmtstr(40, "W,%d,%d", ui->r, ui->c);
+                else
+                    return "";
+
+            } else if (!out_of_bounds(ui->r + dr[i], ui->c + dc[i], w, h)) {
                 ui->r += dr[i];
                 ui->c += dc[i];
             }