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