summaryrefslogtreecommitdiff
path: root/games/mille/mille.h
blob: b066e0e5731cde84ef1d60d4ec1bc3e89a2b6109 (plain)
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
/*	$OpenBSD: mille.h,v 1.11 2015/01/19 00:47:01 deraadt Exp $	*/
/*	$NetBSD: mille.h,v 1.5 1995/03/24 05:01:51 cgd Exp $	*/

/*
 * Copyright (c) 1982, 1993
 *	The Regents of the University of California.  All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 * 3. Neither the name of the University nor the names of its contributors
 *    may be used to endorse or promote products derived from this software
 *    without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 *
 *	@(#)mille.h	8.1 (Berkeley) 5/31/93
 */

#include	<sys/types.h>
#include	<sys/uio.h>
#include	<sys/stat.h>
#include	<ctype.h>
#include	<err.h>
#include	<errno.h>
#include	<curses.h>
#include	<fcntl.h>
#include	<stdlib.h>
#include	<string.h>
#include	<termios.h>
#include	<unistd.h>

/*
 * @(#)mille.h	1.1 (Berkeley) 4/1/82
 */

/*
 * Miscellaneous constants
 */

#define	CARD		short

#define	HAND_SZ		7	/* number of cards in a hand	*/
#define	DECK_SZ		101	/* number of cards in decks	*/
#define	NUM_SAFE	4	/* number of safety cards	*/
#define	NUM_MILES	5	/* number of milestones types	*/
#define	NUM_CARDS	20	/* number of types of cards	*/
#define	BOARD_Y		17	/* size of board screen		*/
#define	BOARD_X		40
#define	MILES_Y		7	/* size of mileage screen	*/
#define	MILES_X		80
#define	SCORE_Y		17	/* size of score screen		*/
#define	SCORE_X		40
#define	MOVE_Y		10	/* Where to print move prompt	*/
#define	MOVE_X		20
#define	ERR_Y		15	/* Where to print errors	*/
#define	ERR_X		5
#define	EXT_Y		4	/* Where to put Extension	*/
#define	EXT_X		9

#define	PLAYER		0
#define	COMP		1

#define	W_SMALL		0	/* Small (initial) window	*/
#define	W_FULL		1	/* Full (final) window		*/

/*
 * Move types
 */

#define	M_DISCARD	0
#define	M_DRAW		1
#define	M_PLAY		2
#define	M_ORDER		3

/*
 * Scores
 */

#define	SC_SAFETY	100
#define	SC_ALL_SAFE	300
#define	SC_COUP		300
#define	SC_TRIP		400
#define	SC_SAFE		300
#define	SC_DELAY	300
#define	SC_EXTENSION	200
#define	SC_SHUT_OUT	500

/*
 * safety descriptions
 */

#define	S_UNKNOWN	0	/* location of safety unknown	*/
#define	S_IN_HAND	1	/* safety in player's hand	*/
#define	S_PLAYED	2	/* safety has been played	*/
#define	S_GAS_SAFE	0	/* Gas safety card index	*/
#define	S_SPARE_SAFE	1	/* Tire safety card index	*/
#define	S_DRIVE_SAFE	2	/* Driveing safety card index	*/
#define	S_RIGHT_WAY	3	/* Right-of-Way card index	*/
#define	S_CONV		15	/* conversion from C_ to S_	*/

/*
 * card numbers
 */

#define	C_INIT		-1
#define	C_25		0
#define	C_50		1
#define	C_75		2
#define	C_100		3
#define	C_200		4
#define	C_EMPTY		5
#define	C_FLAT		6	
#define	C_CRASH		7
#define	C_STOP		8
#define	C_LIMIT		9
#define	C_GAS		10
#define	C_SPARE		11
#define	C_REPAIRS	12
#define	C_GO		13
#define	C_END_LIMIT	14
#define	C_GAS_SAFE	15
#define	C_SPARE_SAFE	16
#define	C_DRIVE_SAFE	17
#define	C_RIGHT_WAY	18

/*
 * prompt types
 */

#define	MOVEPROMPT		0
#define	REALLYPROMPT		1
#define	ANOTHERHANDPROMPT	2
#define	ANOTHERGAMEPROMPT	3
#define	SAVEGAMEPROMPT		4
#define	SAMEFILEPROMPT		5
#define	FILEPROMPT		6
#define	EXTENSIONPROMPT		7
#define	OVERWRITEFILEPROMPT	8

typedef struct {
	bool	coups[NUM_SAFE];
	bool	can_go;
	bool	new_battle;
	bool	new_speed;
	short	safety[NUM_SAFE];
	short	sh_safety[NUM_SAFE];
	short	nummiles[NUM_MILES];
	short	sh_nummiles[NUM_MILES];
	CARD	hand[HAND_SZ];
	CARD	sh_hand[HAND_SZ];
	CARD	battle;
	CARD	sh_battle;
	CARD	speed;
	CARD	sh_speed;
	int	mileage;
	int	sh_mileage;
	int	hand_tot;
	int	sh_hand_tot;
	int	safescore;
	int	sh_safescore;
	int	coupscore;
	int	total;
	int	sh_total;
	int	games;
	int	sh_games;
	int	was_finished;
} PLAY;

/*
 * macros
 */

#define	other(x)	(1 - x)
#define	nextplay()	(Play = other(Play))
#define	nextwin(x)	(1 - x)
#define	opposite(x)	(Opposite[x])
#define	is_safety(x)	(x >= C_GAS_SAFE)

/*
 * externals
 */

extern bool	Debug, Finished, Next, On_exit, Order, Saved;

extern char	Initstr[100], *C_fmt;
extern const char	*const *C_name, *Fromfile;

extern int	Card_no, End, Handstart, Movetype, Numgos,
		Numneed[], Numseen[NUM_CARDS], Play, Window;
extern const int	Numcards[], Value[];

extern CARD	Deck[DECK_SZ], Discard, Sh_discard, *Topcard;
extern const CARD	Opposite[NUM_CARDS];

extern FILE	*outf;

extern PLAY	Player[2];

extern WINDOW	*Board, *Miles, *Score;

/*
 * functions
 */

void	account(CARD);
void	calcmove(void);
int	canplay(const PLAY *, const PLAY *, CARD);
int	check_ext(bool);
void	check_go(void);
void	check_more(void);
void	die(int);
void	domove(void);
bool	error(char *, ...);
void	finalscore(PLAY *);
CARD	getcard(void);
void	getmove(void);
int	getyn(int);
int	haspicked(const PLAY *);
void	init(void);
int	is_repair(CARD);
int	main(int, char **);
void	newboard(void);
void	newscore(void);
int	onecard(const PLAY *);
int	playcard(PLAY *);
void	prboard(void);
void	prompt(int);
void	prscore(bool);
int	readch(void);
bool	rest_f(const char *);
int	roll(int, int);
void	rub(int);
int	safety(CARD);
bool	save(void);
void	show_card(int, int, CARD, CARD *);
void	show_score(int, int, int, int *);
void	shuffle(void);
void	sort(CARD *);
bool	varpush(int, ssize_t(int, const struct iovec *, int));
#ifdef EXTRAP
void	extrapolate(PLAY *);
void	undoex(void);
#endif