* mines.c: Minesweeper clone with sophisticated grid generation.
*
* Still TODO:
- *
- * - possibly disable undo? Or alternatively mark game states as
- * `cheated', although that's horrid.
- * + OK. Rather than _disabling_ undo, we have a hook callable
- * in the game backend which is called before we do an undo.
- * That hook can talk to the game_ui and set the cheated flag,
- * and then make_move can avoid setting the `won' flag after that.
*
* - think about configurably supporting question marks. Once,
* that is, we've thought about configurability in general!
cx = FROMCOORD(x);
cy = FROMCOORD(y);
- if (cx < 0 || cx >= from->w || cy < 0 || cy > from->h)
+ if (cx < 0 || cx >= from->w || cy < 0 || cy >= from->h)
return NULL;
- if (button == LEFT_BUTTON || button == LEFT_DRAG) {
+ if (button == LEFT_BUTTON || button == LEFT_DRAG ||
+ button == MIDDLE_BUTTON || button == MIDDLE_DRAG) {
/*
* Mouse-downs and mouse-drags just cause highlighting
* updates.
return ret;
}
- if (button == LEFT_RELEASE) {
+ if (button == LEFT_RELEASE || button == MIDDLE_RELEASE) {
ui->hx = ui->hy = -1;
ui->hradius = 0;
* permitted if the tile is marked as a mine, for safety.
* (Unmark it and _then_ open it.)
*/
- if (from->grid[cy * from->w + cx] == -2 ||
- from->grid[cy * from->w + cx] == -3) {
+ if (button == LEFT_RELEASE &&
+ (from->grid[cy * from->w + cx] == -2 ||
+ from->grid[cy * from->w + cx] == -3)) {
ret = dup_game(from);
ret->just_used_solve = FALSE;
open_square(ret, cx, cy);
}
/*
- * Left-clicking on an uncovered tile: first we check to see if
- * the number of mine markers surrounding the tile is equal to
- * its mine count, and if so then we open all other surrounding
- * squares.
+ * Left-clicking or middle-clicking on an uncovered tile:
+ * first we check to see if the number of mine markers
+ * surrounding the tile is equal to its mine count, and if
+ * so then we open all other surrounding squares.
*/
if (from->grid[cy * from->w + cx] > 0) {
int dy, dx, n;
bg = COL_BACKGROUND;
if (!ds->started) {
- int coords[6];
+ int coords[10];
draw_rect(fe, 0, 0,
TILE_SIZE * state->w + 2 * BORDER,
coords[1] = COORD(state->h) + OUTER_HIGHLIGHT_WIDTH - 1;
coords[2] = COORD(state->w) + OUTER_HIGHLIGHT_WIDTH - 1;
coords[3] = COORD(0) - OUTER_HIGHLIGHT_WIDTH;
- coords[4] = COORD(0) - OUTER_HIGHLIGHT_WIDTH;
- coords[5] = COORD(state->h) + OUTER_HIGHLIGHT_WIDTH - 1;
- draw_polygon(fe, coords, 3, TRUE, COL_HIGHLIGHT);
- draw_polygon(fe, coords, 3, FALSE, COL_HIGHLIGHT);
+ coords[4] = coords[2] - TILE_SIZE;
+ coords[5] = coords[3] + TILE_SIZE;
+ coords[8] = COORD(0) - OUTER_HIGHLIGHT_WIDTH;
+ coords[9] = COORD(state->h) + OUTER_HIGHLIGHT_WIDTH - 1;
+ coords[6] = coords[8] + TILE_SIZE;
+ coords[7] = coords[9] - TILE_SIZE;
+ draw_polygon(fe, coords, 5, TRUE, COL_HIGHLIGHT);
+ draw_polygon(fe, coords, 5, FALSE, COL_HIGHLIGHT);
coords[1] = COORD(0) - OUTER_HIGHLIGHT_WIDTH;
coords[0] = COORD(0) - OUTER_HIGHLIGHT_WIDTH;
- draw_polygon(fe, coords, 3, TRUE, COL_LOWLIGHT);
- draw_polygon(fe, coords, 3, FALSE, COL_LOWLIGHT);
+ draw_polygon(fe, coords, 5, TRUE, COL_LOWLIGHT);
+ draw_polygon(fe, coords, 5, FALSE, COL_LOWLIGHT);
ds->started = TRUE;
}
game_flash_length,
game_wants_statusbar,
TRUE, game_timing_state,
+ BUTTON_BEATS(LEFT_BUTTON, RIGHT_BUTTON),
};