return ret;
}
+static int game_can_format_as_text_now(game_params *params)
+{
+ return TRUE;
+}
+
static char *game_text_format(game_state *state)
{
return NULL;
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 ||
- button == ' ' || button == '\r' || button == '\n') {
+ if (button == LEFT_BUTTON || IS_CURSOR_SELECT(button)) {
int tx, ty;
if (button == LEFT_BUTTON) {
tx = FROMCOORD(x), ty = FROMCOORD(y);
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 ||
- button == CURSOR_RIGHT || button == CURSOR_LEFT) {
+ else if (IS_CURSOR_MOVE(button)) {
int dx = 0, dy = 0;
switch (button) {
case CURSOR_UP: dy = -1; break;
ds->tilesize = tilesize;
}
-static float *game_colours(frontend *fe, game_state *state, int *ncolours)
+static float *game_colours(frontend *fe, int *ncolours)
{
float *ret = snewn(3 * NCOLOURS, float);
coords[0] = bx + TILE_SIZE;
coords[1] = by;
- coords[2] = bx + TILE_SIZE * animtime;
- coords[3] = by + TILE_SIZE * animtime;
+ coords[2] = bx + (int)((float)TILE_SIZE * animtime);
+ coords[3] = by + (int)((float)TILE_SIZE * animtime);
coords[4] = bx;
coords[5] = by + TILE_SIZE;
- coords[6] = bx + TILE_SIZE - TILE_SIZE * animtime;
- coords[7] = by + TILE_SIZE - TILE_SIZE * animtime;
+ coords[6] = bx + TILE_SIZE - (int)((float)TILE_SIZE * animtime);
+ coords[7] = by + TILE_SIZE - (int)((float)TILE_SIZE * animtime);
colour = (tile & 1 ? COL_WRONG : COL_RIGHT);
if (animtime < 0.5)
}
if (flashtime)
- flashframe = flashtime / FLASH_FRAME;
+ flashframe = (int)(flashtime / FLASH_FRAME);
else
flashframe = -1;
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]) &~ 2))
vv = 255; /* means `animated' */
else
vv = v;
return 0.0F;
}
-static int game_wants_statusbar(void)
+static int game_status(game_state *state)
{
- return TRUE;
+ return state->completed ? +1 : 0;
}
static int game_timing_state(game_state *state, game_ui *ui)
return TRUE;
}
- static void game_print_size(game_params *params, float *x, float *y)
- {
- }
-
- static void game_print(drawing *dr, game_state *state, int tilesize)
- {
- }
-
+static void game_print_size(game_params *params, float *x, float *y)
+{
+}
+
+static void game_print(drawing *dr, game_state *state, int tilesize)
+{
+}
+
#ifdef COMBINED
#define thegame flip
#endif
const struct game thegame = {
- "Flip", "games.flip",
+ "Flip", "games.flip", "flip",
default_params,
game_fetch_preset,
decode_params,
dup_game,
free_game,
TRUE, solve_game,
- FALSE, game_text_format,
+ FALSE, game_can_format_as_text_now, game_text_format,
new_ui,
free_ui,
encode_ui,
game_redraw,
game_anim_length,
game_flash_length,
+ game_status,
FALSE, FALSE, game_print_size, game_print,
- game_wants_statusbar,
+ TRUE, /* wants_statusbar */
FALSE, game_timing_state,
- 0, /* mouse_priorities */
+ 0, /* flags */
};