]> git.cameronkatri.com Git - bsdgames-darwin.git/blob - mille/misc.c
Make these compile on the PowerPC (an unsigned char system).
[bsdgames-darwin.git] / mille / misc.c
1 /* $NetBSD: misc.c,v 1.4 1995/03/24 05:01:54 cgd 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 #ifndef lint
37 #if 0
38 static char sccsid[] = "@(#)misc.c 8.1 (Berkeley) 5/31/93";
39 #else
40 static char rcsid[] = "$NetBSD: misc.c,v 1.4 1995/03/24 05:01:54 cgd Exp $";
41 #endif
42 #endif /* not lint */
43
44 #include <sys/file.h>
45 #include <termios.h>
46
47 #include "mille.h"
48 #ifndef unctrl
49 #include "unctrl.h"
50 #endif
51
52
53 # ifdef attron
54 # include <term.h>
55 # define _tty cur_term->Nttyb
56 # endif attron
57
58 /*
59 * @(#)misc.c 1.2 (Berkeley) 3/28/83
60 */
61
62 #define NUMSAFE 4
63
64 /* VARARGS1 */
65 error(str, arg)
66 char *str;
67 {
68 stdscr = Score;
69 mvprintw(ERR_Y, ERR_X, str, arg);
70 clrtoeol();
71 putchar('\07');
72 refresh();
73 stdscr = Board;
74 return FALSE;
75 }
76
77 CARD
78 getcard()
79 {
80 reg 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 check_ext(forcomp)
127 reg bool forcomp; {
128
129
130 if (End == 700)
131 if (Play == PLAYER) {
132 if (getyn(EXTENSIONPROMPT)) {
133 extend:
134 if (!forcomp)
135 End = 1000;
136 return TRUE;
137 }
138 else {
139 done:
140 if (!forcomp)
141 Finished = TRUE;
142 return FALSE;
143 }
144 }
145 else {
146 reg PLAY *pp, *op;
147 reg int i, safe, miles;
148
149 pp = &Player[COMP];
150 op = &Player[PLAYER];
151 for (safe = 0, i = 0; i < NUMSAFE; i++)
152 if (pp->safety[i] != S_UNKNOWN)
153 safe++;
154 if (safe < 2)
155 goto done;
156 if (op->mileage == 0 || onecard(op)
157 || (op->can_go && op->mileage >= 500))
158 goto done;
159 for (miles = 0, i = 0; i < NUMSAFE; i++)
160 if (op->safety[i] != S_PLAYED
161 && pp->safety[i] == S_UNKNOWN)
162 miles++;
163 if (miles + safe == NUMSAFE)
164 goto extend;
165 for (miles = 0, i = 0; i < HAND_SZ; i++)
166 if ((safe = pp->hand[i]) <= C_200)
167 miles += Value[safe];
168 if (miles + (Topcard - Deck) * 3 > 1000)
169 goto extend;
170 goto done;
171 }
172 else
173 goto done;
174 }
175
176 /*
177 * Get a yes or no answer to the given question. Saves are
178 * also allowed. Return TRUE if the answer was yes, FALSE if no.
179 */
180 getyn(promptno)
181 register int promptno; {
182
183 reg char c;
184
185 Saved = FALSE;
186 for (;;) {
187 leaveok(Board, FALSE);
188 prompt(promptno);
189 clrtoeol();
190 refresh();
191 switch (c = readch()) {
192 case 'n': case 'N':
193 addch('N');
194 refresh();
195 leaveok(Board, TRUE);
196 return FALSE;
197 case 'y': case 'Y':
198 addch('Y');
199 refresh();
200 leaveok(Board, TRUE);
201 return TRUE;
202 case 's': case 'S':
203 addch('S');
204 refresh();
205 Saved = save();
206 continue;
207 case CTRL('L'):
208 wrefresh(curscr);
209 break;
210 default:
211 addstr(unctrl(c));
212 refresh();
213 putchar('\07');
214 break;
215 }
216 }
217 }
218
219 /*
220 * Check to see if more games are desired. If not, and game
221 * came from a saved file, make sure that they don't want to restore
222 * it. Exit appropriately.
223 */
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 * must do accounting normally done in main()
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 readch()
251 {
252 reg int cnt;
253 static char c;
254
255 for (cnt = 0; read(0, &c, 1) <= 0; cnt++)
256 if (cnt > 100)
257 exit(1);
258 return c;
259 }