ref: dd175e490a197026210ba4432eec6236971c6173
parent: 813cd5e3bf17c426bfafcf9d64f94ddeaf8deac0
author: Simon Tatham <anakin@pobox.com>
date: Mon Oct 10 12:31:26 EDT 2005
Fixes for handling human-entered Flip games. The clicked-on square always got a flip animation even when it wasn't one of the ones being turned, and a square with no effect at all was still counting as a move. Since it's an invariant of Flip's internal generator that every square includes itself as an effect, this never comes up in auto- generated games. [originally from svn r6384]
--- a/flip.c
+++ b/flip.c
@@ -897,7 +897,7 @@
static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
int x, int y, int button)
{
- int w = state->w, h = state->h /*, wh = w * h */;
+ int w = state->w, h = state->h, wh = w * h;
char buf[80], *nullret = NULL;
if (button == LEFT_BUTTON || button == CURSOR_SELECT ||
@@ -913,8 +913,22 @@
nullret = "";
if (tx >= 0 && tx < w && ty >= 0 && ty < h) {
- sprintf(buf, "M%d,%d", tx, ty);
- return dupstr(buf);
+ /*
+ * It's just possible that a manually entered game ID
+ * will have at least one square do nothing whatsoever.
+ * If so, we avoid encoding a move at all.
+ */
+ int i = ty*w+tx, j, makemove = FALSE;
+ for (j = 0; j < wh; j++) {
+ if (state->matrix->matrix[i*wh+j])
+ makemove = TRUE;
+ }
+ if (makemove) {
+ sprintf(buf, "M%d,%d", tx, ty);
+ return dupstr(buf);
+ } else {
+ return NULL;
+ }
}
}
else if (button == CURSOR_UP || button == CURSOR_DOWN ||
@@ -1179,6 +1193,7 @@
int fx, fy, fd;
int v = state->grid[i];
int vv;
+ int hintmask = (state->hints_active ? ~0 : ~2);
if (flashframe >= 0) {
fx = (w+1)/2 - min(x+1, w-x);
@@ -1190,12 +1205,11 @@
v &= ~1;
}
- if (!state->hints_active)
- v &= ~2;
+ v &= hintmask;
if (ui->cdraw && ui->cx == x && ui->cy == y)
v |= 4;
- if (oldstate && state->grid[i] != oldstate->grid[i])
+ if (oldstate && ((state->grid[i] ^ oldstate->grid[i]) & hintmask))
vv = 255; /* means `animated' */
else
vv = v;