2 * Copyright (c) 1991, 1993
3 * The Regents of the University of California. All rights reserved.
5 * The game adventure was originally written in Fortran by Will Crowther
6 * and Don Woods. It was later translated to C and enhanced by Jim
7 * Gillogly. This code is derived from software contributed to Berkeley
8 * by Jim Gillogly at The Rand Corporation.
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 * 3. All advertising materials mentioning features or use of this software
19 * must display the following acknowledgement:
20 * This product includes software developed by the University of
21 * California, Berkeley and its contributors.
22 * 4. Neither the name of the University nor the names of its contributors
23 * may be used to endorse or promote products derived from this software
24 * without specific prior written permission.
26 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
27 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
30 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
31 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
32 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
33 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
34 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
35 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
41 static char sccsid[] = "@(#)save.c 8.1 (Berkeley) 5/31/93";
43 static const char rcsid[] =
49 #include <sys/types.h>
58 struct savestruct save_array[] =
60 &abbnum, sizeof(abbnum),
61 &attack, sizeof(attack),
62 &blklin, sizeof(blklin),
63 &bonus, sizeof(bonus),
64 &chloc, sizeof(chloc),
65 &chloc2, sizeof(chloc2),
66 &clock1, sizeof(clock1),
67 &clock2, sizeof(clock2),
68 &closed, sizeof(closed),
69 &closng, sizeof(closng),
70 &daltlc, sizeof(daltlc),
72 &detail, sizeof(detail),
73 &dflag, sizeof(dflag),
74 &dkill, sizeof(dkill),
75 &dtotal, sizeof(dtotal),
76 &foobar, sizeof(foobar),
77 &gaveup, sizeof(gaveup),
78 &holdng, sizeof(holdng),
79 &iwest, sizeof(iwest),
82 &knfloc, sizeof(knfloc),
84 &latncy, sizeof(latncy),
85 &limit, sizeof(limit),
86 &lmwarn, sizeof(lmwarn),
88 &maxdie, sizeof(maxdie),
89 &mxscor, sizeof(mxscor),
90 &newloc, sizeof(newloc),
91 &numdie, sizeof(numdie),
93 &oldlc2, sizeof(oldlc2),
94 &oldloc, sizeof(oldloc),
95 &panic, sizeof(panic),
96 &saved, sizeof(saved),
97 &savet, sizeof(savet),
98 &scorng, sizeof(scorng),
100 &stick, sizeof(stick),
101 &tally, sizeof(tally),
102 &tally2, sizeof(tally2),
104 &turns, sizeof(turns),
108 &wzdark, sizeof(wzdark),
110 atloc, sizeof(atloc),
112 dseen, sizeof(dseen),
113 fixed, sizeof(fixed),
114 hinted, sizeof(hinted),
115 linkx, sizeof(linkx),
116 odloc, sizeof(odloc),
117 place, sizeof(place),
124 save(outfile) /* Two passes on data: first to get checksum, second */
125 const char *outfile; /* to output the data using checksum to start random #s */
128 struct savestruct *p;
134 for (p = save_array; p->address != NULL; p++)
135 sum = crc(p->address, p->width);
138 if ((out = fopen(outfile, "wb")) == NULL)
141 "Hmm. The name \"%s\" appears to be magically blocked.\n",
146 fwrite(&sum, sizeof(sum), 1, out); /* Here's the random() key */
147 for (p = save_array; p->address != NULL; p++)
149 for (s = p->address, i = 0; i < p->width; i++, s++)
150 *s = (*s ^ random()) & 0xFF; /* Lightly encrypt */
151 fwrite(p->address, p->width, 1, out);
161 struct savestruct *p;
166 if ((in = fopen(infile, "rb")) == NULL)
169 "Hmm. The file \"%s\" appears to be magically blocked.\n",
174 fread(&sum, sizeof(sum), 1, in); /* Get the seed */
176 for (p = save_array; p->address != NULL; p++)
178 fread(p->address, p->width, 1, in);
179 for (s = p->address, i = 0; i < p->width; i++, s++)
180 *s = (*s ^ random()) & 0xFF; /* Lightly decrypt */
184 crc_start(); /* See if she cheated */
185 for (p = save_array; p->address != NULL; p++)
186 cksum = crc(p->address, p->width);
187 if (sum != cksum) /* Tsk tsk */
188 return 2; /* Altered the file */
189 /* We successfully restored, so this really was a save file */
190 /* Get rid of the file, but don't bother checking that we did */