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