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