xref: /openbsd/games/phantasia/setup.c (revision df69c215)
1*df69c215Sderaadt /*	$OpenBSD: setup.c,v 1.20 2019/06/28 13:32:52 deraadt Exp $	*/
2df930be7Sderaadt /*	$NetBSD: setup.c,v 1.4 1995/04/24 12:24:41 cgd Exp $	*/
3df930be7Sderaadt 
4df930be7Sderaadt /*
5df930be7Sderaadt  * setup.c - set up all files for Phantasia
6df930be7Sderaadt  */
734278d36Sguenther #include <sys/stat.h>
8010ae45bSmestre 
9c4b20be9Spjanzen #include <fcntl.h>
10010ae45bSmestre #include <math.h>
11010ae45bSmestre #include <stdbool.h>
12010ae45bSmestre #include <stdint.h>
13010ae45bSmestre #include <stdlib.h>
14010ae45bSmestre #include <string.h>
15010ae45bSmestre #include <unistd.h>
16010ae45bSmestre 
17010ae45bSmestre #include "macros.h"
18010ae45bSmestre #include "pathnames.h"
19010ae45bSmestre #include "phantdefs.h"
20010ae45bSmestre #include "phantglobs.h"
21c4b20be9Spjanzen 
227ad55f55Smestre __dead void Error(char *, char *);
23c4b20be9Spjanzen 
24df930be7Sderaadt /**/
25df930be7Sderaadt /************************************************************************
26df930be7Sderaadt /
27df930be7Sderaadt / FUNCTION NAME: main()
28df930be7Sderaadt /
29df930be7Sderaadt / FUNCTION: setup files for Phantasia 3.3.2
30df930be7Sderaadt /
31df930be7Sderaadt / AUTHOR: E. A. Estes, 12/4/85
32df930be7Sderaadt /
33df930be7Sderaadt / ARGUMENTS: none
34df930be7Sderaadt /
35df930be7Sderaadt / RETURN VALUE: none
36df930be7Sderaadt /
3766e49541Snaddy / MODULES CALLED: exit(), stat(), Error(), open(), close(), fopen(),
3866e49541Snaddy /	fgets(), floor(), umask(), strlcpy(),
39df930be7Sderaadt /	unlink(), fwrite(), fclose(), sscanf(), printf(), strlen(), fprintf()
40df930be7Sderaadt /
41df930be7Sderaadt / GLOBAL INPUTS: Curmonster, _iob[], Databuf[], *Monstfp, Enrgyvoid
42df930be7Sderaadt /
43df930be7Sderaadt / GLOBAL OUTPUTS: Curmonster, Databuf[], *Monstfp, Enrgyvoid
44df930be7Sderaadt /
45df930be7Sderaadt / DESCRIPTION:
46df930be7Sderaadt /
47df930be7Sderaadt /	This program tries to verify the parameters specified in
48df930be7Sderaadt /	the Makefile.
49df930be7Sderaadt /
50df930be7Sderaadt /	Create all necessary files.  Note that nothing needs to be
51df930be7Sderaadt /	put in these files.
52df930be7Sderaadt /	Also, the monster binary data base is created here.
53df930be7Sderaadt /
54db690800Sfn *************************************************************************/
55df930be7Sderaadt 
56df930be7Sderaadt static char *files[] = {		/* all files to create */
57df930be7Sderaadt 	_PATH_MONST,
58df930be7Sderaadt 	_PATH_PEOPLE,
59df930be7Sderaadt 	_PATH_MESS,
60df930be7Sderaadt 	_PATH_LASTDEAD,
61df930be7Sderaadt 	_PATH_MOTD,
62df930be7Sderaadt 	_PATH_GOLD,
63df930be7Sderaadt 	_PATH_VOID,
64df930be7Sderaadt 	_PATH_SCORE,
65df930be7Sderaadt 	NULL,
66df930be7Sderaadt };
67df930be7Sderaadt 
68df930be7Sderaadt char *monsterfile="monsters.asc";
69df930be7Sderaadt 
70df930be7Sderaadt int
main(int argc,char * argv[])7185d02bc0Stb main(int argc, char *argv[])
72df930be7Sderaadt {
7397419aa0Spjanzen 	char	**filename;	/* for pointing to file names */
7497419aa0Spjanzen 	int	fd;		/* file descriptor */
75df930be7Sderaadt 	FILE	*fp;			/* for opening files */
76df930be7Sderaadt 	struct stat	fbuf;		/* for getting files statistics */
77df930be7Sderaadt 	int ch;
7834278d36Sguenther 	char path[PATH_MAX], *prefix;
79df930be7Sderaadt 
806fa5e1daSmestre 	while ((ch = getopt(argc, argv, "hm:")) != -1)
81df930be7Sderaadt 		switch(ch) {
82df930be7Sderaadt 		case 'm':
83df930be7Sderaadt 			monsterfile = optarg;
84df930be7Sderaadt 			break;
856fa5e1daSmestre 		case 'h':
86df930be7Sderaadt 		default:
87df930be7Sderaadt 			break;
88df930be7Sderaadt 		}
89df930be7Sderaadt 	argc -= optind;
90df930be7Sderaadt 	argv += optind;
91df930be7Sderaadt 
92df930be7Sderaadt     umask(0117);		/* only owner can read/write created files */
93df930be7Sderaadt 
94df930be7Sderaadt     prefix = getenv("DESTDIR");
95df930be7Sderaadt 
96df930be7Sderaadt     /* try to create data files */
97df930be7Sderaadt     filename = &files[0];
98df930be7Sderaadt     while (*filename != NULL)
99df930be7Sderaadt 	/* create each file */
100df930be7Sderaadt 	{
101df930be7Sderaadt 	snprintf(path, sizeof(path), "%s%s", prefix?prefix:"", *filename);
102df930be7Sderaadt 	if (stat(path, &fbuf) == 0)
103df930be7Sderaadt 	    /* file exists; remove it */
104df930be7Sderaadt 	    {
105df930be7Sderaadt 	    if (!strcmp(*filename, _PATH_PEOPLE))
106df930be7Sderaadt 		/* do not reset character file if it already exists */
107df930be7Sderaadt 		{
108df930be7Sderaadt 		++filename;
109df930be7Sderaadt 		continue;
110df930be7Sderaadt 		}
111df930be7Sderaadt 
112c4b20be9Spjanzen 	    if (!strcmp(*filename, _PATH_SCORE))
113c4b20be9Spjanzen 		/* do not reset score file if it already exists */
114c4b20be9Spjanzen 		{
115c4b20be9Spjanzen 		++filename;
116c4b20be9Spjanzen 		continue;
117c4b20be9Spjanzen 		}
118c4b20be9Spjanzen 
119*df69c215Sderaadt 	    if (unlink(path) == -1)
120df930be7Sderaadt 		Error("Cannot unlink %s.\n", path);
121df930be7Sderaadt 	    }
122df930be7Sderaadt 
123*df69c215Sderaadt 	if ((fd = open(path, O_CREAT | O_TRUNC | O_WRONLY, 0660)) == -1)
124df930be7Sderaadt 	    Error("Cannot create %s.\n", path);
125df930be7Sderaadt 
126df930be7Sderaadt 	close(fd);			/* close newly created file */
127df930be7Sderaadt 
128df930be7Sderaadt 	++filename;			/* process next file */
129df930be7Sderaadt 	}
130df930be7Sderaadt 
131df930be7Sderaadt     /* put holy grail info into energy void file */
132010ae45bSmestre     Enrgyvoid.ev_active = true;
133df930be7Sderaadt     Enrgyvoid.ev_x = ROLL(-1.0e6, 2.0e6);
134df930be7Sderaadt     Enrgyvoid.ev_y = ROLL(-1.0e6, 2.0e6);
135df930be7Sderaadt     snprintf(path, sizeof(path), "%s%s", prefix?prefix:"", _PATH_VOID);
136df930be7Sderaadt     if ((fp = fopen(path, "w")) == NULL)
137df930be7Sderaadt 	Error("Cannot update %s.\n", path);
138df930be7Sderaadt     else
139df930be7Sderaadt 	{
140df930be7Sderaadt 	fwrite(&Enrgyvoid, SZ_VOIDSTRUCT, 1, fp);
141df930be7Sderaadt 	fclose(fp);
142df930be7Sderaadt 	}
143df930be7Sderaadt 
144df930be7Sderaadt     /* create binary monster data base */
145df930be7Sderaadt     snprintf(path, sizeof(path), "%s%s", prefix?prefix:"", _PATH_MONST);
146df930be7Sderaadt     if ((Monstfp = fopen(path, "w")) == NULL)
147df930be7Sderaadt 	Error("Cannot update %s.\n", path);
148df930be7Sderaadt     else
149df930be7Sderaadt 	{
150df930be7Sderaadt 	if ((fp = fopen(monsterfile, "r")) == NULL)
151df930be7Sderaadt 	    {
152df930be7Sderaadt 	    fclose(Monstfp);
153df930be7Sderaadt 	    Error("cannot open %s to create monster database.\n", "monsters.asc");
154df930be7Sderaadt 	    }
155df930be7Sderaadt 	else
156df930be7Sderaadt 	    {
157df930be7Sderaadt 	    Curmonster.m_o_strength =
158df930be7Sderaadt 	    Curmonster.m_o_speed =
159df930be7Sderaadt 	    Curmonster.m_maxspeed =
160df930be7Sderaadt 	    Curmonster.m_o_energy =
161df930be7Sderaadt 	    Curmonster.m_melee =
162df930be7Sderaadt 	    Curmonster.m_skirmish = 0.0;
163df930be7Sderaadt 
164df930be7Sderaadt 	    while (fgets(Databuf, SZ_DATABUF, fp) != NULL)
165df930be7Sderaadt 		/* read in text file, convert to binary */
166df930be7Sderaadt 		{
167df930be7Sderaadt 		sscanf(&Databuf[24], "%lf%lf%lf%lf%lf%d%d%lf",
168df930be7Sderaadt 		    &Curmonster.m_strength, &Curmonster.m_brains,
169df930be7Sderaadt 		    &Curmonster.m_speed, &Curmonster.m_energy,
170df930be7Sderaadt 		    &Curmonster.m_experience, &Curmonster.m_treasuretype,
171df930be7Sderaadt 		    &Curmonster.m_type, &Curmonster.m_flock);
172df930be7Sderaadt 		Databuf[24] = '\0';
17342ceebb3Sderaadt 		strlcpy(Curmonster.m_name, Databuf, sizeof Curmonster.m_name);
1743e54dc23Stedu 		fwrite(&Curmonster, SZ_MONSTERSTRUCT, 1, Monstfp);
175df930be7Sderaadt 		}
176df930be7Sderaadt 	    fclose(fp);
177df930be7Sderaadt 	    fclose(Monstfp);
178df930be7Sderaadt 	    }
179df930be7Sderaadt 	}
180df930be7Sderaadt 
18165e3e2c5Stb     return 0;
182df930be7Sderaadt }
183df930be7Sderaadt /**/
184df930be7Sderaadt /************************************************************************
185df930be7Sderaadt /
186df930be7Sderaadt / FUNCTION NAME: Error()
187df930be7Sderaadt /
188df930be7Sderaadt / FUNCTION: print an error message, and exit
189df930be7Sderaadt /
190df930be7Sderaadt / AUTHOR: E. A. Estes, 12/4/85
191df930be7Sderaadt /
192df930be7Sderaadt / ARGUMENTS:
193df930be7Sderaadt /	char *str - format string for printf()
194df930be7Sderaadt /	char *file - file which caused error
195df930be7Sderaadt /
196df930be7Sderaadt / RETURN VALUE: none
197df930be7Sderaadt /
198df930be7Sderaadt / MODULES CALLED: exit(), perror(), fprintf()
199df930be7Sderaadt /
200df930be7Sderaadt / GLOBAL INPUTS: _iob[]
201df930be7Sderaadt /
202df930be7Sderaadt / GLOBAL OUTPUTS: none
203df930be7Sderaadt /
204df930be7Sderaadt / DESCRIPTION:
205df930be7Sderaadt /	Print an error message, then exit.
206df930be7Sderaadt /
207db690800Sfn *************************************************************************/
208df930be7Sderaadt 
209c4b20be9Spjanzen void
Error(char * str,char * file)21085d02bc0Stb Error(char *str, char *file)
211df930be7Sderaadt {
212df930be7Sderaadt 	fprintf(stderr, "Error: ");
213df930be7Sderaadt 	fprintf(stderr, str, file);
214df930be7Sderaadt 	perror(file);
215df930be7Sderaadt 	exit(1);
216df930be7Sderaadt }
217df930be7Sderaadt /**/
218df930be7Sderaadt /************************************************************************
219df930be7Sderaadt /
220df930be7Sderaadt / FUNCTION NAME: drandom()
221df930be7Sderaadt /
222df930be7Sderaadt / FUNCTION: return a random number
223df930be7Sderaadt /
224df930be7Sderaadt / AUTHOR: E. A. Estes, 2/7/86
225df930be7Sderaadt /
226df930be7Sderaadt / ARGUMENTS: none
227df930be7Sderaadt /
228df930be7Sderaadt / RETURN VALUE: none
229df930be7Sderaadt /
23066e49541Snaddy / MODULES CALLED: arc4random()
231df930be7Sderaadt /
232df930be7Sderaadt / GLOBAL INPUTS: none
233df930be7Sderaadt /
234df930be7Sderaadt / GLOBAL OUTPUTS: none
235df930be7Sderaadt /
236df930be7Sderaadt / DESCRIPTION:
237df930be7Sderaadt /
238db690800Sfn *************************************************************************/
239df930be7Sderaadt 
240df930be7Sderaadt double
drandom(void)24185d02bc0Stb drandom(void)
242df930be7Sderaadt {
24366e49541Snaddy 	return((double) arc4random() / (UINT32_MAX + 1.0));
244df930be7Sderaadt }
245