diff -u -r tworld-1.3.0/solution.c tworld-1.3.0-ruleswitch/solution.c --- tworld-1.3.0/solution.c 2006-04-16 00:49:27.000000000 +0100 +++ tworld-1.3.0-ruleswitch/solution.c 2009-04-06 19:34:00.000000000 +0100 @@ -544,7 +544,7 @@ /* Locate the solution file for the given data file and open it. */ -static int opensolutionfile(fileinfo *file, char const *datname, int writable) +static int opensolutionfile(fileinfo *file, char const *datname, int ruleset, int writable) { static int savedirchecked = FALSE; char *buf = NULL; @@ -562,9 +562,15 @@ && tolower(datname[n - 2]) == 'a' && tolower(datname[n - 1]) == 't') n -= 4; - xalloc(buf, n + 5); + xalloc(buf, n + 7); memcpy(buf, datname, n); - memcpy(buf + n, ".tws", 5); + /* Use a different filename depending on the ruleset. */ + if(ruleset == Ruleset_MS) + memcpy(buf + n, "-m.tws", 7); + else if(ruleset == Ruleset_Lynx) + memcpy(buf + n, "-l.tws", 7); + else /* Should never happen. */ + memcpy(buf + n, ".tws\0\0", 7); filename = buf; } @@ -597,7 +603,7 @@ series->savefile.name = series->savefilename; if ((!series->savefile.name && (series->gsflags & GSF_NODEFAULTSAVE)) || !opensolutionfile(&series->savefile, - series->filebase, FALSE)) { + series->filebase, series->ruleset, FALSE)) { series->solheaderflags = 0; series->solheadersize = 0; return TRUE; @@ -659,7 +665,7 @@ series->savefile.name = series->savefilename; if (!series->savefile.name && (series->gsflags & GSF_NODEFAULTSAVE)) return TRUE; - if (!opensolutionfile(&series->savefile, series->filebase, TRUE)) + if (!opensolutionfile(&series->savefile, series->filebase, series->ruleset, TRUE)) return FALSE; if (!writesolutionheader(&series->savefile, series->ruleset, diff -u -r tworld-1.3.0/tworld.c tworld-1.3.0-ruleswitch/tworld.c --- tworld-1.3.0/tworld.c 2006-04-17 09:30:17.000000000 +0100 +++ tworld-1.3.0-ruleswitch/tworld.c 2009-04-06 19:39:54.000000000 +0100 @@ -347,6 +347,8 @@ case CmdProceed: *move = CmdProceed; return FALSE; case CmdQuitLevel: *move = CmdQuitLevel; return FALSE; case CmdHelp: *move = CmdHelp; return FALSE; + case CmdEast: *move = CmdEast; return FALSE; + case CmdWest: *move = CmdWest; return FALSE; case CmdQuit: exit(0); } @@ -1303,6 +1305,16 @@ getseriesfromlist(&gs->series, series->list, n); okay = TRUE; break; + } else if (f == CmdEast) { + getseriesfromlist(&gs->series, series->list, n); + gs->series.ruleset = Ruleset_Lynx; + okay = TRUE; + break; + } else if (f == CmdWest) { + getseriesfromlist(&gs->series, series->list, n); + gs->series.ruleset = Ruleset_MS; + okay = TRUE; + break; } else if (f == CmdQuitLevel) { okay = FALSE; break;