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