|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1983 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: (1) source distributions retain this entire copyright ! 7: * notice and comment, and (2) distributions including binaries display ! 8: * the following acknowledgement: ``This product includes software ! 9: * developed by the University of California, Berkeley and its contributors'' ! 10: * in the documentation or other materials provided with the distribution ! 11: * and in all advertising materials mentioning features or use of this ! 12: * software. Neither the name of the University nor the names of its ! 13: * contributors may be used to endorse or promote products derived ! 14: * from this software without specific prior written permission. ! 15: * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR ! 16: * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED ! 17: * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. ! 18: */ ! 19: ! 20: #ifndef lint ! 21: static char sccsid[] = "@(#)misc.c 5.6 (Berkeley) 6/1/90"; ! 22: #endif /* not lint */ ! 23: ! 24: #include "mille.h" ! 25: #ifndef unctrl ! 26: #include "unctrl.h" ! 27: #endif ! 28: ! 29: # include <sys/file.h> ! 30: ! 31: # ifdef attron ! 32: # include <term.h> ! 33: # define _tty cur_term->Nttyb ! 34: # endif attron ! 35: ! 36: /* ! 37: * @(#)misc.c 1.2 (Berkeley) 3/28/83 ! 38: */ ! 39: ! 40: #define NUMSAFE 4 ! 41: ! 42: /* VARARGS1 */ ! 43: error(str, arg) ! 44: char *str; ! 45: { ! 46: stdscr = Score; ! 47: mvprintw(ERR_Y, ERR_X, str, arg); ! 48: clrtoeol(); ! 49: putchar('\07'); ! 50: refresh(); ! 51: stdscr = Board; ! 52: return FALSE; ! 53: } ! 54: ! 55: CARD ! 56: getcard() ! 57: { ! 58: reg int c, c1; ! 59: ! 60: for (;;) { ! 61: while ((c = readch()) == '\n' || c == '\r' || c == ' ') ! 62: continue; ! 63: if (islower(c)) ! 64: c = toupper(c); ! 65: if (c == killchar() || c == erasechar()) ! 66: return -1; ! 67: addstr(unctrl(c)); ! 68: clrtoeol(); ! 69: switch (c) { ! 70: case '1': case '2': case '3': ! 71: case '4': case '5': case '6': ! 72: c -= '0'; ! 73: break; ! 74: case '0': case 'P': case 'p': ! 75: c = 0; ! 76: break; ! 77: default: ! 78: putchar('\07'); ! 79: addch('\b'); ! 80: if (!isprint(c)) ! 81: addch('\b'); ! 82: c = -1; ! 83: break; ! 84: } ! 85: refresh(); ! 86: if (c >= 0) { ! 87: while ((c1=readch()) != '\r' && c1 != '\n' && c1 != ' ') ! 88: if (c1 == killchar()) ! 89: return -1; ! 90: else if (c1 == erasechar()) { ! 91: addch('\b'); ! 92: clrtoeol(); ! 93: refresh(); ! 94: goto cont; ! 95: } ! 96: else ! 97: write(0, "\07", 1); ! 98: return c; ! 99: } ! 100: cont: ; ! 101: } ! 102: } ! 103: ! 104: check_ext(forcomp) ! 105: reg bool forcomp; { ! 106: ! 107: ! 108: if (End == 700) ! 109: if (Play == PLAYER) { ! 110: if (getyn(EXTENSIONPROMPT)) { ! 111: extend: ! 112: if (!forcomp) ! 113: End = 1000; ! 114: return TRUE; ! 115: } ! 116: else { ! 117: done: ! 118: if (!forcomp) ! 119: Finished = TRUE; ! 120: return FALSE; ! 121: } ! 122: } ! 123: else { ! 124: reg PLAY *pp, *op; ! 125: reg int i, safe, miles; ! 126: ! 127: pp = &Player[COMP]; ! 128: op = &Player[PLAYER]; ! 129: for (safe = 0, i = 0; i < NUMSAFE; i++) ! 130: if (pp->safety[i] != S_UNKNOWN) ! 131: safe++; ! 132: if (safe < 2) ! 133: goto done; ! 134: if (op->mileage == 0 || onecard(op) ! 135: || (op->can_go && op->mileage >= 500)) ! 136: goto done; ! 137: for (miles = 0, i = 0; i < NUMSAFE; i++) ! 138: if (op->safety[i] != S_PLAYED ! 139: && pp->safety[i] == S_UNKNOWN) ! 140: miles++; ! 141: if (miles + safe == NUMSAFE) ! 142: goto extend; ! 143: for (miles = 0, i = 0; i < HAND_SZ; i++) ! 144: if ((safe = pp->hand[i]) <= C_200) ! 145: miles += Value[safe]; ! 146: if (miles + (Topcard - Deck) * 3 > 1000) ! 147: goto extend; ! 148: goto done; ! 149: } ! 150: else ! 151: goto done; ! 152: } ! 153: ! 154: /* ! 155: * Get a yes or no answer to the given question. Saves are ! 156: * also allowed. Return TRUE if the answer was yes, FALSE if no. ! 157: */ ! 158: getyn(promptno) ! 159: register int promptno; { ! 160: ! 161: reg char c; ! 162: ! 163: Saved = FALSE; ! 164: for (;;) { ! 165: leaveok(Board, FALSE); ! 166: prompt(promptno); ! 167: clrtoeol(); ! 168: refresh(); ! 169: switch (c = readch()) { ! 170: case 'n': case 'N': ! 171: addch('N'); ! 172: refresh(); ! 173: leaveok(Board, TRUE); ! 174: return FALSE; ! 175: case 'y': case 'Y': ! 176: addch('Y'); ! 177: refresh(); ! 178: leaveok(Board, TRUE); ! 179: return TRUE; ! 180: case 's': case 'S': ! 181: addch('S'); ! 182: refresh(); ! 183: Saved = save(); ! 184: continue; ! 185: default: ! 186: addstr(unctrl(c)); ! 187: refresh(); ! 188: putchar('\07'); ! 189: break; ! 190: } ! 191: } ! 192: } ! 193: ! 194: /* ! 195: * Check to see if more games are desired. If not, and game ! 196: * came from a saved file, make sure that they don't want to restore ! 197: * it. Exit appropriately. ! 198: */ ! 199: check_more() { ! 200: ! 201: flush_input(); ! 202: ! 203: On_exit = TRUE; ! 204: if (Player[PLAYER].total >= 5000 || Player[COMP].total >= 5000) ! 205: if (getyn(ANOTHERGAMEPROMPT)) ! 206: return; ! 207: else { ! 208: /* ! 209: * must do accounting normally done in main() ! 210: */ ! 211: if (Player[PLAYER].total > Player[COMP].total) ! 212: Player[PLAYER].games++; ! 213: else if (Player[PLAYER].total < Player[COMP].total) ! 214: Player[COMP].games++; ! 215: Player[COMP].total = 0; ! 216: Player[PLAYER].total = 0; ! 217: } ! 218: else ! 219: if (getyn(ANOTHERHANDPROMPT)) ! 220: return; ! 221: if (!Saved && getyn(SAVEGAMEPROMPT)) ! 222: if (!save()) ! 223: return; ! 224: die(); ! 225: } ! 226: ! 227: readch() ! 228: { ! 229: reg int cnt; ! 230: static char c; ! 231: ! 232: for (cnt = 0; read(0, &c, 1) <= 0; cnt++) ! 233: if (cnt > 100) ! 234: exit(1); ! 235: return c; ! 236: } ! 237: ! 238: flush_input() ! 239: { ! 240: # ifdef TIOCFLUSH ! 241: static int ioctl_args = O_RDONLY; ! 242: ! 243: (void) ioctl(fileno(stdin), TIOCFLUSH, &ioctl_args); ! 244: # else ! 245: fflush(stdin); ! 246: # endif ! 247: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.