1 /* 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34 #ifndef lint 35 /*static char sccsid[] = "from: @(#)misc.c 8.1 (Berkeley) 5/31/93";*/ 36 static char rcsid[] = "$Id: misc.c,v 1.3 1994/05/12 17:39:35 jtc Exp $"; 37 #endif /* not lint */ 38 39 #include <sys/file.h> 40 #include <termios.h> 41 42 #include "mille.h" 43 #ifndef unctrl 44 #include "unctrl.h" 45 #endif 46 47 48 # ifdef attron 49 # include <term.h> 50 # define _tty cur_term->Nttyb 51 # endif attron 52 53 /* 54 * @(#)misc.c 1.2 (Berkeley) 3/28/83 55 */ 56 57 #define NUMSAFE 4 58 59 /* VARARGS1 */ 60 error(str, arg) 61 char *str; 62 { 63 stdscr = Score; 64 mvprintw(ERR_Y, ERR_X, str, arg); 65 clrtoeol(); 66 putchar('\07'); 67 refresh(); 68 stdscr = Board; 69 return FALSE; 70 } 71 72 CARD 73 getcard() 74 { 75 reg int c, c1; 76 77 for (;;) { 78 while ((c = readch()) == '\n' || c == '\r' || c == ' ') 79 continue; 80 if (islower(c)) 81 c = toupper(c); 82 if (c == killchar() || c == erasechar()) 83 return -1; 84 addstr(unctrl(c)); 85 clrtoeol(); 86 switch (c) { 87 case '1': case '2': case '3': 88 case '4': case '5': case '6': 89 c -= '0'; 90 break; 91 case '0': case 'P': case 'p': 92 c = 0; 93 break; 94 default: 95 putchar('\07'); 96 addch('\b'); 97 if (!isprint(c)) 98 addch('\b'); 99 c = -1; 100 break; 101 } 102 refresh(); 103 if (c >= 0) { 104 while ((c1=readch()) != '\r' && c1 != '\n' && c1 != ' ') 105 if (c1 == killchar()) 106 return -1; 107 else if (c1 == erasechar()) { 108 addch('\b'); 109 clrtoeol(); 110 refresh(); 111 goto cont; 112 } 113 else 114 write(0, "\07", 1); 115 return c; 116 } 117 cont: ; 118 } 119 } 120 121 check_ext(forcomp) 122 reg bool forcomp; { 123 124 125 if (End == 700) 126 if (Play == PLAYER) { 127 if (getyn(EXTENSIONPROMPT)) { 128 extend: 129 if (!forcomp) 130 End = 1000; 131 return TRUE; 132 } 133 else { 134 done: 135 if (!forcomp) 136 Finished = TRUE; 137 return FALSE; 138 } 139 } 140 else { 141 reg PLAY *pp, *op; 142 reg int i, safe, miles; 143 144 pp = &Player[COMP]; 145 op = &Player[PLAYER]; 146 for (safe = 0, i = 0; i < NUMSAFE; i++) 147 if (pp->safety[i] != S_UNKNOWN) 148 safe++; 149 if (safe < 2) 150 goto done; 151 if (op->mileage == 0 || onecard(op) 152 || (op->can_go && op->mileage >= 500)) 153 goto done; 154 for (miles = 0, i = 0; i < NUMSAFE; i++) 155 if (op->safety[i] != S_PLAYED 156 && pp->safety[i] == S_UNKNOWN) 157 miles++; 158 if (miles + safe == NUMSAFE) 159 goto extend; 160 for (miles = 0, i = 0; i < HAND_SZ; i++) 161 if ((safe = pp->hand[i]) <= C_200) 162 miles += Value[safe]; 163 if (miles + (Topcard - Deck) * 3 > 1000) 164 goto extend; 165 goto done; 166 } 167 else 168 goto done; 169 } 170 171 /* 172 * Get a yes or no answer to the given question. Saves are 173 * also allowed. Return TRUE if the answer was yes, FALSE if no. 174 */ 175 getyn(promptno) 176 register int promptno; { 177 178 reg char c; 179 180 Saved = FALSE; 181 for (;;) { 182 leaveok(Board, FALSE); 183 prompt(promptno); 184 clrtoeol(); 185 refresh(); 186 switch (c = readch()) { 187 case 'n': case 'N': 188 addch('N'); 189 refresh(); 190 leaveok(Board, TRUE); 191 return FALSE; 192 case 'y': case 'Y': 193 addch('Y'); 194 refresh(); 195 leaveok(Board, TRUE); 196 return TRUE; 197 case 's': case 'S': 198 addch('S'); 199 refresh(); 200 Saved = save(); 201 continue; 202 case CTRL('L'): 203 wrefresh(curscr); 204 break; 205 default: 206 addstr(unctrl(c)); 207 refresh(); 208 putchar('\07'); 209 break; 210 } 211 } 212 } 213 214 /* 215 * Check to see if more games are desired. If not, and game 216 * came from a saved file, make sure that they don't want to restore 217 * it. Exit appropriately. 218 */ 219 check_more() { 220 221 On_exit = TRUE; 222 if (Player[PLAYER].total >= 5000 || Player[COMP].total >= 5000) 223 if (getyn(ANOTHERGAMEPROMPT)) 224 return; 225 else { 226 /* 227 * must do accounting normally done in main() 228 */ 229 if (Player[PLAYER].total > Player[COMP].total) 230 Player[PLAYER].games++; 231 else if (Player[PLAYER].total < Player[COMP].total) 232 Player[COMP].games++; 233 Player[COMP].total = 0; 234 Player[PLAYER].total = 0; 235 } 236 else 237 if (getyn(ANOTHERHANDPROMPT)) 238 return; 239 if (!Saved && getyn(SAVEGAMEPROMPT)) 240 if (!save()) 241 return; 242 die(0); 243 } 244 245 readch() 246 { 247 reg int cnt; 248 static char c; 249 250 for (cnt = 0; read(0, &c, 1) <= 0; cnt++) 251 if (cnt > 100) 252 exit(1); 253 return c; 254 } 255