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