Invert the Fifteen cursor if FIFTEEN_INVERT_CURSOR ~= ^[yY].*$

The introduction of flip_cursor allows us to replace some hairy
hand-rolled logic with the standardised and tested move_cursor.
This commit is contained in:
Jonas Kölker
2015-10-08 11:57:54 +02:00
committed by Simon Tatham
parent 988b16a319
commit 5ddb011a57

View File

@ -462,42 +462,55 @@ struct game_drawstate {
int tilesize; int tilesize;
}; };
static int flip_cursor(int button)
{
switch (button) {
case CURSOR_UP: return CURSOR_DOWN;
case CURSOR_DOWN: return CURSOR_UP;
case CURSOR_LEFT: return CURSOR_RIGHT;
case CURSOR_RIGHT: return CURSOR_LEFT;
}
return 0;
}
static char *interpret_move(const game_state *state, game_ui *ui, static char *interpret_move(const game_state *state, game_ui *ui,
const game_drawstate *ds, const game_drawstate *ds,
int x, int y, int button) int x, int y, int button)
{ {
int gx, gy, dx, dy; int cx = X(state, state->gap_pos), nx = cx;
int cy = Y(state, state->gap_pos), ny = cy;
char buf[80]; char buf[80];
button &= ~MOD_MASK; button &= ~MOD_MASK;
gx = X(state, state->gap_pos); if (button == LEFT_BUTTON) {
gy = Y(state, state->gap_pos); nx = FROMCOORD(x);
ny = FROMCOORD(y);
if (button == CURSOR_RIGHT && gx > 0) if (nx < 0 || nx >= state->w || ny < 0 || ny >= state->h)
dx = gx - 1, dy = gy;
else if (button == CURSOR_LEFT && gx < state->w-1)
dx = gx + 1, dy = gy;
else if (button == CURSOR_DOWN && gy > 0)
dy = gy - 1, dx = gx;
else if (button == CURSOR_UP && gy < state->h-1)
dy = gy + 1, dx = gx;
else if (button == LEFT_BUTTON) {
dx = FROMCOORD(x);
dy = FROMCOORD(y);
if (dx < 0 || dx >= state->w || dy < 0 || dy >= state->h)
return NULL; /* out of bounds */ return NULL; /* out of bounds */
/* } else if (IS_CURSOR_MOVE(button)) {
* Any click location should be equal to the gap location static int invert_cursor = -1;
* in _precisely_ one coordinate. if (invert_cursor == -1) {
*/ char *env = getenv("FIFTEEN_INVERT_CURSOR");
if ((dx == gx && dy == gy) || (dx != gx && dy != gy)) invert_cursor = (env && (env[0] == 'y' || env[0] == 'Y'));
return NULL; }
button = flip_cursor(button); /* the default */
if (invert_cursor)
button = flip_cursor(button); /* undoes the first flip */
move_cursor(button, &nx, &ny, state->w, state->h, FALSE);
} else } else
return NULL; /* no move */ return NULL; /* no move */
sprintf(buf, "M%d,%d", dx, dy); /*
return dupstr(buf); * Any click location should be equal to the gap location
* in _precisely_ one coordinate.
*/
if ((cx == nx) ^ (cy == ny)) {
sprintf(buf, "M%d,%d", nx, ny);
return dupstr(buf);
}
return NULL;
} }
static game_state *execute_move(const game_state *from, const char *move) static game_state *execute_move(const game_state *from, const char *move)