misc.c revision 1.1
1/* $NetBSD: misc.c,v 1.4 1995/03/24 05:01:54 cgd 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#ifndef lint 37#if 0 38static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 5/31/93"; 39#else 40static char rcsid[] = "$NetBSD: misc.c,v 1.4 1995/03/24 05:01:54 cgd Exp $"; 41#endif 42#endif /* not lint */ 43 44#include <sys/file.h> 45#include <termios.h> 46 47#include "mille.h" 48#ifndef unctrl 49#include "unctrl.h" 50#endif 51 52 53# ifdef attron 54# include <term.h> 55# define _tty cur_term->Nttyb 56# endif attron 57 58/* 59 * @(#)misc.c 1.2 (Berkeley) 3/28/83 60 */ 61 62#define NUMSAFE 4 63 64/* VARARGS1 */ 65error(str, arg) 66char *str; 67{ 68 stdscr = Score; 69 mvprintw(ERR_Y, ERR_X, str, arg); 70 clrtoeol(); 71 putchar('\07'); 72 refresh(); 73 stdscr = Board; 74 return FALSE; 75} 76 77CARD 78getcard() 79{ 80 reg 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 } 122cont: ; 123 } 124} 125 126check_ext(forcomp) 127reg bool forcomp; { 128 129 130 if (End == 700) 131 if (Play == PLAYER) { 132 if (getyn(EXTENSIONPROMPT)) { 133extend: 134 if (!forcomp) 135 End = 1000; 136 return TRUE; 137 } 138 else { 139done: 140 if (!forcomp) 141 Finished = TRUE; 142 return FALSE; 143 } 144 } 145 else { 146 reg PLAY *pp, *op; 147 reg int i, safe, miles; 148 149 pp = &Player[COMP]; 150 op = &Player[PLAYER]; 151 for (safe = 0, i = 0; i < NUMSAFE; i++) 152 if (pp->safety[i] != S_UNKNOWN) 153 safe++; 154 if (safe < 2) 155 goto done; 156 if (op->mileage == 0 || onecard(op) 157 || (op->can_go && op->mileage >= 500)) 158 goto done; 159 for (miles = 0, i = 0; i < NUMSAFE; i++) 160 if (op->safety[i] != S_PLAYED 161 && pp->safety[i] == S_UNKNOWN) 162 miles++; 163 if (miles + safe == NUMSAFE) 164 goto extend; 165 for (miles = 0, i = 0; i < HAND_SZ; i++) 166 if ((safe = pp->hand[i]) <= C_200) 167 miles += Value[safe]; 168 if (miles + (Topcard - Deck) * 3 > 1000) 169 goto extend; 170 goto done; 171 } 172 else 173 goto done; 174} 175 176/* 177 * Get a yes or no answer to the given question. Saves are 178 * also allowed. Return TRUE if the answer was yes, FALSE if no. 179 */ 180getyn(promptno) 181register int promptno; { 182 183 reg char c; 184 185 Saved = FALSE; 186 for (;;) { 187 leaveok(Board, FALSE); 188 prompt(promptno); 189 clrtoeol(); 190 refresh(); 191 switch (c = readch()) { 192 case 'n': case 'N': 193 addch('N'); 194 refresh(); 195 leaveok(Board, TRUE); 196 return FALSE; 197 case 'y': case 'Y': 198 addch('Y'); 199 refresh(); 200 leaveok(Board, TRUE); 201 return TRUE; 202 case 's': case 'S': 203 addch('S'); 204 refresh(); 205 Saved = save(); 206 continue; 207 case CTRL('L'): 208 wrefresh(curscr); 209 break; 210 default: 211 addstr(unctrl(c)); 212 refresh(); 213 putchar('\07'); 214 break; 215 } 216 } 217} 218 219/* 220 * Check to see if more games are desired. If not, and game 221 * came from a saved file, make sure that they don't want to restore 222 * it. Exit appropriately. 223 */ 224check_more() { 225 226 On_exit = TRUE; 227 if (Player[PLAYER].total >= 5000 || Player[COMP].total >= 5000) 228 if (getyn(ANOTHERGAMEPROMPT)) 229 return; 230 else { 231 /* 232 * must do accounting normally done in main() 233 */ 234 if (Player[PLAYER].total > Player[COMP].total) 235 Player[PLAYER].games++; 236 else if (Player[PLAYER].total < Player[COMP].total) 237 Player[COMP].games++; 238 Player[COMP].total = 0; 239 Player[PLAYER].total = 0; 240 } 241 else 242 if (getyn(ANOTHERHANDPROMPT)) 243 return; 244 if (!Saved && getyn(SAVEGAMEPROMPT)) 245 if (!save()) 246 return; 247 die(0); 248} 249 250readch() 251{ 252 reg int cnt; 253 static char c; 254 255 for (cnt = 0; read(0, &c, 1) <= 0; cnt++) 256 if (cnt > 100) 257 exit(1); 258 return c; 259} 260