]> git.cameronkatri.com Git - bsdgames-darwin.git/blob - mille/misc.c
Merge with v20030416.
[bsdgames-darwin.git] / mille / misc.c
1 /* $NetBSD: misc.c,v 1.10 2002/05/26 00:12:13 wiz Exp $ */
2
3 /*
4 * Copyright (c) 1983, 1993
5 * The Regents of the University of California. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 * notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 * notice, this list of conditions and the following disclaimer in the
14 * documentation and/or other materials provided with the distribution.
15 * 3. All advertising materials mentioning features or use of this software
16 * must display the following acknowledgement:
17 * This product includes software developed by the University of
18 * California, Berkeley and its contributors.
19 * 4. Neither the name of the University nor the names of its contributors
20 * may be used to endorse or promote products derived from this software
21 * without specific prior written permission.
22 *
23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33 * SUCH DAMAGE.
34 */
35
36 #include <sys/cdefs.h>
37 #ifndef lint
38 #if 0
39 static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 5/31/93";
40 #else
41 __RCSID("$NetBSD: misc.c,v 1.10 2002/05/26 00:12:13 wiz Exp $");
42 #endif
43 #endif /* not lint */
44
45 #include <sys/file.h>
46 #include <termios.h>
47
48 #include <stdarg.h>
49
50 #include "mille.h"
51 #ifndef unctrl
52 #include "unctrl.h"
53 #endif
54
55
56 /*
57 * @(#)misc.c 1.2 (Berkeley) 3/28/83
58 */
59
60 #define NUMSAFE 4
61
62 bool
63 error(const char *str, ...)
64 {
65 va_list ap;
66
67 va_start(ap, str);
68 wmove(Score, ERR_Y, ERR_X);
69 vwprintw(Score, str, ap);
70 wclrtoeol(Score);
71 putchar('\07');
72 refresh();
73 va_end(ap);
74 return FALSE;
75 }
76
77 CARD
78 getcard()
79 {
80 int c, c1;
81
82 for (;;) {
83 while ((c = readch()) == '\n' || c == '\r' || c == ' ')
84 continue;
85 if (islower(c))
86 c = toupper(c);
87 if (c == killchar() || c == erasechar())
88 return -1;
89 addstr(unctrl(c));
90 clrtoeol();
91 switch (c) {
92 case '1': case '2': case '3':
93 case '4': case '5': case '6':
94 c -= '0';
95 break;
96 case '0': case 'P': case 'p':
97 c = 0;
98 break;
99 default:
100 putchar('\07');
101 addch('\b');
102 if (!isprint(c))
103 addch('\b');
104 c = -1;
105 break;
106 }
107 refresh();
108 if (c >= 0) {
109 while ((c1=readch()) != '\r' && c1 != '\n' && c1 != ' ')
110 if (c1 == killchar())
111 return -1;
112 else if (c1 == erasechar()) {
113 addch('\b');
114 clrtoeol();
115 refresh();
116 goto cont;
117 }
118 else
119 write(0, "\07", 1);
120 return c;
121 }
122 cont: ;
123 }
124 }
125
126 int
127 check_ext(forcomp)
128 bool forcomp;
129 {
130
131
132 if (End == 700)
133 if (Play == PLAYER) {
134 if (getyn(EXTENSIONPROMPT)) {
135 extend:
136 if (!forcomp)
137 End = 1000;
138 return TRUE;
139 }
140 else {
141 done:
142 if (!forcomp)
143 Finished = TRUE;
144 return FALSE;
145 }
146 }
147 else {
148 PLAY *pp, *op;
149 int i, safe, miles;
150
151 pp = &Player[COMP];
152 op = &Player[PLAYER];
153 for (safe = 0, i = 0; i < NUMSAFE; i++)
154 if (pp->safety[i] != S_UNKNOWN)
155 safe++;
156 if (safe < 2)
157 goto done;
158 if (op->mileage == 0 || onecard(op)
159 || (op->can_go && op->mileage >= 500))
160 goto done;
161 for (miles = 0, i = 0; i < NUMSAFE; i++)
162 if (op->safety[i] != S_PLAYED
163 && pp->safety[i] == S_UNKNOWN)
164 miles++;
165 if (miles + safe == NUMSAFE)
166 goto extend;
167 for (miles = 0, i = 0; i < HAND_SZ; i++)
168 if ((safe = pp->hand[i]) <= C_200)
169 miles += Value[safe];
170 if (miles + (Topcard - Deck) * 3 > 1000)
171 goto extend;
172 goto done;
173 }
174 else
175 goto done;
176 }
177
178 /*
179 * Get a yes or no answer to the given question. Saves are
180 * also allowed. Return TRUE if the answer was yes, FALSE if no.
181 */
182 int
183 getyn(promptno)
184 int promptno;
185 {
186 char c;
187
188 Saved = FALSE;
189 for (;;) {
190 leaveok(Board, FALSE);
191 prompt(promptno);
192 clrtoeol();
193 refresh();
194 switch (c = readch()) {
195 case 'n': case 'N':
196 addch('N');
197 refresh();
198 leaveok(Board, TRUE);
199 return FALSE;
200 case 'y': case 'Y':
201 addch('Y');
202 refresh();
203 leaveok(Board, TRUE);
204 return TRUE;
205 case 's': case 'S':
206 addch('S');
207 refresh();
208 Saved = save();
209 continue;
210 case CTRL('L'):
211 wrefresh(curscr);
212 break;
213 default:
214 addstr(unctrl(c));
215 refresh();
216 putchar('\07');
217 break;
218 }
219 }
220 }
221
222 /*
223 * Check to see if more games are desired. If not, and game
224 * came from a saved file, make sure that they don't want to restore
225 * it. Exit appropriately.
226 */
227 void
228 check_more()
229 {
230 On_exit = TRUE;
231 if (Player[PLAYER].total >= 5000 || Player[COMP].total >= 5000)
232 if (getyn(ANOTHERGAMEPROMPT))
233 return;
234 else {
235 /*
236 * must do accounting normally done in main()
237 */
238 if (Player[PLAYER].total > Player[COMP].total)
239 Player[PLAYER].games++;
240 else if (Player[PLAYER].total < Player[COMP].total)
241 Player[COMP].games++;
242 Player[COMP].total = 0;
243 Player[PLAYER].total = 0;
244 }
245 else
246 if (getyn(ANOTHERHANDPROMPT))
247 return;
248 if (!Saved && getyn(SAVEGAMEPROMPT))
249 if (!save())
250 return;
251 die(0);
252 }
253
254 int
255 readch()
256 {
257 int cnt;
258 static char c;
259
260 for (cnt = 0; read(0, &c, 1) <= 0; cnt++)
261 if (cnt > 100)
262 exit(1);
263 return c;
264 }