* suitable for what.
*/
#define F_ADD 0x01
-#define F_ADD_BAD 0x02
-#define F_SUB 0x04
-#define F_SUB_BAD 0x08
-#define F_MUL 0x10
-#define F_MUL_BAD 0x20
-#define F_DIV 0x40
-#define F_DIV_BAD 0x80
+#define F_SUB 0x02
+#define F_MUL 0x04
+#define F_DIV 0x08
+#define BAD_SHIFT 4
+
for (i = 0; i < a; i++) {
singletons[i] = 0;
j = dsf_canonify(dsf, i);
v = p + q;
if (v > 4 && v < 2*w-2)
singletons[j] |= F_ADD;
- else
- singletons[j] |= F_ADD_BAD;
+ else
+ singletons[j] |= F_ADD << BAD_SHIFT;
/*
- * Multiplication clues: similarly, we prefer clues
- * of this type which leave multiple options open.
- * We can't rule out all the others, though, because
- * there are very very few 2-square multiplication
- * clues that _don't_ leave only one option.
+ * Multiplication clues: above Normal difficulty, we
+ * prefer (but don't absolutely insist on) clues of
+ * this type which leave multiple options open.
*/
v = p * q;
n = 0;
for (k = 1; k <= w; k++)
if (v % k == 0 && v / k <= w && v / k != k)
n++;
- if (n > 1)
+ if (n <= 2 && diff > DIFF_NORMAL)
+ singletons[j] |= F_MUL << BAD_SHIFT;
+ else
singletons[j] |= F_MUL;
- else
- singletons[j] |= F_MUL_BAD;
/*
* Subtraction: we completely avoid a difference of
long clue;
int good, bad;
switch (k) {
- case 0: clue = C_DIV; good = F_DIV; bad = F_DIV_BAD; break;
- case 1: clue = C_SUB; good = F_SUB; bad = F_SUB_BAD; break;
- case 2: clue = C_MUL; good = F_MUL; bad = F_MUL_BAD; break;
- default /* case 3 */ :
- clue = C_ADD; good = F_ADD; bad = F_ADD_BAD; break;
+ case 0: clue = C_DIV; good = F_DIV; break;
+ case 1: clue = C_SUB; good = F_SUB; break;
+ case 2: clue = C_MUL; good = F_MUL; break;
+ default /* case 3 */ : clue = C_ADD; good = F_ADD; break;
}
for (i = 0; i < a; i++) {
}
if (i == a) {
/* didn't find a nice one, use a nasty one */
+ bad = good << BAD_SHIFT;
for (i = 0; i < a; i++) {
j = order[i];
- if (singletons[j] & good) {
+ if (singletons[j] & bad) {
clues[j] = clue;
singletons[j] = 0;
break;
break;
}
#undef F_ADD
-#undef F_ADD_BAD
#undef F_SUB
-#undef F_SUB_BAD
#undef F_MUL
-#undef F_MUL_BAD
#undef F_DIV
-#undef F_DIV_BAD
+#undef BAD_SHIFT
/*
* Having chosen the clue types, calculate the clue values.
{
int w = params->w, a = w*w;
game_state *state = snew(game_state);
- char *err;
const char *p = desc;
int i;
state->clues->refcount = 1;
state->clues->w = w;
state->clues->dsf = snew_dsf(a);
- err = parse_block_structure(&p, w, state->clues->dsf);
+ parse_block_structure(&p, w, state->clues->dsf);
assert(*p == ',');
p++;
return errs;
}
-static char *interpret_move(game_state *state, game_ui *ui, game_drawstate *ds,
+static char *interpret_move(game_state *state, game_ui *ui, const game_drawstate *ds,
int x, int y, int button)
{
int w = state->par.w;
return 0.0F;
}
-static int game_is_solved(game_state *state)
+static int game_status(game_state *state)
{
- return state->completed;
+ return state->completed ? +1 : 0;
}
static int game_timing_state(game_state *state, game_ui *ui)
game_redraw,
game_anim_length,
game_flash_length,
- game_is_solved,
+ game_status,
TRUE, FALSE, game_print_size, game_print,
FALSE, /* wants_statusbar */
FALSE, game_timing_state,