#include <sys/uio.h>
#include <curses.h>
#define CARD short
#define HAND_SZ 7
#define DECK_SZ 101
#define NUM_SAFE 4
#define NUM_MILES 5
#define NUM_CARDS 20
#define BOARD_Y 17
#define BOARD_X 40
#define MILES_Y 7
#define MILES_X 80
#define SCORE_Y 17
#define SCORE_X 40
#define MOVE_Y 10
#define MOVE_X 20
#define ERR_Y 15
#define ERR_X 5
#define EXT_Y 4
#define EXT_X 9
#define PLAYER 0
#define COMP 1
#define W_SMALL 0
#define W_FULL 1
#define M_DISCARD 0
#define M_DRAW 1
#define M_PLAY 2
#define M_ORDER 3
#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
#define S_UNKNOWN 0
#define S_IN_HAND 1
#define S_PLAYED 2
#define S_GAS_SAFE 0
#define S_SPARE_SAFE 1
#define S_DRIVE_SAFE 2
#define S_RIGHT_WAY 3
#define S_CONV 15
#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
#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;
#undef CTRL
#define CTRL(c) ((c) & 0x1f)
#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)
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;
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);
__dead 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);
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