X-Git-Url: https://git.distorted.org.uk/~mdw/sgt/puzzles/blobdiff_plain/dafd6cf6826f9bbd27ddd780fab48221d4706556..821f9f32f616cda1802563fb9be2f44ba161dff2:/midend.c diff --git a/midend.c b/midend.c index 75d51bb..cc360b5 100644 --- a/midend.c +++ b/midend.c @@ -80,7 +80,7 @@ struct midend { int pressed_mouse_button; - int tilesize, winwidth, winheight; + int preferred_tilesize, tilesize, winwidth, winheight; }; #define ensure(me) do { \ @@ -130,6 +130,26 @@ midend *midend_new(frontend *fe, const game *ourgame, else me->drawing = NULL; + me->preferred_tilesize = ourgame->preferred_tilesize; + { + /* + * Allow an environment-based override for the default tile + * size by defining a variable along the lines of + * `NET_TILESIZE=15'. + */ + + char buf[80], *e; + int j, k, ts; + + sprintf(buf, "%s_TILESIZE", me->ourgame->name); + for (j = k = 0; buf[j]; j++) + if (!isspace((unsigned char)buf[j])) + buf[k++] = toupper((unsigned char)buf[j]); + buf[k] = '\0'; + if ((e = getenv(buf)) != NULL && sscanf(e, "%d", &ts) == 1 && ts > 0) + me->preferred_tilesize = ts; + } + sfree(randseed); return me; @@ -198,6 +218,17 @@ void midend_size(midend *me, int *x, int *y, int expand) int rx, ry; /* + * We can't set the size on the same drawstate twice. So if + * we've already sized one drawstate, we must throw it away and + * create a new one. + */ + if (me->drawstate && me->tilesize > 0) { + me->ourgame->free_drawstate(me->drawing, me->drawstate); + me->drawstate = me->ourgame->new_drawstate(me->drawing, + me->states[0].state); + } + + /* * Find the tile size that best fits within the given space. If * `expand' is TRUE, we must actually find the _largest_ such * tile size; otherwise, we bound above at the game's preferred @@ -210,7 +241,7 @@ void midend_size(midend *me, int *x, int *y, int expand) me->ourgame->compute_size(me->params, max, &rx, &ry); } while (rx <= *x && ry <= *y); } else - max = me->ourgame->preferred_tilesize + 1; + max = me->preferred_tilesize + 1; min = 1; /* @@ -244,6 +275,11 @@ void midend_set_params(midend *me, game_params *params) me->params = me->ourgame->dup_params(params); } +game_params *midend_get_params(midend *me) +{ + return me->ourgame->dup_params(me->params); +} + static void midend_set_timer(midend *me) { me->timing = (me->ourgame->is_timed && @@ -1131,12 +1167,15 @@ char *midend_solve(midend *me) if (me->statepos < 1) return "No game set up to solve"; /* _shouldn't_ happen! */ - msg = "Solve operation failed"; /* game _should_ overwrite on error */ + msg = NULL; movestr = me->ourgame->solve(me->states[0].state, me->states[me->statepos-1].state, me->aux_info, &msg); - if (!movestr) + if (!movestr) { + if (!msg) + msg = "Solve operation failed"; /* _shouldn't_ happen, but can */ return msg; + } s = me->ourgame->execute_move(me->states[me->statepos-1].state, movestr); assert(s); @@ -1144,8 +1183,11 @@ char *midend_solve(midend *me) * Now enter the solved state as the next move. */ midend_stop_anim(me); - while (me->nstates > me->statepos) + while (me->nstates > me->statepos) { me->ourgame->free_game(me->states[--me->nstates].state); + if (me->states[me->nstates].movestr) + sfree(me->states[me->nstates].movestr); + } ensure(me); me->states[me->nstates].state = s; me->states[me->nstates].movestr = movestr;