const game *ourgame;
char *seed;
+ game_aux_info *aux_info;
int fresh_seed;
int nstates, statesize, statepos;
me->states = NULL;
me->params = ourgame->default_params();
me->seed = NULL;
+ me->aux_info = NULL;
me->fresh_seed = FALSE;
me->drawstate = NULL;
me->oldstate = NULL;
{
sfree(me->states);
sfree(me->seed);
+ if (me->aux_info)
+ me->ourgame->free_aux_info(me->aux_info);
me->ourgame->free_params(me->params);
sfree(me);
}
if (!me->fresh_seed) {
sfree(me->seed);
- me->seed = me->ourgame->new_seed(me->params, me->random);
+ if (me->aux_info)
+ me->ourgame->free_aux_info(me->aux_info);
+ me->aux_info = NULL;
+ me->seed = me->ourgame->new_seed(me->params, me->random,
+ &me->aux_info);
} else
me->fresh_seed = FALSE;
float *ret;
if (me->nstates == 0) {
- char *seed = me->ourgame->new_seed(me->params, me->random);
+ game_aux_info *aux = NULL;
+ char *seed = me->ourgame->new_seed(me->params, me->random, &aux);
state = me->ourgame->new_game(me->params, seed);
sfree(seed);
+ if (aux)
+ me->ourgame->free_aux_info(aux);
} else
state = me->states[0];
sfree(me->seed);
me->seed = dupstr(seed);
me->fresh_seed = TRUE;
+ if (me->aux_info)
+ me->ourgame->free_aux_info(me->aux_info);
+ me->aux_info = NULL;
}
return NULL;
else
return NULL;
}
+
+char *midend_solve(midend_data *me)
+{
+ game_state *s;
+ char *msg;
+
+ if (!me->ourgame->can_solve)
+ return "This game does not support the Solve operation";
+
+ if (me->statepos < 1)
+ return "No game set up to solve"; /* _shouldn't_ happen! */
+
+ msg = "Solve operation failed"; /* game _should_ overwrite on error */
+ s = me->ourgame->solve(me->states[0], me->aux_info, &msg);
+ if (!s)
+ return msg;
+
+ /*
+ * Now enter the solved state as the next move.~|~
+ */
+ midend_stop_anim(me);
+ while (me->nstates > me->statepos)
+ me->ourgame->free_game(me->states[--me->nstates]);
+ ensure(me);
+ me->states[me->nstates] = s;
+ me->statepos = ++me->nstates;
+ me->anim_time = 0.0;
+ midend_finish_move(me);
+ midend_redraw(me);
+ activate_timer(me->frontend);
+ return NULL;
+}