ref: 5ddb011a57be24f4d3474c497e57e7c22f979106
parent: 988b16a3191282a5407f6cee88d62aaae853be3d
author: Jonas Kölker <jonaskoelker@yahoo.com>
date: Thu Oct 8 07:57:54 EDT 2015
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.
--- a/fifteen.c
+++ b/fifteen.c
@@ -462,42 +462,55 @@
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,
const game_drawstate *ds,
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];
button &= ~MOD_MASK;
- gx = X(state, state->gap_pos);
- gy = Y(state, state->gap_pos);
-
- if (button == CURSOR_RIGHT && gx > 0)
- 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)
+ if (button == LEFT_BUTTON) {
+ nx = FROMCOORD(x);
+ ny = FROMCOORD(y);
+ if (nx < 0 || nx >= state->w || ny < 0 || ny >= state->h)
return NULL; /* out of bounds */
- /*
- * Any click location should be equal to the gap location
- * in _precisely_ one coordinate.
- */
- if ((dx == gx && dy == gy) || (dx != gx && dy != gy))
- return NULL;
+ } else if (IS_CURSOR_MOVE(button)) {
+ static int invert_cursor = -1;
+ if (invert_cursor == -1) {
+ char *env = getenv("FIFTEEN_INVERT_CURSOR");
+ invert_cursor = (env && (env[0] == 'y' || env[0] == 'Y'));
+ }
+ 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
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)