}
static char *new_game_desc(game_params *params, random_state *rs,
- game_aux_info **aux, int interactive)
+ char **aux, int interactive)
{
unsigned char *bmp = snewn(params->npegs, unsigned char);
char *ret;
return ret;
}
-static void game_free_aux_info(game_aux_info *aux)
-{
- assert(!"Shouldn't happen");
-}
-
static char *validate_desc(game_params *params, char *desc)
{
unsigned char *bmp;
}
static char *solve_game(game_state *state, game_state *currstate,
- game_aux_info *aux, char **error)
+ char *aux, char **error)
{
return dupstr("S");
}
return NULL;
}
+static int is_markable(game_params *params, pegrow pegs)
+{
+ int i, nset = 0, nrequired, ret = 0;
+ pegrow colcount = new_pegrow(params->ncolours);
+
+ nrequired = params->allow_blank ? 1 : params->npegs;
+
+ for (i = 0; i < params->npegs; i++) {
+ int c = pegs->pegs[i];
+ if (c > 0) {
+ colcount->pegs[c-1]++;
+ nset++;
+ }
+ }
+ if (nset < nrequired) goto done;
+
+ if (!params->allow_multiple) {
+ for (i = 0; i < params->ncolours; i++) {
+ if (colcount->pegs[i] > 1) goto done;
+ }
+ }
+ ret = 1;
+done:
+ free_pegrow(colcount);
+ return ret;
+}
+
struct game_ui {
+ game_params params;
pegrow curr_pegs; /* half-finished current move */
int *holds;
int colour_cur; /* position of up-down colour picker cursor */
{
game_ui *ui = snew(struct game_ui);
memset(ui, 0, sizeof(struct game_ui));
+ ui->params = state->params; /* structure copy */
ui->curr_pegs = new_pegrow(state->params.npegs);
ui->holds = snewn(state->params.npegs, int);
memset(ui->holds, 0, sizeof(int)*state->params.npegs);
sfree(ui);
}
-char *encode_ui(game_ui *ui)
+static char *encode_ui(game_ui *ui)
{
- return NULL;
+ char *ret, *p, *sep;
+ int i;
+
+ /*
+ * For this game it's worth storing the contents of the current
+ * guess.
+ */
+ ret = snewn(40 * ui->curr_pegs->npegs, char);
+ p = ret;
+ sep = "";
+ for (i = 0; i < ui->curr_pegs->npegs; i++) {
+ p += sprintf(p, "%s%d", sep, ui->curr_pegs->pegs[i]);
+ sep = ",";
+ }
+ assert(p - ret < 40 * ui->curr_pegs->npegs);
+ return sresize(ret, p - ret + 1, char);
}
-void decode_ui(game_ui *ui, char *encoding)
+static void decode_ui(game_ui *ui, char *encoding)
{
+ int i;
+ char *p = encoding;
+ for (i = 0; i < ui->curr_pegs->npegs; i++) {
+ ui->curr_pegs->pegs[i] = atoi(p);
+ while (*p && isdigit((unsigned char)*p)) p++;
+ if (*p == ',') p++;
+ }
+ ui->markable = is_markable(&ui->params, ui->curr_pegs);
}
static void game_changed_state(game_ui *ui, game_state *oldstate,
int drag_col, blit_ox, blit_oy;
};
-static int is_markable(game_params *params, pegrow pegs)
-{
- int i, nset = 0, nrequired, ret = 0;
- pegrow colcount = new_pegrow(params->ncolours);
-
- nrequired = params->allow_blank ? 1 : params->npegs;
-
- for (i = 0; i < params->npegs; i++) {
- int c = pegs->pegs[i];
- if (c > 0) {
- colcount->pegs[c-1]++;
- nset++;
- }
- }
- if (nset < nrequired) goto done;
-
- if (!params->allow_multiple) {
- for (i = 0; i < params->ncolours; i++) {
- if (colcount->pegs[i] > 1) goto done;
- }
- }
- ret = 1;
-done:
- free_pegrow(colcount);
- return ret;
-}
-
static void set_peg(game_params *params, game_ui *ui, int peg, int col)
{
ui->curr_pegs->pegs[peg] = col;
set_peg(&from->params, ui, ui->peg_cur, ui->colour_cur+1);
ret = "";
}
+ } else if (button == 'D' || button == 'd' || button == '\b') {
+ ui->display_cur = 1;
+ set_peg(&from->params, ui, ui->peg_cur, 0);
+ ret = "";
} else if (button == 'H' || button == 'h') {
ui->display_cur = 1;
ui->holds[ui->peg_cur] = 1 - ui->holds[ui->peg_cur];
TRUE, game_configure, custom_params,
validate_params,
new_game_desc,
- game_free_aux_info,
validate_desc,
new_game,
dup_game,