summaryrefslogtreecommitdiffstats
path: root/adventure/save.c
diff options
context:
space:
mode:
Diffstat (limited to 'adventure/save.c')
-rw-r--r--adventure/save.c184
1 files changed, 184 insertions, 0 deletions
diff --git a/adventure/save.c b/adventure/save.c
new file mode 100644
index 00000000..8dea684b
--- /dev/null
+++ b/adventure/save.c
@@ -0,0 +1,184 @@
+/*-
+ * Copyright (c) 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * The game adventure was originally written in Fortran by Will Crowther
+ * and Don Woods. It was later translated to C and enhanced by Jim
+ * Gillogly. This code is derived from software contributed to Berkeley
+ * by Jim Gillogly at The Rand Corporation.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the University of
+ * California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef lint
+static char sccsid[] = "@(#)save.c 8.1 (Berkeley) 5/31/93";
+#endif /* not lint */
+
+#include <stdio.h>
+#include "hdr.h"
+
+struct savestruct
+{
+ void *address;
+ int width;
+};
+
+struct savestruct save_array[] =
+{
+ &abbnum, sizeof(abbnum),
+ &attack, sizeof(attack),
+ &blklin, sizeof(blklin),
+ &bonus, sizeof(bonus),
+ &chloc, sizeof(chloc),
+ &chloc2, sizeof(chloc2),
+ &clock1, sizeof(clock1),
+ &clock2, sizeof(clock2),
+ &closed, sizeof(closed),
+ &closng, sizeof(closng),
+ &daltlc, sizeof(daltlc),
+ &demo, sizeof(demo),
+ &detail, sizeof(detail),
+ &dflag, sizeof(dflag),
+ &dkill, sizeof(dkill),
+ &dtotal, sizeof(dtotal),
+ &foobar, sizeof(foobar),
+ &gaveup, sizeof(gaveup),
+ &holdng, sizeof(holdng),
+ &iwest, sizeof(iwest),
+ &k, sizeof(k),
+ &k2, sizeof(k2),
+ &knfloc, sizeof(knfloc),
+ &kq, sizeof(kq),
+ &latncy, sizeof(latncy),
+ &limit, sizeof(limit),
+ &lmwarn, sizeof(lmwarn),
+ &loc, sizeof(loc),
+ &maxdie, sizeof(maxdie),
+ &mxscor, sizeof(mxscor),
+ &newloc, sizeof(newloc),
+ &numdie, sizeof(numdie),
+ &obj, sizeof(obj),
+ &oldlc2, sizeof(oldlc2),
+ &oldloc, sizeof(oldloc),
+ &panic, sizeof(panic),
+ &saved, sizeof(saved),
+ &savet, sizeof(savet),
+ &scorng, sizeof(scorng),
+ &spk, sizeof(spk),
+ &stick, sizeof(stick),
+ &tally, sizeof(tally),
+ &tally2, sizeof(tally2),
+ &tkk, sizeof(tkk),
+ &turns, sizeof(turns),
+ &verb, sizeof(verb),
+ &wd1, sizeof(wd1),
+ &wd2, sizeof(wd2),
+ &wzdark, sizeof(wzdark),
+ &yea, sizeof(yea),
+ atloc, sizeof(atloc),
+ dloc, sizeof(dloc),
+ dseen, sizeof(dseen),
+ fixed, sizeof(fixed),
+ hinted, sizeof(hinted),
+ link, sizeof(link),
+ odloc, sizeof(odloc),
+ place, sizeof(place),
+ prop, sizeof(prop),
+ tk, sizeof(tk),
+
+ NULL, 0
+};
+
+save(outfile) /* Two passes on data: first to get checksum, second */
+char *outfile; /* to output the data using checksum to start random #s */
+{
+ FILE *out;
+ struct savestruct *p;
+ char *s;
+ long sum;
+ int i;
+
+ crc_start();
+ for (p = save_array; p->address != NULL; p++)
+ sum = crc(p->address, p->width);
+ srandom((int) sum);
+
+ if ((out = fopen(outfile, "wb")) == NULL)
+ {
+ fprintf(stderr,
+ "Hmm. The name \"%s\" appears to be magically blocked.\n",
+ outfile);
+ return 1;
+ }
+ fwrite(&sum, sizeof(sum), 1, out); /* Here's the random() key */
+ for (p = save_array; p->address != NULL; p++)
+ {
+ for (s = p->address, i = 0; i < p->width; i++, s++)
+ *s = (*s ^ random()) & 0xFF; /* Lightly encrypt */
+ fwrite(p->address, p->width, 1, out);
+ }
+ fclose(out);
+ return 0;
+}
+
+restore(infile)
+char *infile;
+{
+ FILE *in;
+ struct savestruct *p;
+ char *s;
+ long sum, cksum;
+ int i;
+
+ if ((in = fopen(infile, "rb")) == NULL)
+ {
+ fprintf(stderr,
+ "Hmm. The file \"%s\" appears to be magically blocked.\n",
+ infile);
+ return 1;
+ }
+ fread(&sum, sizeof(sum), 1, in); /* Get the seed */
+ srandom((int) sum);
+ for (p = save_array; p->address != NULL; p++)
+ {
+ fread(p->address, p->width, 1, in);
+ for (s = p->address, i = 0; i < p->width; i++, s++)
+ *s = (*s ^ random()) & 0xFF; /* Lightly decrypt */
+ }
+ fclose(in);
+
+ crc_start(); /* See if she cheated */
+ for (p = save_array; p->address != NULL; p++)
+ cksum = crc(p->address, p->width);
+ if (sum != cksum) /* Tsk tsk */
+ return 2; /* Altered the file */
+ /* We successfully restored, so this really was a save file */
+ /* Get rid of the file, but don't bother checking that we did */
+ return 0;
+}