X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/fd1a1a2b902d34e75a47515a564020b0815ddea6..74a4e547b35f162350dcf205aa453fd32820d249:/net.c?ds=sidebyside diff --git a/net.c b/net.c index c345ecb..616609f 100644 --- a/net.c +++ b/net.c @@ -12,6 +12,7 @@ #include "tree234.h" const char *const game_name = "Net"; +const int game_can_configure = TRUE; #define PI 3.141592653589793238462643383279502884197169399 @@ -55,8 +56,8 @@ const char *const game_name = "Net"; #define TILE_BORDER 1 #define WINDOW_OFFSET 16 -#define ROTATE_TIME 0.1F -#define FLASH_FRAME 0.05F +#define ROTATE_TIME 0.13F +#define FLASH_FRAME 0.07F enum { COL_BACKGROUND, @@ -182,11 +183,78 @@ game_params *dup_params(game_params *params) return ret; } +config_item *game_configure(game_params *params) +{ + config_item *ret; + char buf[80]; + + ret = snewn(5, config_item); + + ret[0].name = "Width"; + ret[0].type = C_STRING; + sprintf(buf, "%d", params->width); + ret[0].sval = dupstr(buf); + ret[0].ival = 0; + + ret[1].name = "Height"; + ret[1].type = C_STRING; + sprintf(buf, "%d", params->height); + ret[1].sval = dupstr(buf); + ret[1].ival = 0; + + ret[2].name = "Walls wrap around"; + ret[2].type = C_BOOLEAN; + ret[2].sval = NULL; + ret[2].ival = params->wrapping; + + ret[3].name = "Barrier probability"; + ret[3].type = C_STRING; + sprintf(buf, "%g", params->barrier_probability); + ret[3].sval = dupstr(buf); + ret[3].ival = 0; + + ret[4].name = NULL; + ret[4].type = C_END; + ret[4].sval = NULL; + ret[4].ival = 0; + + return ret; +} + +game_params *custom_params(config_item *cfg) +{ + game_params *ret = snew(game_params); + + ret->width = atoi(cfg[0].sval); + ret->height = atoi(cfg[1].sval); + ret->wrapping = cfg[2].ival; + ret->barrier_probability = (float)atof(cfg[3].sval); + + return ret; +} + +char *validate_params(game_params *params) +{ + if (params->width <= 0 && params->height <= 0) + return "Width and height must both be greater than zero"; + if (params->width <= 0) + return "Width must be greater than zero"; + if (params->height <= 0) + return "Height must be greater than zero"; + if (params->width <= 1 && params->height <= 1) + return "At least one of width and height must be greater than one"; + if (params->barrier_probability < 0) + return "Barrier probability may not be negative"; + if (params->barrier_probability > 1) + return "Barrier probability may not be greater than 1"; + return NULL; +} + /* ---------------------------------------------------------------------- * Randomly select a new game seed. */ -char *new_game_seed(game_params *params) +char *new_game_seed(game_params *params, random_state *rs) { /* * The full description of a Net game is far too large to @@ -200,10 +268,19 @@ char *new_game_seed(game_params *params) * understand it and do something completely different.) */ char buf[40]; - sprintf(buf, "%d", rand()); + sprintf(buf, "%lu", random_bits(rs, 32)); return dupstr(buf); } +char *validate_seed(game_params *params, char *seed) +{ + /* + * Since any string at all will suffice to seed the RNG, there + * is no validation required. + */ + return NULL; +} + /* ---------------------------------------------------------------------- * Construct an initial game state, given a seed and parameters. */ @@ -215,8 +292,8 @@ game_state *new_game(game_params *params, char *seed) tree234 *possibilities, *barriers; int w, h, x, y, nbarriers; - assert(params->width > 2); - assert(params->height > 2); + assert(params->width > 0 && params->height > 0); + assert(params->width > 1 || params->height > 1); /* * Create a blank game state. @@ -296,11 +373,15 @@ game_state *new_game(game_params *params, char *seed) * closed loops. [] */ possibilities = newtree234(xyd_cmp); - - add234(possibilities, new_xyd(state->cx, state->cy, R)); - add234(possibilities, new_xyd(state->cx, state->cy, U)); - add234(possibilities, new_xyd(state->cx, state->cy, L)); - add234(possibilities, new_xyd(state->cx, state->cy, D)); + + if (state->cx+1 < state->width) + add234(possibilities, new_xyd(state->cx, state->cy, R)); + if (state->cy-1 >= 0) + add234(possibilities, new_xyd(state->cx, state->cy, U)); + if (state->cx-1 >= 0) + add234(possibilities, new_xyd(state->cx, state->cy, L)); + if (state->cy+1 < state->height) + add234(possibilities, new_xyd(state->cx, state->cy, D)); while (count234(possibilities) > 0) { int i; @@ -643,10 +724,19 @@ static unsigned char *compute_active(game_state *state) return active; } +game_ui *new_ui(game_state *state) +{ + return NULL; +} + +void free_ui(game_ui *ui) +{ +} + /* ---------------------------------------------------------------------- * Process a move. */ -game_state *make_move(game_state *state, int x, int y, int button) +game_state *make_move(game_state *state, game_ui *ui, int x, int y, int button) { game_state *ret; int tx, ty, orig; @@ -670,8 +760,8 @@ game_state *make_move(game_state *state, int x, int y, int button) ty = y / TILE_SIZE; if (tx >= state->width || ty >= state->height) return NULL; - if (tx % TILE_SIZE >= TILE_SIZE - TILE_BORDER || - ty % TILE_SIZE >= TILE_SIZE - TILE_BORDER) + if (x % TILE_SIZE >= TILE_SIZE - TILE_BORDER || + y % TILE_SIZE >= TILE_SIZE - TILE_BORDER) return NULL; /* @@ -1060,7 +1150,7 @@ static void draw_tile(frontend *fe, game_state *state, int x, int y, int tile, } void game_redraw(frontend *fe, game_drawstate *ds, game_state *oldstate, - game_state *state, float t, float ft) + game_state *state, game_ui *ui, float t, float ft) { int x, y, tx, ty, frame; unsigned char *active;