~mdw
/
sgt
/
puzzles
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Experimental UI tweak enabled by a hacky environment variable:
[sgt/puzzles]
/
loopy.c
diff --git
a/loopy.c
b/loopy.c
index
20d1e96
..
10619af
100644
(file)
--- a/
loopy.c
+++ b/
loopy.c
@@
-58,7
+58,7
@@
struct game_state {
int w, h;
/* Put -1 in a square that doesn't get a clue */
int w, h;
/* Put -1 in a square that doesn't get a clue */
- char *clues;
+
signed
char *clues;
/* Arrays of line states, stored left-to-right, top-to-bottom */
char *hl, *vl;
/* Arrays of line states, stored left-to-right, top-to-bottom */
char *hl, *vl;
@@
-299,7
+299,7
@@
static game_state *dup_game(game_state *state)
ret->solved = state->solved;
ret->cheated = state->cheated;
ret->solved = state->solved;
ret->cheated = state->cheated;
- ret->clues = snewn(SQUARE_COUNT(state), char);
+ ret->clues = snewn(SQUARE_COUNT(state),
signed
char);
memcpy(ret->clues, state->clues, SQUARE_COUNT(state));
ret->hl = snewn(HL_COUNT(state), char);
memcpy(ret->clues, state->clues, SQUARE_COUNT(state));
ret->hl = snewn(HL_COUNT(state), char);
@@
-512,10
+512,12
@@
static const game_params presets[] = {
{ 15, 15, DIFF_EASY, 0 },
{ 15, 15, DIFF_NORMAL, 0 },
{ 15, 15, DIFF_HARD, 0 },
{ 15, 15, DIFF_EASY, 0 },
{ 15, 15, DIFF_NORMAL, 0 },
{ 15, 15, DIFF_HARD, 0 },
+#ifndef SMALL_SCREEN
{ 30, 20, DIFF_EASY, 0 },
{ 30, 20, DIFF_NORMAL, 0 },
{ 30, 20, DIFF_HARD, 0 }
#endif
{ 30, 20, DIFF_EASY, 0 },
{ 30, 20, DIFF_NORMAL, 0 },
{ 30, 20, DIFF_HARD, 0 }
#endif
+#endif
};
static int game_fetch_preset(int i, char **name, game_params **params)
};
static int game_fetch_preset(int i, char **name, game_params **params)
@@
-1423,7
+1425,7
@@
enum { SQUARE_LIT, SQUARE_UNLIT };
* the dimensions provided by said game_state) */
static void add_full_clues(game_state *state, random_state *rs)
{
* the dimensions provided by said game_state) */
static void add_full_clues(game_state *state, random_state *rs)
{
- char *clues;
+
signed
char *clues;
char *board;
int i, j, a, b, c;
int board_area = SQUARE_COUNT(state);
char *board;
int i, j, a, b, c;
int board_area = SQUARE_COUNT(state);
@@
-1720,7
+1722,7
@@
static char *new_game_desc(game_params *params, random_state *rs,
state->h = params->h;
state->w = params->w;
state->h = params->h;
state->w = params->w;
- state->clues = snewn(SQUARE_COUNT(params), char);
+ state->clues = snewn(SQUARE_COUNT(params),
signed
char);
state->hl = snewn(HL_COUNT(params), char);
state->vl = snewn(VL_COUNT(params), char);
state->hl = snewn(HL_COUNT(params), char);
state->vl = snewn(VL_COUNT(params), char);
@@
-1772,7
+1774,7
@@
static game_state *new_game(midend *me, game_params *params, char *desc)
state->h = params->h;
state->w = params->w;
state->h = params->h;
state->w = params->w;
- state->clues = snewn(SQUARE_COUNT(params), char);
+ state->clues = snewn(SQUARE_COUNT(params),
signed
char);
state->hl = snewn(HL_COUNT(params), char);
state->vl = snewn(VL_COUNT(params), char);
state->hl = snewn(HL_COUNT(params), char);
state->vl = snewn(VL_COUNT(params), char);
@@
-1876,10
+1878,7
@@
const static struct dline dlines[] = {
(d==DLINE_DR) ? "DLINE_DR": \
"oops")
(d==DLINE_DR) ? "DLINE_DR": \
"oops")
-static const struct dline *get_dline(enum dline_desc desc)
-{
- return &dlines[desc];
-}
+#define CHECK_DLINE_SENSIBLE(d) assert(dlines[(d)].dx != -1 && dlines[(d)].dy != -1)
/* This will fail an assertion if the directions handed to it are the same, as
* no dline corresponds to that */
/* This will fail an assertion if the directions handed to it are the same, as
* no dline corresponds to that */
@@
-1932,10
+1931,9
@@
static int set_dot_dline(game_state *state, char *dline_array,
static int get_square_dline(game_state *state, char *dline_array,
int i, int j, enum dline_desc desc)
{
static int get_square_dline(game_state *state, char *dline_array,
int i, int j, enum dline_desc desc)
{
- const struct dline *dl = get_dline(desc);
- assert(dl->dx != -1 && dl->dy != -1);
+ CHECK_DLINE_SENSIBLE(desc);
/* fprintf(stderr, "get_square_dline %p [%d,%d] %s\n", dline_array, i, j, DL2STR(desc)); */
/* fprintf(stderr, "get_square_dline %p [%d,%d] %s\n", dline_array, i, j, DL2STR(desc)); */
- return BIT_SET(dline_array[(i+dl
->dx) + (state->w + 1) * (j+dl->
dy)],
+ return BIT_SET(dline_array[(i+dl
ines[desc].dx) + (state->w + 1) * (j+dlines[desc].
dy)],
desc);
}
desc);
}
@@
-1946,10
+1944,9
@@
static int set_square_dline(game_state *state, char *dline_array,
#endif
)
{
#endif
)
{
- const struct dline *dl = get_dline(desc);
int ret;
int ret;
-
assert(dl->dx != -1 && dl->dy != -1
);
- ret = SET_BIT(dline_array[(i+dl
->dx) + (state->w + 1) * (j+dl->
dy)], desc);
+
CHECK_DLINE_SENSIBLE(desc
);
+ ret = SET_BIT(dline_array[(i+dl
ines[desc].dx) + (state->w + 1) * (j+dlines[desc].
dy)], desc);
#ifdef SHOW_WORKING
if (ret)
fprintf(stderr, "set_square_dline %p [%d,%d] %s (%s)\n", dline_array, i, j, DL2STR(desc), reason);
#ifdef SHOW_WORKING
if (ret)
fprintf(stderr, "set_square_dline %p [%d,%d] %s (%s)\n", dline_array, i, j, DL2STR(desc), reason);
@@
-1980,10
+1977,9
@@
static int set_square_opp_dline(game_state *state, char *dline_array,
static int dline_both_unknown(const game_state *state, int i, int j,
enum dline_desc desc)
{
static int dline_both_unknown(const game_state *state, int i, int j,
enum dline_desc desc)
{
- const struct dline *dl = get_dline(desc);
return
return
- (get_line_status_from_point(state, i, j, dl
->
dir1) == LINE_UNKNOWN) &&
- (get_line_status_from_point(state, i, j, dl
->
dir2) == LINE_UNKNOWN);
+ (get_line_status_from_point(state, i, j, dl
ines[desc].
dir1) == LINE_UNKNOWN) &&
+ (get_line_status_from_point(state, i, j, dl
ines[desc].
dir2) == LINE_UNKNOWN);
}
#define SQUARE_DLINES \
}
#define SQUARE_DLINES \
@@
-2143,14
+2139,14
@@
static int square_setboth_in_dline(solver_state *sstate, enum dline_desc dd,
int i, int j, enum line_state line_new)
{
int retval = FALSE;
int i, int j, enum line_state line_new)
{
int retval = FALSE;
- const struct dline
*dl = get_dline(dd)
;
+ const struct dline
dll = dlines[dd], *dl = &dll
;
#if 0
fprintf(stderr, "square_setboth_in_dline %s [%d,%d] to %d\n",
DL2STR(dd), i, j, line_new);
#endif
#if 0
fprintf(stderr, "square_setboth_in_dline %s [%d,%d] to %d\n",
DL2STR(dd), i, j, line_new);
#endif
-
assert(dl->dx != -1 && dl->dy != -1
);
+
CHECK_DLINE_SENSIBLE(dd
);
retval |=
set_line_bydot(sstate, i+dl->dx, j+dl->dy, dl->dir1, line_new);
retval |=
set_line_bydot(sstate, i+dl->dx, j+dl->dy, dl->dir1, line_new);
@@
-2651,7
+2647,6
@@
static int hard_mode_deductions(solver_state *sstate)
enum direction dir1, dir2;
int can1, can2, inv1, inv2;
int diff = DIFF_MAX;
enum direction dir1, dir2;
int can1, can2, inv1, inv2;
int diff = DIFF_MAX;
- const struct dline *dl;
enum dline_desc dd;
FORALL_SQUARES(state, i, j) {
enum dline_desc dd;
FORALL_SQUARES(state, i, j) {
@@
-2774,7
+2769,7
@@
static int hard_mode_deductions(solver_state *sstate)
continue;
FORALL_DOT_DLINES(dd) {
continue;
FORALL_DOT_DLINES(dd) {
-
dl = get_dline(dd)
;
+
const struct dline dll = dlines[dd], *dl = &dll
;
if (i == 0 && (dl->dir1 == LEFT || dl->dir2 == LEFT))
continue;
if (i == w && (dl->dir1 == RIGHT || dl->dir2 == RIGHT))
if (i == 0 && (dl->dir1 == LEFT || dl->dir2 == LEFT))
continue;
if (i == w && (dl->dir1 == RIGHT || dl->dir2 == RIGHT))
@@
-3811,7
+3806,7
@@
static void game_print(drawing *dr, game_state *state, int tilesize)
#endif
const struct game thegame = {
#endif
const struct game thegame = {
- "Loopy", "games.loopy",
+ "Loopy", "games.loopy",
"loopy",
default_params,
game_fetch_preset,
decode_params,
default_params,
game_fetch_preset,
decode_params,