X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/1a739e2fd0f176d82aa3dba471a129f9fad0bd39..07a54e524bde513e2cb7439dd2503556172f5ff5:/loopy.c diff --git a/loopy.c b/loopy.c index 798e54e..10619af 100644 --- 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 */ - char *clues; + signed char *clues; /* 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->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); @@ -512,10 +512,12 @@ static const game_params presets[] = { { 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 +#endif }; 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) { - char *clues; + signed char *clues; 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->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); @@ -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->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); @@ -1876,10 +1878,7 @@ const static struct dline dlines[] = { (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 */ @@ -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) { - 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)); */ - return BIT_SET(dline_array[(i+dl->dx) + (state->w + 1) * (j+dl->dy)], + return BIT_SET(dline_array[(i+dlines[desc].dx) + (state->w + 1) * (j+dlines[desc].dy)], desc); } @@ -1946,10 +1944,9 @@ static int set_square_dline(game_state *state, char *dline_array, #endif ) { - const struct dline *dl = get_dline(desc); 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+dlines[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); @@ -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) { - const struct dline *dl = get_dline(desc); 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, dlines[desc].dir1) == LINE_UNKNOWN) && + (get_line_status_from_point(state, i, j, dlines[desc].dir2) == LINE_UNKNOWN); } #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; - 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 - 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); @@ -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; - const struct dline *dl; 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) { - 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)) @@ -3791,14 +3786,14 @@ static void game_print(drawing *dr, game_state *state, int tilesize) /* * Lines. (At the moment, I'm not bothering with crosses.) */ - FORALL_VL(state, x, y) { + FORALL_HL(state, x, y) { if (RIGHTOF_DOT(state, x, y) == LINE_YES) draw_rect(dr, BORDER + x * TILE_SIZE, BORDER + y * TILE_SIZE - LINEWIDTH/2, TILE_SIZE, (LINEWIDTH/2) * 2 + 1, ink); } - FORALL_HL(state, x, y) { + FORALL_VL(state, x, y) { if (BELOW_DOT(state, x, y) == LINE_YES) draw_rect(dr, BORDER + x * TILE_SIZE - LINEWIDTH/2, BORDER + y * TILE_SIZE, @@ -3811,7 +3806,7 @@ static void game_print(drawing *dr, game_state *state, int tilesize) #endif const struct game thegame = { - "Loopy", "games.loopy", + "Loopy", "games.loopy", "loopy", default_params, game_fetch_preset, decode_params,