MXDOMAIN compile flag no longer used
[unix-history] / usr / src / games / mille / misc.c
CommitLineData
dd14fdb3
KB
1/*
2 * Copyright (c) 1983 Regents of the University of California.
45c4582b
KB
3 * All rights reserved.
4 *
5 * Redistribution and use in source and binary forms are permitted
65c7d3b6
KB
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.
dd14fdb3
KB
16 */
17
18#ifndef lint
65c7d3b6 19static char sccsid[] = "@(#)misc.c 5.4 (Berkeley) %G%";
45c4582b 20#endif /* not lint */
dd14fdb3
KB
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 */
41error(str, arg)
42char *str;
43{
44 stdscr = Score;
45 mvprintw(ERR_Y, ERR_X, str, arg);
46 clrtoeol();
5b8cd1f5 47 putchar('\07');
dd14fdb3
KB
48 refresh();
49 stdscr = Board;
50 return FALSE;
51}
52
53CARD
54getcard()
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:
5b8cd1f5 76 putchar('\07');
dd14fdb3
KB
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
5b8cd1f5 95 write(0, "\07", 1);
dd14fdb3
KB
96 return c;
97 }
98cont: ;
99 }
100}
101
102check_ext(forcomp)
103reg bool forcomp; {
104
105
106 if (End == 700)
107 if (Play == PLAYER) {
108 if (getyn(EXTENSIONPROMPT)) {
109extend:
110 if (!forcomp)
111 End = 1000;
112 return TRUE;
113 }
114 else {
115done:
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 */
156getyn(promptno)
157register 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();
5b8cd1f5 186 putchar('\07');
dd14fdb3
KB
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 */
197check_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
225readch()
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
236flush_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}