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
40 static char sccsid[] = "@(#)save.c 8.1 (Berkeley) 5/31/93";
45 #include <sys/types.h>
54 struct savestruct save_array[] =
56 &abbnum, sizeof(abbnum),
57 &attack, sizeof(attack),
58 &blklin, sizeof(blklin),
59 &bonus, sizeof(bonus),
60 &chloc, sizeof(chloc),
61 &chloc2, sizeof(chloc2),
62 &clock1, sizeof(clock1),
63 &clock2, sizeof(clock2),
64 &closed, sizeof(closed),
65 &closng, sizeof(closng),
66 &daltlc, sizeof(daltlc),
68 &detail, sizeof(detail),
69 &dflag, sizeof(dflag),
70 &dkill, sizeof(dkill),
71 &dtotal, sizeof(dtotal),
72 &foobar, sizeof(foobar),
73 &gaveup, sizeof(gaveup),
74 &holdng, sizeof(holdng),
75 &iwest, sizeof(iwest),
78 &knfloc, sizeof(knfloc),
80 &latncy, sizeof(latncy),
81 &limit, sizeof(limit),
82 &lmwarn, sizeof(lmwarn),
84 &maxdie, sizeof(maxdie),
85 &mxscor, sizeof(mxscor),
86 &newloc, sizeof(newloc),
87 &numdie, sizeof(numdie),
89 &oldlc2, sizeof(oldlc2),
90 &oldloc, sizeof(oldloc),
91 &panic, sizeof(panic),
92 &saved, sizeof(saved),
93 &savet, sizeof(savet),
94 &scorng, sizeof(scorng),
96 &stick, sizeof(stick),
97 &tally, sizeof(tally),
98 &tally2, sizeof(tally2),
100 &turns, sizeof(turns),
104 &wzdark, sizeof(wzdark),
106 atloc, sizeof(atloc),
108 dseen, sizeof(dseen),
109 fixed, sizeof(fixed),
110 hinted, sizeof(hinted),
111 linkx, sizeof(linkx),
112 odloc, sizeof(odloc),
113 place, sizeof(place),
120 save(outfile) /* Two passes on data: first to get checksum, second */
121 const char *outfile; /* to output the data using checksum to start random #s */
124 struct savestruct *p;
130 for (p = save_array; p->address != NULL; p++)
131 sum = crc(p->address, p->width);
134 if ((out = fopen(outfile, "wb")) == NULL)
137 "Hmm. The name \"%s\" appears to be magically blocked.\n",
142 fwrite(&sum, sizeof(sum), 1, out); /* Here's the random() key */
143 for (p = save_array; p->address != NULL; p++)
145 for (s = p->address, i = 0; i < p->width; i++, s++)
146 *s = (*s ^ random()) & 0xFF; /* Lightly encrypt */
147 fwrite(p->address, p->width, 1, out);
157 struct savestruct *p;
162 if ((in = fopen(infile, "rb")) == NULL)
165 "Hmm. The file \"%s\" appears to be magically blocked.\n",
170 fread(&sum, sizeof(sum), 1, in); /* Get the seed */
172 for (p = save_array; p->address != NULL; p++)
174 fread(p->address, p->width, 1, in);
175 for (s = p->address, i = 0; i < p->width; i++, s++)
176 *s = (*s ^ random()) & 0xFF; /* Lightly decrypt */
180 crc_start(); /* See if she cheated */
181 for (p = save_array; p->address != NULL; p++)
182 cksum = crc(p->address, p->width);
183 if (sum != cksum) /* Tsk tsk */
184 return 2; /* Altered the file */
185 /* We successfully restored, so this really was a save file */
186 /* Get rid of the file, but don't bother checking that we did */