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