xref: /netbsd-src/games/dab/ttyscrn.cc (revision f648d12d47727113ad5330b0753bb2f2ef8e1045)
1 /*	$NetBSD: ttyscrn.cc,v 1.2 2003/12/27 18:24:51 martin Exp $	*/
2 
3 /*-
4  * Copyright (c) 2003 The NetBSD Foundation, Inc.
5  * All rights reserved.
6  *
7  * This code is derived from software contributed to The NetBSD Foundation
8  * by Christos Zoulas.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer.
15  * 2. Redistributions in binary form must reproduce the above copyright
16  *    notice, this list of conditions and the following disclaimer in the
17  *    documentation and/or other materials provided with the distribution.
18  * 3. All advertising materials mentioning features or use of this software
19  *    must display the following acknowledgement:
20  *        This product includes software developed by the NetBSD
21  *        Foundation, Inc. and its contributors.
22  * 4. Neither the name of The NetBSD Foundation nor the names of its
23  *    contributors may be used to endorse or promote products derived
24  *    from this software without specific prior written permission.
25  *
26  * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
27  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
28  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
29  * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
30  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36  * POSSIBILITY OF SUCH DAMAGE.
37  */
38 
39 /*
40  * ttyscrn.C: Curses screen implementation for dots
41  */
42 
43 #include "defs.h"
44 RCSID("$NetBSD: ttyscrn.cc,v 1.2 2003/12/27 18:24:51 martin Exp $")
45 
46 #include <stdio.h>
47 #include <curses.h>
48 #include <sys/ioctl.h>
49 
50 #include "player.h"
51 #include "ttyscrn.h"
52 
53 void TTYSCRN::clean(void)
54 {
55     clear();
56 }
57 
58 void TTYSCRN::moveto(size_t y, size_t x)
59 {
60     move(y + TTYSCRN::offsy, x + TTYSCRN::offsx);
61 }
62 
63 void TTYSCRN::addsym(const int sym)
64 {
65     addch(sym);
66 }
67 
68 void TTYSCRN::addedge(const int sym)
69 {
70     int nsym;
71 #ifdef A_ALTCHARSET
72     if (_acs) {
73 	switch (sym) {
74 	case GS_HLINE:
75 	    nsym = ACS_HLINE;
76 	    break;
77 	case GS_VLINE:
78 	    nsym = ACS_VLINE;
79 	    break;
80 	case GS_ULCORNER:
81 	    nsym = ACS_ULCORNER;
82 	    break;
83 	case GS_URCORNER:
84 	    nsym = ACS_URCORNER;
85 	    break;
86 	case GS_LLCORNER:
87 	    nsym = ACS_LLCORNER;
88 	    break;
89 	case GS_LRCORNER:
90 	    nsym = ACS_LRCORNER;
91 	    break;
92 	case GS_LTEE:
93 	    nsym = ACS_LTEE;
94 	    break;
95 	case GS_RTEE:
96 	    nsym = ACS_RTEE;
97 	    break;
98 	case GS_TTEE:
99 	    nsym = ACS_TTEE;
100 	    break;
101 	case GS_BTEE:
102 	    nsym = ACS_BTEE;
103 	    break;
104 	case GS_PLUS:
105 	    nsym = ACS_PLUS;
106 	    break;
107 	case ' ':
108 	    addsym(' ');
109 	    return;
110 	default:
111 	    ::abort();
112 	}
113 	attron(A_ALTCHARSET);
114 	addch(nsym);
115 	attroff(A_ALTCHARSET);
116 	return;
117     }
118 #endif
119     switch (sym) {
120     case GS_HLINE:
121 	nsym = '-';
122 	break;
123     case GS_VLINE:
124 	nsym = '|';
125 	break;
126     case GS_ULCORNER:
127 	nsym = '.';
128 	break;
129     case GS_URCORNER:
130 	nsym = '.';
131 	break;
132     case GS_LLCORNER:
133 	nsym = '.';
134 	break;
135     case GS_LRCORNER:
136 	nsym = '.';
137 	break;
138     case GS_LTEE:
139 	nsym = '.';
140 	break;
141     case GS_RTEE:
142 	nsym = '.';
143 	break;
144     case GS_TTEE:
145 	nsym = '.';
146 	break;
147     case GS_BTEE:
148 	nsym = '.';
149 	break;
150     case GS_PLUS:
151 	nsym = '+';
152 	break;
153     case ' ':
154 	addsym(' ');
155 	return;
156     default:
157 	::abort();
158     }
159     addsym(nsym);
160 }
161 
162 void TTYSCRN::redraw(void)
163 {
164     refresh();
165     doupdate();
166 }
167 
168 void TTYSCRN::bell(void)
169 {
170     putc('\007', stdout);
171 }
172 
173 int TTYSCRN::getinput(void)
174 {
175     return getch();
176 }
177 
178 void TTYSCRN::score(size_t s, const PLAYER& p)
179 {
180     mvwprintw(stdscr, _sy + s + TTYSCRN::offsscore, _sx, "S %c:%5zd", p.getWho(),
181 	      p.getScore());
182 }
183 
184 void TTYSCRN::total(size_t s, const PLAYER& p)
185 {
186     mvwprintw(stdscr, _sy + s + TTYSCRN::offstotal, _sx, "T %c:%5zd", p.getWho(),
187 	      p.getTotal());
188 }
189 
190 void TTYSCRN::games(size_t s, const PLAYER& p)
191 {
192     mvwprintw(stdscr, _sy + s + TTYSCRN::offsgames, _sx, "G %c:%5zd", p.getWho(),
193 	      p.getGames());
194 }
195 
196 void TTYSCRN::ties(const PLAYER& p)
197 {
198     mvwprintw(stdscr, _sy + TTYSCRN::offsties, _sx, "G =:%5zd", p.getTies());
199 }
200 
201 TTYSCRN* TTYSCRN::create(int acs, size_t y, size_t x)
202 {
203     int tx, ty;
204 
205     initscr();
206 
207     tx = getmaxx(stdscr);
208     ty = getmaxy(stdscr);
209 
210     if (tx == ERR || ty == ERR || (size_t)tx < x * 2 + TTYSCRN::offsx + 12
211 	|| (size_t)ty < y * 2 + TTYSCRN::offsy) {
212 	endwin();
213 	return NULL;
214     }
215     cbreak();
216     noecho();
217 
218 
219     TTYSCRN* that = new TTYSCRN;
220 
221     that->_tx = tx;
222     that->_ty = ty;
223     that->_sx = tx - 12;
224     that->_sy = TTYSCRN::offsy;
225     that->_acs = acs;
226 
227     return that;
228 }
229 
230 TTYSCRN::~TTYSCRN(void)
231 {
232     nocbreak();
233     echo();
234     endwin();
235 }
236