mirror of
git://git.tartarus.org/simon/puzzles.git
synced 2025-04-21 08:01:30 -07:00
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:

committed by
Simon Tatham

parent
988b16a319
commit
5ddb011a57
61
fifteen.c
61
fifteen.c
@ -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)
|
||||||
|
Reference in New Issue
Block a user