+char *midend_game_id(midend_data *me, char *id, int def_seed)
+{
+ char *error, *par, *seed;
+ game_params *params;
+
+ seed = strchr(id, ':');
+
+ if (seed) {
+ /*
+ * We have a colon separating parameters from game seed. So
+ * `par' now points to the parameters string, and `seed' to
+ * the seed string.
+ */
+ *seed++ = '\0';
+ par = id;
+ } else {
+ /*
+ * We only have one string. Depending on `def_seed', we
+ * take it to be either parameters or seed.
+ */
+ if (def_seed) {
+ seed = id;
+ par = NULL;
+ } else {
+ seed = NULL;
+ par = id;
+ }
+ }
+
+ if (par) {
+ params = decode_params(par);
+ error = validate_params(params);
+ if (error) {
+ free_params(params);
+ return error;
+ }
+ free_params(me->params);
+ me->params = params;
+ }
+
+ if (seed) {
+ error = validate_seed(me->params, seed);
+ if (error)
+ return error;
+
+ sfree(me->seed);
+ me->seed = dupstr(seed);
+ me->fresh_seed = TRUE;
+ }
+
+ return NULL;
+}
+