xref: /dragonfly/games/backgammon/common_source/board.c (revision 4318c66eac379e15105fe145d406dfef81b795f6)
1 /*        @(#)board.c         8.1 (Berkeley) 5/31/93                                      */
2 /*        $NetBSD: board.c,v 1.9 2009/08/12 05:17:57 dholland Exp $   */
3 
4 /*
5  * Copyright (c) 1980, 1993
6  *        The Regents of the University of California.  All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer.
13  * 2. Redistributions in binary form must reproduce the above copyright
14  *    notice, this list of conditions and the following disclaimer in the
15  *    documentation and/or other materials provided with the distribution.
16  * 3. Neither the name of the University nor the names of its contributors
17  *    may be used to endorse or promote products derived from this software
18  *    without specific prior written permission.
19  *
20  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
21  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
22  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
23  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
24  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
25  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
26  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
27  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
28  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
29  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
30  * SUCH DAMAGE.
31  */
32 
33 #include "back.h"
34 
35 static int i, j, k;
36 static char ln[60];
37 
38 static void wrbsub(void);
39 
40 void
wrboard(void)41 wrboard(void)
42 {
43           int     l;
44           static const char bl[] =
45           "|                       |   |                       |\n";
46           static const char sv[] =
47           "|                       |   |                       |    \n";
48 
49           fixtty(&noech);
50           clear();
51 
52           if (tflag) {
53                     fboard();
54                     goto lastline;
55           }
56           writel("_____________________________________________________\n");
57           writel(bl);
58           strcpy(ln, bl);
59           for (j = 1; j < 50; j += 4) {
60                     k = j / 4 + (j > 24 ? 12 : 13);
61                     ln[j + 1] = k % 10 + '0';
62                     ln[j] = k / 10 + '0';
63                     if (j == 21)
64                               j += 4;
65           }
66           writel(ln);
67           for (i = 0; i < 5; i++) {
68                     strcpy(ln, sv);
69                     for (j = 1; j < 50; j += 4) {
70                               k = j / 4 + (j > 24 ? 12 : 13);
71                               wrbsub();
72                               if (j == 21)
73                                         j += 4;
74                     }
75                     if (-board[25] > i)
76                               ln[26] = 'w';
77                     if (-board[25] > i + 5)
78                               ln[25] = 'w';
79                     if (-board[25] > i + 10)
80                               ln[27] = 'w';
81                     l = 53;
82                     if (off[1] > i || (off[1] < 0 && off[1] + 15 > i)) {
83                               ln[54] = 'r';
84                               l = 55;
85                     }
86                     if (off[1] > i + 5 || (off[1] < 0 && off[1] + 15 > i + 5)) {
87                               ln[55] = 'r';
88                               l = 56;
89                     }
90                     if (off[1] > i + 10 || (off[1] < 0 && off[1] + 15 > i + 10)) {
91                               ln[56] = 'r';
92                               l = 57;
93                     }
94                     ln[l++] = '\n';
95                     ln[l] = '\0';
96                     writel(ln);
97           }
98           strcpy(ln, bl);
99           ln[25] = 'B';
100           ln[26] = 'A';
101           ln[27] = 'R';
102           writel(ln);
103           strcpy(ln, sv);
104           for (i = 4; i > -1; i--) {
105                     for (j = 1; j < 50; j += 4) {
106                               k = ((j > 24 ? 53 : 49) - j) / 4;
107                               wrbsub();
108                               if (j == 21)
109                                         j += 4;
110                     }
111                     if (board[0] > i)
112                               ln[26] = 'r';
113                     if (board[0] > i + 5)
114                               ln[25] = 'r';
115                     if (board[0] > i + 10)
116                               ln[27] = 'r';
117                     l = 53;
118                     if (off[0] > i || (off[0] < 0 && off[0] + 15 > i)) {
119                               ln[54] = 'w';
120                               l = 55;
121                     }
122                     if (off[0] > i + 5 || (off[0] < 0 && off[0] + 15 > i + 5)) {
123                               ln[55] = 'w';
124                               l = 56;
125                     }
126                     if (off[0] > i + 10 || (off[0] < 0 && off[0] + 15 > i + 10)) {
127                               ln[56] = 'w';
128                               l = 57;
129                     }
130                     ln[l++] = '\n';
131                     ln[l] = '\0';
132                     writel(ln);
133           }
134           strcpy(ln, bl);
135           for (j = 1; j < 50; j += 4) {
136                     k = ((j > 24 ? 53 : 49) - j) / 4;
137                     ln[j + 1] = k % 10 + '0';
138                     if (k > 9)
139                               ln[j] = k / 10 + '0';
140                     if (j == 21)
141                               j += 4;
142           }
143           writel(ln);
144           writel("|_______________________|___|_______________________|\n");
145 
146 lastline:
147           gwrite();
148           if (tflag)
149                     curmove(18, 0);
150           else {
151                     writec('\n');
152                     writec('\n');
153           }
154           fixtty(&raw);
155 }
156 
157 static void
wrbsub(void)158 wrbsub(void)
159 {
160           int     m;
161           char    d;
162 
163           if (board[k] > 0) {
164                     m = board[k];
165                     d = 'r';
166           } else {
167                     m = -board[k];
168                     d = 'w';
169           }
170           if (m > i)
171                     ln[j + 1] = d;
172           if (m > i + 5)
173                     ln[j] = d;
174           if (m > i + 10)
175                     ln[j + 2] = d;
176 }
177