~mdw
/
sgt
/
puzzles
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Forgot to set 'has_incentre' on triangular grids, which don't use
[sgt/puzzles]
/
filling.c
diff --git
a/filling.c
b/filling.c
index
0209062
..
8b4a7c3
100644
(file)
--- a/
filling.c
+++ b/
filling.c
@@
-1097,11
+1097,10
@@
static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
case '\r':
case '\n':
case '\b':
case '\r':
case '\n':
case '\b':
- case '\177':
button = 0;
break;
default:
button = 0;
break;
default:
- if (
!isdigit(button)
) return NULL;
+ if (
button < '0' || button > '9'
) return NULL;
button -= '0';
if (button > (w == 2 && h == 2? 3: max(w, h))) return NULL;
}
button -= '0';
if (button > (w == 2 && h == 2? 3: max(w, h))) return NULL;
}
@@
-1138,7
+1137,7
@@
static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
static game_state *execute_move(game_state *state, char *move)
{
static game_state *execute_move(game_state *state, char *move)
{
- game_state *new_state;
+ game_state *new_state
= NULL
;
const int sz = state->shared->params.w * state->shared->params.h;
if (*move == 's') {
const int sz = state->shared->params.w * state->shared->params.h;
if (*move == 's') {
@@
-1149,18
+1148,18
@@
static game_state *execute_move(game_state *state, char *move)
} else {
int value;
char *endptr, *delim = strchr(move, '_');
} else {
int value;
char *endptr, *delim = strchr(move, '_');
- if (!delim)
return NULL
;
+ if (!delim)
goto err
;
value = strtol(delim+1, &endptr, 0);
value = strtol(delim+1, &endptr, 0);
- if (*endptr || endptr == delim+1)
return NULL
;
- if (value < 0 || value > 9)
return NULL
;
+ if (*endptr || endptr == delim+1)
goto err
;
+ if (value < 0 || value > 9)
goto err
;
new_state = dup_game(state);
while (*move) {
const int i = strtol(move, &endptr, 0);
new_state = dup_game(state);
while (*move) {
const int i = strtol(move, &endptr, 0);
- if (endptr == move)
return NULL
;
- if (i < 0 || i >= sz)
return NULL
;
+ if (endptr == move)
goto err
;
+ if (i < 0 || i >= sz)
goto err
;
new_state->board[i] = value;
if (*endptr == '_') break;
new_state->board[i] = value;
if (*endptr == '_') break;
- if (*endptr != ',')
return NULL
;
+ if (*endptr != ',')
goto err
;
move = endptr + 1;
}
}
move = endptr + 1;
}
}
@@
-1181,6
+1180,10
@@
static game_state *execute_move(game_state *state, char *move)
}
return new_state;
}
return new_state;
+
+err:
+ if (new_state) free_game(new_state);
+ return NULL;
}
/* ----------------------------------------------------------------------
}
/* ----------------------------------------------------------------------
@@
-1496,7
+1499,7
@@
static void draw_grid(drawing *dr, game_drawstate *ds, game_state *state,
if (flashy || !shading) {
/* clear all background flags */
if (flashy || !shading) {
/* clear all background flags */
- } else if (ui->sel && ui->sel[y*w+x]) {
+ } else if (ui
&& ui
->sel && ui->sel[y*w+x]) {
flags |= HIGH_BG;
} else if (v) {
int size = dsf_size(ds->dsf_scratch, y*w+x);
flags |= HIGH_BG;
} else if (v) {
int size = dsf_size(ds->dsf_scratch, y*w+x);
@@
-1505,7
+1508,7
@@
static void draw_grid(drawing *dr, game_drawstate *ds, game_state *state,
else if (size > v)
flags |= ERROR_BG;
}
else if (size > v)
flags |= ERROR_BG;
}
- if (ui->cur_visible && x == ui->cur_x && y == ui->cur_y)
+ if (ui
&& ui
->cur_visible && x == ui->cur_x && y == ui->cur_y)
flags |= CURSOR_SQ;
/*
flags |= CURSOR_SQ;
/*
@@
-1614,6
+1617,11
@@
static float game_flash_length(game_state *oldstate, game_state *newstate,
return 0.0F;
}
return 0.0F;
}
+static int game_is_solved(game_state *state)
+{
+ return state->completed;
+}
+
static int game_timing_state(game_state *state, game_ui *ui)
{
return TRUE;
static int game_timing_state(game_state *state, game_ui *ui)
{
return TRUE;
@@
-1712,6
+1720,7
@@
const struct game thegame = {
game_redraw,
game_anim_length,
game_flash_length,
game_redraw,
game_anim_length,
game_flash_length,
+ game_is_solved,
TRUE, FALSE, game_print_size, game_print,
FALSE, /* wants_statusbar */
FALSE, game_timing_state,
TRUE, FALSE, game_print_size, game_print,
FALSE, /* wants_statusbar */
FALSE, game_timing_state,