1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32: #include <sys/cdefs.h>
33: #ifndef lint
34: #if 0
35: static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 5/31/93";
36: #else
37: __RCSID("$NetBSD: misc.c,v 1.11 2003/08/07 09:37:25 agc Exp $");
38: #endif
39: #endif
40:
41: #include <sys/file.h>
42: #include <termios.h>
43:
44: #include <stdarg.h>
45:
46: #include "mille.h"
47: #ifndef unctrl
48: #include "unctrl.h"
49: #endif
50:
51:
52:
53:
54:
55:
56: #define NUMSAFE 4
57:
58: bool
59: error(const char *str, ...)
60: {
61: va_list ap;
62:
63: va_start(ap, str);
64: wmove(Score, ERR_Y, ERR_X);
65: vwprintw(Score, str, ap);
66: wclrtoeol(Score);
67: putchar('\07');
68: refresh();
69: va_end(ap);
70: return FALSE;
71: }
72:
73: CARD
74: getcard()
75: {
76: int c, c1;
77:
78: for (;;) {
79: while ((c = readch()) == '\n' || c == '\r' || c == ' ')
80: continue;
81: if (islower(c))
82: c = toupper(c);
83: if (c == killchar() || c == erasechar())
84: return -1;
85: addstr(unctrl(c));
86: clrtoeol();
87: switch (c) {
88: case '1': case '2': case '3':
89: case '4': case '5': case '6':
90: c -= '0';
91: break;
92: case '0': case 'P': case 'p':
93: c = 0;
94: break;
95: default:
96: putchar('\07');
97: addch('\b');
98: if (!isprint(c))
99: addch('\b');
100: c = -1;
101: break;
102: }
103: refresh();
104: if (c >= 0) {
105: while ((c1=readch()) != '\r' && c1 != '\n' && c1 != ' ')
106: if (c1 == killchar())
107: return -1;
108: else if (c1 == erasechar()) {
109: addch('\b');
110: clrtoeol();
111: refresh();
112: goto cont;
113: }
114: else
115: write(0, "\07", 1);
116: return c;
117: }
118: cont: ;
119: }
120: }
121:
122: int
123: check_ext(forcomp)
124: bool forcomp;
125: {
126:
127:
128: if (End == 700)
129: if (Play == PLAYER) {
130: if (getyn(EXTENSIONPROMPT)) {
131: extend:
132: if (!forcomp)
133: End = 1000;
134: return TRUE;
135: }
136: else {
137: done:
138: if (!forcomp)
139: Finished = TRUE;
140: return FALSE;
141: }
142: }
143: else {
144: PLAY *pp, *op;
145: int i, safe, miles;
146:
147: pp = &Player[COMP];
148: op = &Player[PLAYER];
149: for (safe = 0, i = 0; i < NUMSAFE; i++)
150: if (pp->safety[i] != S_UNKNOWN)
151: safe++;
152: if (safe < 2)
153: goto done;
154: if (op->mileage == 0 || onecard(op)
155: || (op->can_go && op->mileage >= 500))
156: goto done;
157: for (miles = 0, i = 0; i < NUMSAFE; i++)
158: if (op->safety[i] != S_PLAYED
159: && pp->safety[i] == S_UNKNOWN)
160: miles++;
161: if (miles + safe == NUMSAFE)
162: goto extend;
163: for (miles = 0, i = 0; i < HAND_SZ; i++)
164: if ((safe = pp->hand[i]) <= C_200)
165: miles += Value[safe];
166: if (miles + (Topcard - Deck) * 3 > 1000)
167: goto extend;
168: goto done;
169: }
170: else
171: goto done;
172: }
173:
174:
175:
176:
177:
178: int
179: getyn(promptno)
180: int promptno;
181: {
182: char c;
183:
184: Saved = FALSE;
185: for (;;) {
186: leaveok(Board, FALSE);
187: prompt(promptno);
188: clrtoeol();
189: refresh();
190: switch (c = readch()) {
191: case 'n': case 'N':
192: addch('N');
193: refresh();
194: leaveok(Board, TRUE);
195: return FALSE;
196: case 'y': case 'Y':
197: addch('Y');
198: refresh();
199: leaveok(Board, TRUE);
200: return TRUE;
201: case 's': case 'S':
202: addch('S');
203: refresh();
204: Saved = save();
205: continue;
206: case CTRL('L'):
207: wrefresh(curscr);
208: break;
209: default:
210: addstr(unctrl(c));
211: refresh();
212: putchar('\07');
213: break;
214: }
215: }
216: }
217:
218:
219:
220:
221:
222:
223: void
224: check_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:
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:
250: int
251: readch()
252: {
253: int cnt;
254: static char c;
255:
256: for (cnt = 0; read(0, &c, 1) <= 0; cnt++)
257: if (cnt > 100)
258: exit(1);
259: return c;
260: }