1 /* $NetBSD: mille.h,v 1.17 2009/08/12 08:07:27 dholland Exp $ */ 2 3 /* 4 * Copyright (c) 1982, 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. Neither the name of the University nor the names of its contributors 16 * may be used to endorse or promote products derived from this software 17 * without specific prior written permission. 18 * 19 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 20 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 21 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 22 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 23 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 24 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 25 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 26 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 27 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 28 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 29 * SUCH DAMAGE. 30 * 31 * @(#)mille.h 8.1 (Berkeley) 5/31/93 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 * @(#)mille.h 1.1 (Berkeley) 4/1/82 49 */ 50 51 /* 52 * Miscellaneous constants 53 */ 54 55 #define CARD short 56 57 #define HAND_SZ 7 /* number of cards in a hand */ 58 #define DECK_SZ 101 /* number of cards in decks */ 59 #define NUM_SAFE 4 /* number of saftey cards */ 60 #define NUM_MILES 5 /* number of milestones types */ 61 #define NUM_CARDS 20 /* number of types of cards */ 62 #define BOARD_Y 17 /* size of board screen */ 63 #define BOARD_X 40 64 #define MILES_Y 7 /* size of mileage screen */ 65 #define MILES_X 80 66 #define SCORE_Y 17 /* size of score screen */ 67 #define SCORE_X 40 68 #define MOVE_Y 10 /* Where to print move prompt */ 69 #define MOVE_X 20 70 #define ERR_Y 15 /* Where to print errors */ 71 #define ERR_X 5 72 #define EXT_Y 4 /* Where to put Extension */ 73 #define EXT_X 9 74 75 #define PLAYER 0 76 #define COMP 1 77 78 #define W_SMALL 0 /* Small (initial) window */ 79 #define W_FULL 1 /* Full (final) window */ 80 81 /* 82 * Move types 83 */ 84 85 #define M_DISCARD 0 86 #define M_DRAW 1 87 #define M_PLAY 2 88 #define M_ORDER 3 89 90 /* 91 * Scores 92 */ 93 94 #define SC_SAFETY 100 95 #define SC_ALL_SAFE 300 96 #define SC_COUP 300 97 #define SC_TRIP 400 98 #define SC_SAFE 300 99 #define SC_DELAY 300 100 #define SC_EXTENSION 200 101 #define SC_SHUT_OUT 500 102 103 /* 104 * safety descriptions 105 */ 106 107 #undef S_UNKNOWN 108 #undef S_IN_HAND 109 #undef S_PLAYED 110 #undef S_GAS_SAFE 111 #undef S_SPARE_SAFE 112 #undef S_DRIVE_SAFE 113 #undef S_RIGHT_WAY 114 #undef S_CONV 115 #define S_UNKNOWN 0 /* location of safety unknown */ 116 #define S_IN_HAND 1 /* safety in player's hand */ 117 #define S_PLAYED 2 /* safety has been played */ 118 #define S_GAS_SAFE 0 /* Gas safety card index */ 119 #define S_SPARE_SAFE 1 /* Tire safety card index */ 120 #define S_DRIVE_SAFE 2 /* Driveing safety card index */ 121 #define S_RIGHT_WAY 3 /* Right-of-Way card index */ 122 #define S_CONV 15 /* conversion from C_ to S_ */ 123 124 /* 125 * card numbers 126 */ 127 128 #define C_INIT -1 129 #define C_25 0 130 #define C_50 1 131 #define C_75 2 132 #define C_100 3 133 #define C_200 4 134 #define C_EMPTY 5 135 #define C_FLAT 6 136 #define C_CRASH 7 137 #define C_STOP 8 138 #define C_LIMIT 9 139 #define C_GAS 10 140 #define C_SPARE 11 141 #define C_REPAIRS 12 142 #define C_GO 13 143 #define C_END_LIMIT 14 144 #define C_GAS_SAFE 15 145 #define C_SPARE_SAFE 16 146 #define C_DRIVE_SAFE 17 147 #define C_RIGHT_WAY 18 148 149 /* 150 * prompt types 151 */ 152 153 #define MOVEPROMPT 0 154 #define REALLYPROMPT 1 155 #define ANOTHERHANDPROMPT 2 156 #define ANOTHERGAMEPROMPT 3 157 #define SAVEGAMEPROMPT 4 158 #define SAMEFILEPROMPT 5 159 #define FILEPROMPT 6 160 #define EXTENSIONPROMPT 7 161 #define OVERWRITEFILEPROMPT 8 162 163 #ifdef SYSV 164 #define srandom(x) srand(x) 165 #define random() rand() 166 #endif /* SYSV */ 167 168 typedef struct { 169 bool coups[NUM_SAFE]; 170 bool can_go; 171 bool new_battle; 172 bool new_speed; 173 short safety[NUM_SAFE]; 174 short sh_safety[NUM_SAFE]; 175 short nummiles[NUM_MILES]; 176 short sh_nummiles[NUM_MILES]; 177 CARD hand[HAND_SZ]; 178 CARD sh_hand[HAND_SZ]; 179 CARD battle; 180 CARD sh_battle; 181 CARD speed; 182 CARD sh_speed; 183 int mileage; 184 int sh_mileage; 185 int hand_tot; 186 int sh_hand_tot; 187 int safescore; 188 int sh_safescore; 189 int coupscore; 190 int total; 191 int sh_total; 192 int games; 193 int sh_games; 194 int was_finished; 195 } PLAY; 196 197 /* 198 * macros 199 */ 200 201 #define other(x) (1 - x) 202 #define nextplay() (Play = other(Play)) 203 #define nextwin(x) (1 - x) 204 #define opposite(x) (Opposite[x]) 205 #define is_safety(x) (x >= C_GAS_SAFE) 206 207 /* 208 * externals 209 */ 210 211 extern bool Debug, Finished, Next, On_exit, Order, Saved; 212 213 #define INITSTR_SIZE 100 214 extern char Initstr[INITSTR_SIZE]; 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 * functions 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_more(void); 239 void die(int) __attribute__((__noreturn__)); 240 void domove(void); 241 bool error(const char *, ...); 242 void extrapolate(PLAY *); 243 void finalscore(PLAY *); 244 CARD getcard(void); 245 int getyn(int); 246 void init(void); 247 int is_repair(CARD); 248 int main(int, char **); 249 void newboard(void); 250 void newscore(void); 251 int onecard(const PLAY *); 252 void prboard(void); 253 void prompt(int); 254 void prscore(bool); 255 int readch(void); 256 bool rest_f(const char *); 257 int roll(int, int); 258 void rub(int); 259 int safety(CARD); 260 bool save(void); 261 void shuffle(void); 262 void sort(CARD *); 263 void undoex(int); 264 bool varpush(int, ssize_t (int, const struct iovec *, int)); 265