1 /* 2 * Copyright (c) 1982 Regents of the University of California. 3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms are permitted 6 * provided that the above copyright notice and this paragraph are 7 * duplicated in all such forms and that any documentation, 8 * advertising materials, and other materials related to such 9 * distribution and use acknowledge that the software was developed 10 * by the University of California, Berkeley. The name of the 11 * University may not be used to endorse or promote products derived 12 * from this software without specific prior written permission. 13 * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR 14 * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED 15 * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE. 16 */ 17 18 #ifndef lint 19 char copyright[] = 20 "@(#) Copyright (c) 1982 Regents of the University of California.\n\ 21 All rights reserved.\n"; 22 #endif /* not lint */ 23 24 #ifndef lint 25 static char sccsid[] = "@(#)mille.c 5.3 (Berkeley) 06/18/88"; 26 #endif /* not lint */ 27 28 # include "mille.h" 29 # include <signal.h> 30 # ifdef attron 31 # include <term.h> 32 # endif attron 33 34 /* 35 * @(#)mille.c 1.3 (Berkeley) 5/10/83 36 */ 37 38 int rub(); 39 40 main(ac, av) 41 reg int ac; 42 reg char *av[]; { 43 44 reg bool restore; 45 46 /* run as the user */ 47 setuid(getuid()); 48 49 if (strcmp(av[0], "a.out") == 0) { 50 outf = fopen("q", "w"); 51 setbuf(outf, (char *)NULL); 52 Debug = TRUE; 53 } 54 restore = FALSE; 55 switch (ac) { 56 case 2: 57 rest_f(av[1]); 58 restore = TRUE; 59 case 1: 60 break; 61 default: 62 printf("usage: milles [ restore_file ]\n"); 63 exit(-1); 64 /* NOTREACHED */ 65 } 66 Play = PLAYER; 67 initscr(); 68 # ifdef attron 69 # define CA cursor_address 70 # endif 71 if (!CA) { 72 printf("Sorry. Need cursor addressing to play mille\n"); 73 exit(-1); 74 } 75 delwin(stdscr); 76 stdscr = Board = newwin(BOARD_Y, BOARD_X, 0, 0); 77 Score = newwin(SCORE_Y, SCORE_X, 0, 40); 78 Miles = newwin(MILES_Y, MILES_X, 17, 0); 79 #ifdef attron 80 idlok(Board, TRUE); 81 idlok(Score, TRUE); 82 idlok(Miles, TRUE); 83 #endif 84 leaveok(Score, TRUE); 85 leaveok(Miles, TRUE); 86 clearok(curscr, TRUE); 87 # ifndef PROF 88 srandom(getpid()); 89 # else 90 srandom(0); 91 # endif 92 crmode(); 93 noecho(); 94 signal(SIGINT, rub); 95 for (;;) { 96 if (!restore || (Player[PLAYER].total >= 5000 97 || Player[COMP].total >= 5000)) { 98 if (Player[COMP].total < Player[PLAYER].total) 99 Player[PLAYER].games++; 100 else if (Player[COMP].total > Player[PLAYER].total) 101 Player[COMP].games++; 102 Player[COMP].total = 0; 103 Player[PLAYER].total = 0; 104 } 105 do { 106 if (!restore) 107 Handstart = Play = other(Handstart); 108 if (!restore || On_exit) { 109 shuffle(); 110 init(); 111 } 112 newboard(); 113 if (restore) 114 mvwaddstr(Score, ERR_Y, ERR_X, Initstr); 115 prboard(); 116 do { 117 domove(); 118 if (Finished) 119 newscore(); 120 prboard(); 121 } while (!Finished); 122 check_more(); 123 restore = On_exit = FALSE; 124 } while (Player[COMP].total < 5000 125 && Player[PLAYER].total < 5000); 126 } 127 } 128 129 /* 130 * Routine to trap rubouts, and make sure they really want to 131 * quit. 132 */ 133 rub() { 134 135 (void)signal(SIGINT, SIG_IGN); 136 if (getyn(REALLYPROMPT)) 137 die(); 138 (void)signal(SIGINT, rub); 139 } 140 141 /* 142 * Time to go beddy-by 143 */ 144 die() { 145 146 (void)signal(SIGINT, SIG_IGN); 147 if (outf) 148 fflush(outf); 149 mvcur(0, COLS - 1, LINES - 1, 0); 150 endwin(); 151 exit(1); 152 } 153 154