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