#include <stdlib.h>
#include <string.h>
#include <assert.h>
+#include <ctype.h>
#include <math.h>
#include "puzzles.h"
return ret;
}
+game_params *decode_params(char const *string)
+{
+ game_params *ret = default_params();
+
+ switch (*string) {
+ case 't': ret->solid = TETRAHEDRON; string++; break;
+ case 'c': ret->solid = CUBE; string++; break;
+ case 'o': ret->solid = OCTAHEDRON; string++; break;
+ case 'i': ret->solid = ICOSAHEDRON; string++; break;
+ default: break;
+ }
+ ret->d1 = ret->d2 = atoi(string);
+ while (*string && isdigit(*string)) string++;
+ if (*string == 'x') {
+ string++;
+ ret->d2 = atoi(string);
+ }
+
+ return ret;
+}
+
+char *encode_params(game_params *params)
+{
+ char data[256];
+
+ assert(params->solid >= 0 && params->solid < 4);
+ sprintf(data, "%c%dx%d", "tcoi"[params->solid], params->d1, params->d2);
+
+ return dupstr(data);
+}
+
static void enum_grid_squares(game_params *params,
void (*callback)(void *, struct grid_square *),
void *ctx)
/*
* Choose a non-blue square for the polyhedron.
*/
- sprintf(p, ":%d", data.gridptrs[0][random_upto(rs, m)]);
+ sprintf(p, ",%d", data.gridptrs[0][random_upto(rs, m)]);
sfree(data.gridptrs[0]);
sfree(flags);
/* NB if seed[j]=='\0' that will also be caught here, so we're safe */
}
- if (seed[i] != ':')
- return "Expected ':' after hex digits";
+ if (seed[i] != ',')
+ return "Expected ',' after hex digits";
i++;
do {
if (seed[i] < '0' || seed[i] > '9')
- return "Expected decimal integer after ':'";
+ return "Expected decimal integer after ','";
i++;
} while (seed[i]);
j = 8;
}
- if (*p == ':')
+ if (*p == ',')
p++;
state->current = atoi(p);
#include <stdlib.h>
#include <string.h>
#include <assert.h>
+#include <ctype.h>
#include <math.h>
#include "puzzles.h"
return ret;
}
+game_params *decode_params(char const *string)
+{
+ game_params *ret = default_params();
+
+ ret->w = ret->h = atoi(string);
+ while (*string && isdigit(*string)) string++;
+ if (*string == 'x') {
+ string++;
+ ret->h = atoi(string);
+ }
+
+ return ret;
+}
+
+char *encode_params(game_params *params)
+{
+ char data[256];
+
+ sprintf(data, "%dx%d", params->w, params->h);
+
+ return dupstr(data);
+}
+
config_item *game_configure(game_params *params)
{
config_item *ret;
config_item *midend_get_config(midend_data *me, int which, char **wintitle)
{
- char *titlebuf;
+ char *titlebuf, *parstr;
config_item *ret;
titlebuf = snewn(40 + strlen(game_name), char);
ret[0].type = C_STRING;
ret[0].name = "Game ID";
ret[0].ival = 0;
- ret[0].sval = dupstr(me->seed);
+ /*
+ * The text going in here will be a string encoding of the
+ * parameters, plus a colon, plus the game seed. This is a
+ * full game ID.
+ */
+ parstr = encode_params(me->params);
+ ret[0].sval = snewn(strlen(parstr) + strlen(me->seed) + 2, char);
+ sprintf(ret[0].sval, "%s:%s", parstr, me->seed);
+ sfree(parstr);
ret[1].type = C_END;
ret[1].name = ret[1].sval = NULL;
char *midend_set_config(midend_data *me, int which, config_item *cfg)
{
- char *error;
+ char *error, *p;
game_params *params;
switch (which) {
break;
case CFG_SEED:
- error = validate_seed(me->params, cfg[0].sval);
+
+ /*
+ * The game ID will often (in fact, mostly) have a prefix
+ * containing a string-encoded parameter specification
+ * followed by a colon. So first find the colon, and then
+ * split the string up.
+ */
+ p = strchr(cfg[0].sval, ':');
+
+ if (p) {
+ *p++ = '\0'; /* p now points to game seed */
+ params = decode_params(cfg[0].sval);
+ error = validate_params(params);
+ if (error) {
+ free_params(params);
+ return error;
+ }
+ free_params(me->params);
+ me->params = params;
+ } else
+ p = cfg[0].sval;
+
+ error = validate_seed(me->params, p);
if (error)
return error;
sfree(me->seed);
- me->seed = dupstr(cfg[0].sval);
+ me->seed = dupstr(p);
me->fresh_seed = TRUE;
break;
#include <stdlib.h>
#include <string.h>
#include <assert.h>
+#include <ctype.h>
#include <math.h>
#include "puzzles.h"
return ret;
}
+game_params *decode_params(char const *string)
+{
+ game_params *ret = default_params();
+ char const *p = string;
+
+ ret->width = atoi(p);
+ while (*p && isdigit(*p)) p++;
+ if (*p == 'x') {
+ p++;
+ ret->height = atoi(p);
+ while (*p && isdigit(*p)) p++;
+ if ( (ret->wrapping = (*p == 'w')) != 0 )
+ p++;
+ if (*p == 'b')
+ ret->barrier_probability = atof(p+1);
+ } else {
+ ret->height = ret->width;
+ }
+
+ return ret;
+}
+
+char *encode_params(game_params *params)
+{
+ char ret[400];
+ int len;
+
+ len = sprintf(ret, "%dx%d", params->width, params->height);
+ if (params->wrapping)
+ ret[len++] = 'w';
+ if (params->barrier_probability)
+ len += sprintf(ret+len, "b%g", params->barrier_probability);
+ assert(len < lenof(ret));
+ ret[len] = '\0';
+
+ return dupstr(ret);
+}
+
config_item *game_configure(game_params *params)
{
config_item *ret;
#include <stdlib.h>
#include <string.h>
#include <assert.h>
+#include <ctype.h>
#include <math.h>
#include "puzzles.h"
return ret;
}
+game_params *decode_params(char const *string)
+{
+ game_params *ret = snew(game_params);
+
+ ret->FIXME = 0;
+
+ return ret;
+}
+
+char *encode_params(game_params *params)
+{
+ return dupstr("FIXME");
+}
+
config_item *game_configure(game_params *params)
{
return NULL;
const int game_can_configure;
game_params *default_params(void);
int game_fetch_preset(int i, char **name, game_params **params);
+game_params *decode_params(char const *string);
+char *encode_params(game_params *);
void free_params(game_params *params);
game_params *dup_params(game_params *params);
config_item *game_configure(game_params *params);
#include <stdlib.h>
#include <string.h>
#include <assert.h>
+#include <ctype.h>
#include <math.h>
#include "puzzles.h"
return ret;
}
+game_params *decode_params(char const *string)
+{
+ game_params *ret = default_params();
+
+ ret->w = ret->h = atoi(string);
+ while (*string && isdigit(*string)) string++;
+ if (*string == 'x') {
+ string++;
+ ret->h = atoi(string);
+ }
+
+ return ret;
+}
+
+char *encode_params(game_params *params)
+{
+ char data[256];
+
+ sprintf(data, "%dx%d", params->w, params->h);
+
+ return dupstr(data);
+}
+
config_item *game_configure(game_params *params)
{
config_item *ret;
#include <stdlib.h>
#include <string.h>
#include <assert.h>
+#include <ctype.h>
#include <math.h>
#include "puzzles.h"
return ret;
}
+game_params *decode_params(char const *string)
+{
+ game_params *ret = default_params();
+
+ ret->w = ret->h = atoi(string);
+ while (*string && isdigit(*string)) string++;
+ if (*string == 'x') {
+ string++;
+ ret->h = atoi(string);
+ }
+
+ return ret;
+}
+
+char *encode_params(game_params *params)
+{
+ char data[256];
+
+ sprintf(data, "%dx%d", params->w, params->h);
+
+ return dupstr(data);
+}
+
config_item *game_configure(game_params *params)
{
config_item *ret;