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: # include <sys/types.h>
35: # include <sys/uio.h>
36: # include <sys/stat.h>
37: # include <ctype.h>
38: # include <err.h>
39: # include <errno.h>
40: # include <curses.h>
41: # include <fcntl.h>
42: # include <stdlib.h>
43: # include <string.h>
44: # include <termios.h>
45: # include <unistd.h>
46:
47:
48:
49:
50:
51:
52:
53:
54:
55: # define unsgn unsigned
56: # define CARD short
57:
58: # define HAND_SZ 7
59: # define DECK_SZ 101
60: # define NUM_SAFE 4
61: # define NUM_MILES 5
62: # define NUM_CARDS 20
63: # define BOARD_Y 17
64: # define BOARD_X 40
65: # define MILES_Y 7
66: # define MILES_X 80
67: # define SCORE_Y 17
68: # define SCORE_X 40
69: # define MOVE_Y 10
70: # define MOVE_X 20
71: # define ERR_Y 15
72: # define ERR_X 5
73: # define EXT_Y 4
74: # define EXT_X 9
75:
76: # define PLAYER 0
77: # define COMP 1
78:
79: # define W_SMALL 0
80: # define W_FULL 1
81:
82:
83:
84:
85:
86: # define M_DISCARD 0
87: # define M_DRAW 1
88: # define M_PLAY 2
89: # define M_ORDER 3
90:
91:
92:
93:
94:
95: # define SC_SAFETY 100
96: # define SC_ALL_SAFE 300
97: # define SC_COUP 300
98: # define SC_TRIP 400
99: # define SC_SAFE 300
100: # define SC_DELAY 300
101: # define SC_EXTENSION 200
102: # define SC_SHUT_OUT 500
103:
104:
105:
106:
107:
108: # undef S_UNKNOWN
109: # undef S_IN_HAND
110: # undef S_PLAYED
111: # undef S_GAS_SAFE
112: # undef S_SPARE_SAFE
113: # undef S_DRIVE_SAFE
114: # undef S_RIGHT_WAY
115: # undef S_CONV
116: # define S_UNKNOWN 0
117: # define S_IN_HAND 1
118: # define S_PLAYED 2
119: # define S_GAS_SAFE 0
120: # define S_SPARE_SAFE 1
121: # define S_DRIVE_SAFE 2
122: # define S_RIGHT_WAY 3
123: # define S_CONV 15
124:
125:
126:
127:
128:
129: # define C_INIT -1
130: # define C_25 0
131: # define C_50 1
132: # define C_75 2
133: # define C_100 3
134: # define C_200 4
135: # define C_EMPTY 5
136: # define C_FLAT 6
137: # define C_CRASH 7
138: # define C_STOP 8
139: # define C_LIMIT 9
140: # define C_GAS 10
141: # define C_SPARE 11
142: # define C_REPAIRS 12
143: # define C_GO 13
144: # define C_END_LIMIT 14
145: # define C_GAS_SAFE 15
146: # define C_SPARE_SAFE 16
147: # define C_DRIVE_SAFE 17
148: # define C_RIGHT_WAY 18
149:
150:
151:
152:
153:
154: # define MOVEPROMPT 0
155: # define REALLYPROMPT 1
156: # define ANOTHERHANDPROMPT 2
157: # define ANOTHERGAMEPROMPT 3
158: # define SAVEGAMEPROMPT 4
159: # define SAMEFILEPROMPT 5
160: # define FILEPROMPT 6
161: # define EXTENSIONPROMPT 7
162: # define OVERWRITEFILEPROMPT 8
163:
164: # ifdef SYSV
165: # define srandom(x) srand(x)
166: # define random() rand()
167: # endif
168:
169: typedef struct {
170: bool coups[NUM_SAFE];
171: bool can_go;
172: bool new_battle;
173: bool new_speed;
174: short safety[NUM_SAFE];
175: short sh_safety[NUM_SAFE];
176: short nummiles[NUM_MILES];
177: short sh_nummiles[NUM_MILES];
178: CARD hand[HAND_SZ];
179: CARD sh_hand[HAND_SZ];
180: CARD battle;
181: CARD sh_battle;
182: CARD speed;
183: CARD sh_speed;
184: int mileage;
185: int sh_mileage;
186: int hand_tot;
187: int sh_hand_tot;
188: int safescore;
189: int sh_safescore;
190: int coupscore;
191: int total;
192: int sh_total;
193: int games;
194: int sh_games;
195: int was_finished;
196: } PLAY;
197:
198:
199:
200:
201:
202: # define other(x) (1 - x)
203: # define nextplay() (Play = other(Play))
204: # define nextwin(x) (1 - x)
205: # define opposite(x) (Opposite[x])
206: # define is_safety(x) (x >= C_GAS_SAFE)
207:
208:
209:
210:
211:
212: extern bool Debug, Finished, Next, On_exit, Order, Saved;
213:
214: extern char Initstr[];
215: extern const char *C_fmt, *const *C_name, *Fromfile;
216:
217: extern int Card_no, End, Handstart, Movetype, Numgos,
218: Numneed[], Numseen[NUM_CARDS], Play, Window;
219: extern const int Numcards[], Value[];
220:
221: extern CARD Deck[DECK_SZ], Discard, Sh_discard, *Topcard;
222: extern const CARD Opposite[NUM_CARDS];
223:
224: extern FILE *outf;
225:
226: extern PLAY Player[2];
227:
228: extern WINDOW *Board, *Miles, *Score;
229:
230:
231:
232:
233:
234: void account(CARD);
235: void calcmove(void);
236: int canplay(const PLAY *, const PLAY *, CARD);
237: int check_ext(bool);
238: void check_go(void);
239: void check_more(void);
240: void die(int) __attribute__((__noreturn__));
241: void domove(void);
242: bool error(const char *, ...);
243: void extrapolate(PLAY *);
244: void finalscore(PLAY *);
245: CARD getcard(void);
246: void getmove(void);
247: int getyn(int);
248: int haspicked(const PLAY *);
249: void init(void);
250: int is_repair(CARD);
251: int main(int, char **);
252: void newboard(void);
253: void newscore(void);
254: int onecard(const PLAY *);
255: int playcard(PLAY *);
256: void prboard(void);
257: void prompt(int);
258: void prscore(bool);
259: int readch(void);
260: bool rest_f(const char *);
261: int roll(int, int);
262: void rub(int);
263: int safety(CARD);
264: bool save(void);
265: void show_card(int, int, CARD, CARD *);
266: void show_score(int, int, int, int *);
267: void shuffle(void);
268: void sort(CARD *);
269: void undoex(int);
270: #if defined(__linux__) && !defined(__GLIBC__)
271: bool varpush(int, ssize_t (int, const struct iovec *, size_t));
272: #else
273: bool varpush(int, ssize_t (int, const struct iovec *, int));
274: #endif