chiark / gitweb /
Patches from Frode Austvik to modify the effects of the mouse
authorSimon Tatham <anakin@pobox.com>
Thu, 17 Dec 2009 18:16:42 +0000 (18:16 +0000)
committerSimon Tatham <anakin@pobox.com>
Thu, 17 Dec 2009 18:16:42 +0000 (18:16 +0000)
buttons in several games if STYLUS_BASED is defined: in games where
you can set a puzzle element to 'on', 'off' or 'not yet set', when
it's hard to mimic a second mouse button, it's better to have the
one 'button' cycle between all three states rather than from 'on'
back to 'unset'.

[originally from svn r8784]

lightup.c
loopy.c
pattern.c
tents.c

index 298b7e2554a3d0d71d46f78311b4b3d203bc09e2..75a6219b976f3c2ba372040951817e8b00419566 100644 (file)
--- a/lightup.c
+++ b/lightup.c
@@ -1869,11 +1869,19 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
         if (flags & F_BLACK)
             return nullret;
         if (action == FLIP_LIGHT) {
+#ifdef STYLUS_BASED
+            if (flags & F_IMPOSSIBLE || flags & F_LIGHT) c = 'I'; else c = 'L';
+#else
             if (flags & F_IMPOSSIBLE) return nullret;
             c = 'L';
+#endif
         } else {
+#ifdef STYLUS_BASED
+            if (flags & F_IMPOSSIBLE || flags & F_LIGHT) c = 'L'; else c = 'I';
+#else
             if (flags & F_LIGHT) return nullret;
             c = 'I';
+#endif
         }
         sprintf(buf, "%c%d,%d", (int)c, cx, cy);
         break;
diff --git a/loopy.c b/loopy.c
index 34b97a298179e9b066937f12cdbd0fbdc56bbc3f..afa362c26b0177c732f80761de4b61c1c7c5dee1 100644 (file)
--- a/loopy.c
+++ b/loopy.c
@@ -3222,6 +3222,10 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
            button_char = 'y';
            break;
          case LINE_YES:
+#ifdef STYLUS_BASED
+           button_char = 'n';
+           break;
+#endif
          case LINE_NO:
            button_char = 'u';
            break;
@@ -3236,6 +3240,10 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
            button_char = 'n';
            break;
          case LINE_NO:
+#ifdef STYLUS_BASED
+           button_char = 'y';
+           break;
+#endif
          case LINE_YES:
            button_char = 'u';
            break;
index 68383d71377594061065593347a3407f64f774c9..7c1b0f20a5505008d6858c568385f2a6a373e48a 100644 (file)
--- a/pattern.c
+++ b/pattern.c
@@ -808,7 +808,7 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
             ui->drag = LEFT_DRAG;
             ui->release = LEFT_RELEASE;
 #ifdef STYLUS_BASED
-            ui->state = currstate == GRID_FULL ? GRID_UNKNOWN : GRID_FULL;
+            ui->state = (currstate + 2) % 3; /* FULL -> EMPTY -> UNKNOWN */
 #else
             ui->state = GRID_FULL;
 #endif
@@ -816,7 +816,7 @@ static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
             ui->drag = RIGHT_DRAG;
             ui->release = RIGHT_RELEASE;
 #ifdef STYLUS_BASED
-            ui->state = currstate == GRID_EMPTY ? GRID_UNKNOWN : GRID_EMPTY;
+            ui->state = (currstate + 1) % 3; /* EMPTY -> FULL -> UNKNOWN */
 #else
             ui->state = GRID_EMPTY;
 #endif
diff --git a/tents.c b/tents.c
index 2c8b042a6dd4bc657000841752113bdf96057553..a229e55d4a68c271836f7f0cf208a1a64ee74899 100644 (file)
--- a/tents.c
+++ b/tents.c
@@ -1469,6 +1469,7 @@ static int drag_xform(game_ui *ui, int x, int y, int v)
     ymin = min(ui->dsy, ui->dey);
     ymax = max(ui->dsy, ui->dey);
 
+#ifndef STYLUS_BASED
     /*
      * Left-dragging has no effect, so we treat a left-drag as a
      * single click on dsx,dsy.
@@ -1477,6 +1478,7 @@ static int drag_xform(game_ui *ui, int x, int y, int v)
         xmin = xmax = ui->dsx;
         ymin = ymax = ui->dsy;
     }
+#endif
 
     if (x < xmin || x > xmax || y < ymin || y > ymax)
         return v;                      /* no change outside drag area */
@@ -1489,11 +1491,18 @@ static int drag_xform(game_ui *ui, int x, int y, int v)
          * Results of a simple click. Left button sets blanks to
          * tents; right button sets blanks to non-tents; either
          * button clears a non-blank square.
+         * If stylus-based however, it loops instead.
          */
         if (ui->drag_button == LEFT_BUTTON)
+#ifdef STYLUS_BASED
+            v = (v == BLANK ? TENT : (v == TENT ? NONTENT : BLANK));
+        else
+            v = (v == BLANK ? NONTENT : (v == NONTENT ? TENT : BLANK));
+#else
             v = (v == BLANK ? TENT : BLANK);
         else
             v = (v == BLANK ? NONTENT : BLANK);
+#endif
     } else {
         /*
          * Results of a drag. Left-dragging has no effect.
@@ -1503,7 +1512,11 @@ static int drag_xform(game_ui *ui, int x, int y, int v)
         if (ui->drag_button == RIGHT_BUTTON)
             v = (v == BLANK ? NONTENT : v);
         else
+#ifdef STYLUS_BASED
+            v = (v == BLANK ? NONTENT : v);
+#else
             /* do nothing */;
+#endif
     }
 
     return v;