xref: /dragonfly/games/backgammon/common_source/back.h (revision 4318c66eac379e15105fe145d406dfef81b795f6)
1 /*        $NetBSD: back.h,v 1.21 2020/04/22 23:36:26 joerg Exp $      */
2 
3 /*
4  * Copyright (c) 1980, 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  *        @(#)back.h          8.1 (Berkeley) 5/31/93
32  */
33 
34 #include <sys/types.h>
35 #include <sys/uio.h>
36 
37 #include <fcntl.h>
38 #include <signal.h>
39 #include <stdio.h>
40 #include <stdlib.h>
41 #include <string.h>
42 #include <termios.h>
43 #include <termcap.h>
44 #include <unistd.h>
45 
46 #define rnum(r)     (random()%r)
47 #define D0          dice[0]
48 #define D1          dice[1]
49 #define mswap(m) {(m)->D0 ^= (m)->D1; (m)->D1 ^= (m)->D0; (m)->D0 ^= (m)->D1; (m)->d0 = 1-(m)->d0;}
50 
51 struct move {
52           int       dice[2];  /* value of dice */
53           int       mvlim;              /* 'move limit':  max. number of moves */
54           int       p[5];               /* starting position of moves */
55           int       g[5];               /* ending position of moves (goals) */
56           int       h[4];               /* flag for each move if a man was hit */
57           int       d0;                 /* flag if dice have been reversed from
58                                            original position */
59 };
60 
61 /*
62  *
63  * Some numerical conventions:
64  *
65  *        Arrays have white's value in [0], red in [1].
66  *        Numeric values which are one color or the other use
67  *        -1 for white, 1 for red.
68  *        Hence, white will be negative values, red positive one.
69  *        This makes a lot of sense since white is going in decending
70  *        order around the board, and red is ascending.
71  *
72  */
73 
74 extern    const char          EXEC[];             /* object for main program */
75 extern    const char          TEACH[];  /* object for tutorial program */
76 
77 extern    int       pnum;               /* color of player:
78                                                   -1 = white
79                                                    1 = red
80                                                    0 = both
81                                                    2 = not yet init'ed */
82 extern    char      args[100];          /* args passed to teachgammon and back */
83 extern    int       acnt;               /* length of args */
84 extern    int       aflag;              /* flag to ask for rules or instructions */
85 extern    int       bflag;              /* flag for automatic board printing */
86 extern    int       cflag;              /* case conversion flag */
87 extern    int       hflag;              /* flag for cleaning screen */
88 extern    int       mflag;              /* backgammon flag */
89 extern    int       raflag;             /* 'roll again' flag for recovered game */
90 extern    int       rflag;              /* recovered game flag */
91 extern    int       tflag;              /* cursor addressing flag */
92 extern    int       rfl;                /* saved value of rflag */
93 extern    int       iroll;              /* special flag for inputting rolls */
94 extern    int       board[26];          /* board:  negative values are white,
95                                            positive are red */
96 extern    int       cturn;              /* whose turn it currently is:
97                                                   -1 = white
98                                                    1 = red
99                                                    0 = just quitted
100                                                   -2 = white just lost
101                                                    2 = red just lost */
102 extern    int       table[6][6];        /* odds table for possible rolls */
103 extern    int       rscore;             /* red's score */
104 extern    int       wscore;             /* white's score */
105 extern    int       gvalue;             /* value of game (64 max.) */
106 extern    int       dlast;              /* who doubled last (0 = neither) */
107 extern    int       bar;                /* position of bar for current player */
108 extern    int       home;               /* position of home for current player */
109 extern    int       off[2];             /* number of men off board */
110 extern    int       *offptr;  /* pointer to off for current player */
111 extern    int       *offopp;  /* pointer to off for opponent */
112 extern    int       in[2];              /* number of men in inner table */
113 extern    int       *inptr;             /* pointer to in for current player */
114 extern    int       *inopp;             /* pointer to in for opponent */
115 
116 extern    int       ncin;               /* number of characters in cin */
117 extern    char      cin[100]; /* input line of current move
118                                            (used for reconstructing input after
119                                            a backspace) */
120 
121 extern    const char          *const color[];
122                                         /* colors as strings */
123 extern    const char          *const *colorptr;   /* color of current player */
124 extern    const char          *const *Colorptr;   /* color of current player, capitalized */
125 extern    int       colen;              /* length of color of current player */
126 
127 extern int buffnum;
128 
129 extern    struct termios      old, noech, raw;/* original tty status */
130 
131 extern    int       curr;               /* row position of cursor */
132 extern    int       curc;               /* column position of cursor */
133 extern    int       begscr;             /* 'beginning' of screen
134                                            (not including board) */
135 
136 int       addbuf(int);
137 void      backone(struct move *, int);
138 void      buflush(void);
139 int       canhit(int, int);
140 int       checkmove(struct move *, int);
141 void      clear(void);
142 void      clend(void);
143 void      cline(void);
144 int       count(void);
145 void      curmove(int, int);
146 void      errexit(const char *) __dead2;
147 void      fancyc(int);
148 void      fboard(void);
149 void      fixtty(struct termios *);
150 void      getarg(struct move *, char ***);
151 int       getcaps(const char *);
152 void      getmove(struct move *);
153 void      getout(int) __dead2;
154 void      gwrite(void);
155 void      init(void);
156 int       main(int, char *[]);
157 int       makmove(struct move *, int);
158 int       movallow(struct move *);
159 void      movback(struct move *, int);
160 void      moverr(struct move *, int);
161 int       movokay(struct move *, int);
162 void      newpos(void);
163 void      nexturn(void);
164 void      odds(int, int, int);
165 void      proll(struct move *);
166 int       quit(struct move *);
167 int       readc(void);
168 void      recover(struct move *, const char *);
169 void      refresh(void);
170 void      roll(struct move *);
171 void      save(struct move *, int);
172 int       wrtext(const char *const *);
173 void      wrboard(void);
174 void      wrhit(int);
175 void      wrint(int);
176 void      writec(int);
177 void      writel(const char *);
178 void      wrscore(void);
179 int       yorn(int);
180 
181 void move_init(struct move *);
182