comparison xrogue/main.c @ 133:e6179860cb76

Import XRogue 8.0 from the Roguelike Restoration Project (r1490)
author John "Elwin" Edwards
date Tue, 21 Apr 2015 08:55:20 -0400
parents
children ce0cf824c192
comparison
equal deleted inserted replaced
124:d10fc4a065ac 133:e6179860cb76
1 /*
2 main.c - setup code
3
4 XRogue: Expeditions into the Dungeons of Doom
5 Copyright (C) 1991 Robert Pietkivitch
6 All rights reserved.
7
8 Based on "Advanced Rogue"
9 Copyright (C) 1984, 1985 Michael Morgan, Ken Dalka and AT&T
10 All rights reserved.
11
12 Based on "Rogue: Exploring the Dungeons of Doom"
13 Copyright (C) 1980, 1981 Michael Toy, Ken Arnold and Glenn Wichman
14 All rights reserved.
15
16 See the file LICENSE.TXT for full copyright and licensing information.
17 */
18
19 #include <curses.h>
20 #include <signal.h>
21 #include <time.h>
22
23 #include "mach_dep.h"
24 #include "network.h"
25 #include "rogue.h"
26
27 main(argc, argv, envp)
28 char **argv;
29 char **envp;
30 {
31 register char *env;
32 time_t now;
33
34 md_init();
35
36 /*
37 * get home and options from environment
38 */
39
40 strncpy(home, md_gethomedir(), LINELEN);
41
42 /* Get default save file */
43 strcpy(file_name, home);
44 strcat(file_name, "xrogue.sav");
45
46 /* Get default score file */
47 strcpy(score_file, md_getroguedir());
48
49 if (*score_file)
50 strcat(score_file,"/");
51
52 strcat(score_file, "xrogue.scr");
53
54 if ((env = getenv("ROGUEOPTS")) != NULL)
55 parse_opts(env);
56
57 if (whoami[0] == '\0')
58 strucpy(whoami, md_getusername(), strlen(md_getusername()));
59
60 /*
61 * check for print-score option
62 */
63 if (argc == 2 && strcmp(argv[1], "-s") == 0)
64 {
65 waswizard = TRUE;
66 score((long)0, SCOREIT, (short)0);
67 exit_game(0);
68 }
69
70 /*
71 * Check for a network update
72 */
73 if (argc == 2 && strcmp(argv[1], "-u") == 0) {
74 int errcheck, errors = 0;
75 unsigned long amount;
76 short monster;
77
78 /* Read in the amount and monster values to pass to score */
79 amount = netread(&errcheck, sizeof(unsigned long), stdin);
80 if (errcheck) errors++;
81
82 monster = (short) netread(&errcheck, sizeof(short), stdin);
83 if (errcheck) errors++;
84
85 /* Now do the update if there were no errors */
86 if (errors) exit_game(0);
87 else {
88 score((long)amount, UPDATE, (short)monster);
89 exit_game(0);
90 }
91 }
92
93 /*
94 * Check to see if he is a wizard
95 */
96 if (argc >= 2 && argv[1][0] == '\0')
97 if (strcmp(PASSWD, xcrypt(md_getpass("Wizard's password: "), "mT")) == 0)
98 {
99 wizard = TRUE;
100 argv++;
101 argc--;
102 }
103
104 if (betaover())
105 {
106 printf("Sorry, %s, but the test period of this prerelease version\n",whoami);
107 printf("of xrogue is over. Please acquire a new version. Sorry.\n");
108 exit_game(0);
109 }
110
111 if (!wizard && !author() && !playtime()) {
112 printf("Sorry, %s, but you can't play during working hours.\n", whoami);
113 printf("Try again later.\n");
114 exit_game(0);
115 }
116 if (!wizard && !author() && too_much()) {
117 printf("Sorry, %s, but the system is too loaded now.\n", whoami);
118 printf("Try again later.\n");
119 exit_game(0);
120 }
121
122 if (argc == 2)
123 if (!restore(argv[1], envp)) /* Note: restore will never return */
124 exit_game(0);
125
126 if (wizard && getenv("SEED") != NULL) {
127 seed = atoi(getenv("SEED"));
128 }
129 else {
130 seed = (int) time(&now) + getpid();
131 }
132 if (wizard)
133 printf("Hello %s, welcome to dungeon #%d", whoami, seed);
134 else
135 printf("Hello %s, just a moment while I dig the dungeon...", whoami);
136 fflush(stdout);
137
138 md_srand(seed);
139
140 init_things(); /* Set up probabilities of things */
141 init_colors(); /* Set up colors of potions */
142 init_stones(); /* Set up stone settings of rings */
143 init_materials(); /* Set up materials of wands */
144 init_names(); /* Set up names of scrolls */
145 init_misc(); /* Set up miscellaneous magic */
146 init_foods(); /* set up the food table */
147
148 initscr(); /* Start up cursor package */
149
150 typeahead(-1); /* turn off 3.2/4.0 curses feature */
151
152 if (COLS < MINCOLS)
153 {
154 printf("\n\nSorry, %s, but your terminal window has too few columns.\n", whoami);
155 printf("Your terminal has %d columns, needs 70.\n",COLS);
156 byebye(0);
157 }
158 if (LINES < MINLINES)
159 {
160 printf("\n\nSorry, %s, but your terminal window has too few lines.\n", whoami);
161 printf("Your terminal has %d lines, needs 22.\n",LINES);
162 byebye(0);
163 }
164
165 cols = COLS;
166 lines = LINES;
167
168 if ( cols % 2 != 0) cols -=1; /* must be even for maze code */
169 if (lines % 2 != 0) lines -=1; /* must be even for maze code */
170
171 /*
172 * Now that we have cols and lines, we can update our window
173 * structure for non-hardware windows.
174 */
175 setup();
176 /*
177 * Set up windows
178 */
179 cw = newwin(lines, cols, 0, 0);
180 mw = newwin(lines, cols, 0, 0);
181 hw = newwin(lines, cols, 0, 0);
182 msgw = newwin(4, cols, 0, 0);
183 if (cw == NULL || hw == NULL || mw == NULL || msgw == NULL) {
184 exit_game(EXIT_CLS | EXIT_ENDWIN);
185 }
186
187 keypad(cw, TRUE);
188 keypad(hw, TRUE);
189
190 init_player(); /* Roll up the rogue */
191 waswizard = wizard;
192
193 draw(cw);
194 /* A super wizard doesn't have to get equipped */
195 /* Check if "" option is TRUE and get environment flag */
196 if (wizard && strcmp(getenv("SUPER"),"YES") == 0 ||
197 def_attr == TRUE) {
198 level = 1;
199 new_level(NORMLEV);
200 }
201 else
202 new_level(STARTLEV); /* Draw current level */
203
204 /*
205 * Start up daemons and fuses
206 */
207 daemon(doctor, &player, AFTER);
208 fuse(swander, (VOID *)NULL, WANDERTIME, AFTER);
209 /* Give characters their innate abilities */
210 if (player.t_ctype == C_MAGICIAN || player.t_ctype == C_RANGER)
211 fuse(spell_recovery, (VOID *)NULL, SPELLTIME, AFTER);
212 if (player.t_ctype == C_DRUID || player.t_ctype == C_MONK)
213 fuse(chant_recovery, (VOID *)NULL, SPELLTIME, AFTER);
214 if (player.t_ctype == C_CLERIC || player.t_ctype == C_PALADIN)
215 fuse(prayer_recovery, (VOID *)NULL, SPELLTIME, AFTER);
216 daemon(stomach, (VOID *)NULL, AFTER);
217 if (player.t_ctype == C_THIEF ||
218 player.t_ctype == C_ASSASSIN ||
219 player.t_ctype == C_MONK)
220 daemon(trap_look, (VOID *)NULL, AFTER);
221
222 /* Does this character have any special knowledge? */
223 switch (player.t_ctype) {
224 case C_ASSASSIN:
225 /* Assassins automatically recognize poison */
226 p_know[P_POISON] = TRUE;
227 when C_FIGHTER:
228 /* Fighters automatically recognize skill */
229 p_know[P_SKILL] = TRUE;
230 }
231
232 /* Choose an initial quest item */
233 if (!wizard) {
234 if (def_attr == FALSE)
235 quest_item = rnd(MAXRELIC);
236 }
237 mpos = 0;
238 draw(cw);
239 msg("You have been quested to retrieve the %s....",
240 rel_magic[quest_item].mi_name);
241 mpos = 0;
242 playit();
243 }
244
245 /*
246 * endit:
247 * Exit the program abnormally.
248 */
249
250 /*UNUSED*/
251 void
252 endit(sig)
253 int sig;
254 {
255 NOOP(sig);
256 fatal("Ok, if you want to exit that badly, I'll have to allow it\n");
257 }
258
259 /*
260 * fatal:
261 * Exit the program, printing a message.
262 */
263
264 fatal(s)
265 char *s;
266 {
267 clear();
268 move(lines-2, 0);
269 printw("%s", s);
270 draw(stdscr);
271 printf("\n"); /* So the curser doesn't stop at the end of the line */
272 exit_game(EXIT_ENDWIN);
273 }
274
275 /*
276 * rnd:
277 * Pick a very random number.
278 */
279
280 rnd(range)
281 register int range;
282 {
283 return( md_rand(range) );
284 }
285
286 /*
287 * roll:
288 * roll a number of dice
289 */
290
291 roll(number, sides)
292 register int number, sides;
293 {
294 register int dtotal = 0;
295
296 while(number--)
297 dtotal += rnd(sides)+1;
298 return dtotal;
299 }
300
301 setup()
302 {
303 md_setup();
304 }
305
306 /*
307 * playit:
308 * The main loop of the program. Loop until the game is over,
309 * refreshing things and looking at the proper times.
310 */
311
312 playit()
313 {
314 register char *opts;
315
316 /*
317 * parse environment declaration of options
318 */
319 if ((opts = getenv("ROGUEOPTS")) != NULL)
320 parse_opts(opts);
321
322 player.t_oldpos = hero;
323 oldrp = roomin(&hero);
324 after = TRUE;
325 command(); /* Command execution */
326 endit(-1);
327 }
328
329 /*
330 * see if the system is being used too much for this game
331 */
332
333 too_much()
334 {
335 /* we no longer do load checking or user counts */
336 return(FALSE);
337 }
338
339 /*
340 * author:
341 * See if a user is an author of the program
342 */
343
344 author()
345 {
346 switch (md_getuid()) {
347 case 0: /* always OK for root to play */
348 return TRUE;
349 default:
350 return FALSE;
351 }
352 }
353
354 /*
355 * playtime:
356 * Returns TRUE when it is a good time to play rogue
357 */
358
359 playtime()
360 {
361 /* we no longer do playtime checking */
362
363 return TRUE;
364 }
365
366 /*
367 * betaover:
368 * Returns TRUE if the test period of this version of the game is over
369 */
370
371 betaover()
372 {
373 return(FALSE);
374 }
375
376
377 exit_game(flag)
378 int flag;
379 {
380 int i;
381
382 if (flag & EXIT_CLS) /* Clear Screen */
383 {
384 wclear(cw);
385 draw(cw);
386 }
387
388 if (flag & EXIT_ENDWIN) /* Shutdown Curses */
389 {
390 keypad(cw,FALSE);
391 keypad(hw,FALSE);
392 delwin(cw);
393 delwin(mw);
394 delwin(hw);
395 delwin(msgw);
396 if (!isendwin())
397 endwin();
398 }
399 o_free_list(player.t_pack);
400 t_free_list(mlist);
401 t_free_list(rlist);
402 t_free_list(tlist);
403 o_free_list(lvl_obj); /* Free up previous objects (if any) */
404 for (i = 0; i < MAXROOMS; i++)
405 {
406 r_free_list(rooms[i].r_exit); /* Free up the exit lists */
407 _r_free_fire_list(&rooms[i].r_fires);
408 }
409
410 for(i=0; i<MAXSCROLLS; i++)
411 {
412 if (s_names[i] != NULL)
413 free( s_names[i] );
414 if (s_guess[i] != NULL)
415 free( s_guess[i] );
416 }
417
418 for(i=0; i<MAXPOTIONS; i++)
419 {
420 if (p_guess[i] != NULL)
421 free( p_guess[i] );
422 }
423
424 for(i=0; i<MAXRINGS; i++)
425 {
426 if (r_guess[i] != NULL)
427 free( r_guess[i] );
428 }
429
430 for(i=0; i<MAXSTICKS; i++)
431 {
432 if (ws_guess[i] != NULL)
433 free( ws_guess[i] );
434 }
435
436 exit(0);
437 }
438