|
|
1.1 root 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: /**/
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:
41: main()
42: {
43: FILE *fp; /* for opening files */
44: struct stat fbuf; /* for getting files statistics */
45: register char **filename; /* for pointing to file names */
46: register int fd; /* file descriptor */
47: static 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: {
147: sscanf(&Databuf[24], "%lf%lf%lf%lf%lf%d%d%lf",
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:
161: #ifdef MAKE_INSTALLS_THIS_AND_DOESNT_ANSWER_QUESTIONS
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: }
173: #endif
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: /**/
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:
243: Error(str, file)
244: char *str, *file;
245: {
246: fprintf(stderr, "Error: ");
247: fprintf(stderr, str, file);
248: perror(file);
249: exit(1);
250: /*NOTREACHED*/
251: }
252: /**/
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:
275: double
276: drandom()
277: {
278: if (sizeof(int) != 2)
279: return((double) (random() & 0x7fff) / 32768.0);
280: else
281: return((double) random() / 32768.0);
282: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.