| 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 | |
| 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], "%F%F%F%F%F%d%d%F", |
| 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 | /*\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 | |
| 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 | /*\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 | |
| 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 | } |