struct game_state {
game_params par;
struct clues *clues;
- int *cluesdone;
+ unsigned char *clues_done;
digit *grid;
int *pencil; /* bitmaps using bits 1<<1..1<<n */
int completed, cheated;
state->clues->clues = snewn(4*w, int);
state->clues->immutable = snewn(a, digit);
state->grid = snewn(a, digit);
- state->cluesdone = snewn(4*w, int);
+ state->clues_done = snewn(4*w, unsigned char);
state->pencil = snewn(a, int);
for (i = 0; i < a; i++) {
}
memset(state->clues->immutable, 0, a);
- memset(state->cluesdone, 0, 4*w*sizeof(int));
+ memset(state->clues_done, 0, 4*w*sizeof(unsigned char));
for (i = 0; i < 4*w; i++) {
if (i > 0) {
ret->grid = snewn(a, digit);
ret->pencil = snewn(a, int);
- ret->cluesdone = snewn(4*w, int);
+ ret->clues_done = snewn(4*w, unsigned char);
memcpy(ret->grid, state->grid, a*sizeof(digit));
memcpy(ret->pencil, state->pencil, a*sizeof(int));
- memcpy(ret->cluesdone, state->cluesdone, 4*w*sizeof(int));
+ memcpy(ret->clues_done, state->clues_done, 4*w*sizeof(unsigned char));
ret->completed = state->completed;
ret->cheated = state->cheated;
{
sfree(state->grid);
sfree(state->pencil);
- sfree(state->cluesdone);
+ sfree(state->clues_done);
if (--state->clues->refcount <= 0) {
sfree(state->clues->immutable);
sfree(state->clues->clues);
}
}
- if (n > clues[i] || (j == w && n < clues[i])) {
+ if (n > clues[i] || (best == w && n < clues[i]) ||
+ (best < w && n == clues[i])) {
if (errors) {
int x, y;
CLUEPOS(x, y, i, w);
int x, int y, int button)
{
int w = state->par.w;
+ int shift_or_control = button & (MOD_SHFT | MOD_CTRL);
int tx, ty;
char buf[80];
}
}
if (IS_CURSOR_MOVE(button)) {
+ if (shift_or_control) {
+ int x = ui->hx, y = ui->hy;
+ switch (button) {
+ case CURSOR_LEFT: x = -1; break;
+ case CURSOR_RIGHT: x = w; break;
+ case CURSOR_UP: y = -1; break;
+ case CURSOR_DOWN: y = w; break;
+ }
+ if (is_clue(state, x, y)) {
+ sprintf(buf, "%c%d,%d", 'D', x, y);
+ return dupstr(buf);
+ }
+ return NULL;
+ }
move_cursor(button, &ui->hx, &ui->hy, w, w, 0);
ui->hshow = ui->hcursor = 1;
return "";
} else if (move[0] == 'D' && sscanf(move+1, "%d,%d", &x, &y) == 2 &&
is_clue(from, x, y)) {
int index = clue_index(from, x, y);
- ret->cluesdone[index] = !ret->cluesdone[index];
+ ret->clues_done[index] = !ret->clues_done[index];
return ret;
}
if (ds->errtmp[(y+1)*(w+2)+(x+1)])
tile |= DF_ERROR;
- else if (state->cluesdone[i])
+ else if (state->clues_done[i])
tile |= DF_CLUE_DONE;
ds->tiles[(y+1)*(w+2)+(x+1)] = tile;