|
|
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.