ANSIfication; bug report 4.3BSD/bin/223
[unix-history] / usr / src / games / phantasia / setup.c
CommitLineData
386bc5c5
KB
1/*
2 * setup.c - set up all files for Phantasia
3 */
4#include "include.h"
5#include <sys/types.h>
6#include <sys/stat.h>
7/*\f*/
8/************************************************************************
9/
10/ FUNCTION NAME: main()
11/
12/ FUNCTION: setup files for Phantasia 3.3.2
13/
14/ AUTHOR: E. A. Estes, 12/4/85
15/
16/ ARGUMENTS: none
17/
18/ RETURN VALUE: none
19/
20/ MODULES CALLED: time(), exit(), stat(), Error(), creat(), close(), fopen(),
21/ fgets(), floor(), srandom(), umask(), drandom(), strcpy(), getuid(),
22/ unlink(), fwrite(), fclose(), sscanf(), printf(), strlen(), fprintf()
23/
24/ GLOBAL INPUTS: Peoplefile[], Curmonster, _iob[], Databuf[], *Monstfp,
25/ Lastdead[], Goldfile[], Voidfile[], Motdfile[], Messfile[], Scorefile[],
26/ Enemyfile[], Monstfile[], Enrgyvoid
27/
28/ GLOBAL OUTPUTS: Curmonster, Databuf[], *Monstfp, Enrgyvoid
29/
30/ DESCRIPTION:
31/
32/ This program tries to verify the parameters specified in
33/ the Makefile.
34/
35/ Create all necessary files. Note that nothing needs to be
36/ put in these files.
37/ Also, the monster binary data base is created here.
38/
39/************************************************************************/
40
41main()
42{
43FILE *fp; /* for opening files */
44struct stat fbuf; /* for getting files statistics */
45register char **filename; /* for pointing to file names */
46register int fd; /* file descriptor */
47static char *files[] = /* all files to create */
48 {
49 Monstfile,
50 Peoplefile,
51 Messfile,
52 Lastdead,
53 Motdfile,
54 Goldfile,
55 Voidfile,
56 Scorefile,
57#ifdef ENEMY
58 Enemyfile,
59#endif
60 (char *) NULL
61 };
62
63 srandom((unsigned) time((long *) NULL)); /* prime random numbers */
64
65 umask(0117); /* only owner can read/write created files */
66
67 if (getuid() != UID)
68 fprintf(stderr, "Warning: UID (%d) is not equal to current uid.\n", UID);
69
70 /* check Phantasia destination directory */
71 if (stat(DEST", &fbuf) < 0)
72 /* not found */
73 {
74 Error("Cannot stat %s.\n", DEST");
75 exit(1);
76 /*NOTREACHED*/
77 }
78
79 if ((fbuf.st_mode & S_IFDIR) == 0)
80 /* not a directory */
81 Error("%s is not a directory.\n", DEST");
82 /*NOTREACHED*/
83
84 /* try to create data files */
85 filename = &files[0];
86 while (*filename != NULL)
87 /* create each file */
88 {
89 if (stat(*filename, &fbuf) == 0)
90 /* file exists; remove it */
91 {
92 if (*filename == Peoplefile)
93 /* do not reset character file if it already exists */
94 {
95 ++filename;
96 continue;
97 }
98
99 if (unlink(*filename) < 0)
100 Error("Cannot unlink %s.\n", *filename);
101 /*NOTREACHED*/
102 }
103
104 if ((fd = creat(*filename, 0660)) < 0)
105 Error("Cannot create %s.\n", *filename);
106 /*NOTREACHED*/
107
108 close(fd); /* close newly created file */
109
110 ++filename; /* process next file */
111 }
112
113 /* put holy grail info into energy void file */
114 Enrgyvoid.ev_active = TRUE;
115 Enrgyvoid.ev_x = ROLL(-1.0e6, 2.0e6);
116 Enrgyvoid.ev_y = ROLL(-1.0e6, 2.0e6);
117 if ((fp = fopen(Voidfile, "w")) == NULL)
118 Error("Cannot update %s.\n", Voidfile);
119 else
120 {
121 fwrite(&Enrgyvoid, SZ_VOIDSTRUCT, 1, fp);
122 fclose(fp);
123 }
124
125 /* create binary monster data base */
126 if ((Monstfp = fopen(Monstfile, "w")) == NULL)
127 Error("Cannot update %s.\n", Monstfile);
128 else
129 {
130 if ((fp = fopen("monsters.asc", "r")) == NULL)
131 {
132 fclose(Monstfp);
133 Error("cannot open %s to create monster database.\n", "monsters.asc");
134 }
135 else
136 {
137 Curmonster.m_o_strength =
138 Curmonster.m_o_speed =
139 Curmonster.m_maxspeed =
140 Curmonster.m_o_energy =
141 Curmonster.m_melee =
142 Curmonster.m_skirmish = 0.0;
143
144 while (fgets(Databuf, SZ_DATABUF, fp) != NULL)
145 /* read in text file, convert to binary */
146 {
4266ed4a 147 sscanf(&Databuf[24], "%lf%lf%lf%lf%lf%d%d%lf",
386bc5c5
KB
148 &Curmonster.m_strength, &Curmonster.m_brains,
149 &Curmonster.m_speed, &Curmonster.m_energy,
150 &Curmonster.m_experience, &Curmonster.m_treasuretype,
151 &Curmonster.m_type, &Curmonster.m_flock);
152 Databuf[24] = '\0';
153 strcpy(Curmonster.m_name, Databuf);
154 fwrite((char *) &Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp);
155 }
156 fclose(fp);
157 fclose(Monstfp);
158 }
159 }
160
8e207e9f 161#ifdef MAKE_INSTALLS_THIS_AND_DOESNT_ANSWER_QUESTIONS
386bc5c5
KB
162 /* write to motd file */
163 printf("One line 'motd' ? ");
164 if (fgets(Databuf, SZ_DATABUF, stdin) == NULL)
165 Databuf[0] = '\0';
166 if ((fp = fopen(Motdfile, "w")) == NULL)
167 Error("Cannot update %s.\n", Motdfile);
168 else
169 {
170 fwrite(Databuf, sizeof(char), strlen(Databuf), fp);
171 fclose(fp);
172 }
8e207e9f 173#endif
386bc5c5
KB
174
175 /* report compile-time options */
176 printf("Compiled options:\n\n");
177 printf("Phantasia destination directory: %s\n", DEST");
178 printf("Wizard: %s UID: %d\n", WIZARD, UID);
179
180#ifdef OK_TO_PLAY
181 printf("Restricted playing enabled.\n");
182#else
183 printf("Playing unrestricted.\n");
184#endif
185
186#ifdef ENEMY
187 printf("Enemy list enabled.\n");
188#else
189 printf("Enemy list disabled.\n");
190#endif
191
192#ifdef SHELL
193 printf("Shell escapes enabled. Default shell: %s\n", SHELL);
194#else
195 printf("Shell escapes disabled.\n");
196#endif
197
198#ifdef BSD41
199 printf("Compiled for BSD 4.1\n");
200#endif
201
202#ifdef BSD42
203 printf("Compiled for BSD 4.2\n");
204#endif
205
206#ifdef SYS3
207 printf("Compiled for System III\n");
208#endif
209
210#ifdef SYS5
211 printf("Compiled for System V\n");
212#endif
213
214 exit(0);
215 /*NOTREACHED*/
216}
217/*\f*/
218/************************************************************************
219/
220/ FUNCTION NAME: Error()
221/
222/ FUNCTION: print an error message, and exit
223/
224/ AUTHOR: E. A. Estes, 12/4/85
225/
226/ ARGUMENTS:
227/ char *str - format string for printf()
228/ char *file - file which caused error
229/
230/ RETURN VALUE: none
231/
232/ MODULES CALLED: exit(), perror(), fprintf()
233/
234/ GLOBAL INPUTS: _iob[]
235/
236/ GLOBAL OUTPUTS: none
237/
238/ DESCRIPTION:
239/ Print an error message, then exit.
240/
241/************************************************************************/
242
243Error(str, file)
244char *str, *file;
245{
246 fprintf(stderr, "Error: ");
247 fprintf(stderr, str, file);
248 perror(file);
249 exit(1);
250 /*NOTREACHED*/
251}
252/*\f*/
253/************************************************************************
254/
255/ FUNCTION NAME: drandom()
256/
257/ FUNCTION: return a random number
258/
259/ AUTHOR: E. A. Estes, 2/7/86
260/
261/ ARGUMENTS: none
262/
263/ RETURN VALUE: none
264/
265/ MODULES CALLED: random()
266/
267/ GLOBAL INPUTS: none
268/
269/ GLOBAL OUTPUTS: none
270/
271/ DESCRIPTION:
272/
273/************************************************************************/
274
275double
276drandom()
277{
278 if (sizeof(int) != 2)
279 return((double) (random() & 0x7fff) / 32768.0);
280 else
281 return((double) random() / 32768.0);
282}