(linenum→info "unix/slp.c:2238")

bsd-games/2.17/dab/box.cc

    1: /*      $NetBSD: box.cc,v 1.1 2003/12/27 01:16:55 christos 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:  * box.C: Box computations
   41:  */
   42: #include "defs.h"
   43: RCSID("$NetBSD: box.cc,v 1.1 2003/12/27 01:16:55 christos Exp $")
   44: 
   45: #include "box.h"
   46: #include "board.h"
   47: #include "gamescreen.h"
   48: #include <curses.h>
   49: 
   50: const POINT BOX::edges[BOX::last] =
   51:     { { 0, -1 }, { 0, 1 }, { -1, 0 }, { 1, 0 } };
   52: const POINT BOX::corners[BOX::last] =
   53:     { { -1, -1 }, { -1, 1 }, { 1, -1 }, { 1, 1 } };
   54: const int  BOX::syms[BOX::last] =
   55:     { GAMESCREEN::GS_HLINE, GAMESCREEN::GS_HLINE,
   56:       GAMESCREEN::GS_VLINE, GAMESCREEN::GS_VLINE };
   57: 
   58: BOX::BOX(size_t py, size_t px, BOARD& b) :
   59:     _b(b)
   60: {
   61:     _centery = py * 2 + 1;
   62:     _centerx = px * 2 + 1;
   63: }
   64: 
   65: void BOX::addcorner(size_t y, size_t x)
   66: {
   67:     char sym;
   68:     _b.getScrn()->moveto(y, x);
   69:     if (x == 0) {
   70:         if (y == 0)
   71:             sym = GAMESCREEN::GS_ULCORNER;
   72:         else if (y == _b.ty() - 1)
   73:             sym = GAMESCREEN::GS_LLCORNER;
   74:         else
   75:             sym = GAMESCREEN::GS_LTEE;
   76:     } else if (x == _b.tx() - 1) {
   77:         if (y == 0)
   78:             sym = GAMESCREEN::GS_URCORNER;
   79:         else if (y == _b.ty() - 1)
   80:             sym = GAMESCREEN::GS_LRCORNER;
   81:         else
   82:             sym = GAMESCREEN::GS_RTEE;
   83:     } else if (y == 0)
   84:         sym = GAMESCREEN::GS_TTEE;
   85:     else if (y == _b.ty() - 1)
   86:         sym = GAMESCREEN::GS_BTEE;
   87:     else
   88:         sym = GAMESCREEN::GS_PLUS;
   89: 
   90:     _b.getScrn()->addedge(sym);
   91: }
   92: 
   93: // Paint a box
   94: void BOX::paint(void)
   95: {
   96:     int e;
   97:     if (_b.getScrn() == NULL)
   98:         return;
   99: 
  100:     _b.getScrn()->moveto(_centery, _centerx);
  101:     _b.getScrn()->addsym(name());
  102: 
  103:     for (e = BOX::first; e < BOX::last; e++) {
  104:         addcorner(_centery + corners[e].y, _centerx + corners[e].x);
  105:         _b.getScrn()->moveto(_centery + edges[e].y, _centerx + edges[e].x);
  106:         _b.getScrn()->addedge(edge((EDGE) e));
  107:     }
  108:     _b.getScrn()->redraw();
  109: }
  110: 
  111: // Return the name
  112: int& BOX::name(void)
  113: {
  114:     return _b.data(_centery, _centerx);
  115: }
  116: 
  117: // Set an edge
  118: void BOX::set(int e)
  119: {
  120:     _b.data(_centery + edges[e].y, _centerx + edges[e].x) = syms[e];
  121: }
  122: 
  123: // Clear an edge
  124: void BOX::clr(int e)
  125: {
  126:     _b.data(_centery + edges[e].y, _centerx + edges[e].x) = ' ';
  127: }
  128: 
  129: // Test an edge
  130: int BOX::isset(int e) const
  131: {
  132:     return _b.data(_centery + edges[e].y, _centerx + edges[e].x) != ' ';
  133: }
  134: 
  135: // Return the edge
  136: int& BOX::edge(int e)
  137: {
  138:     return _b.data(_centery + edges[e].y, _centerx + edges[e].x);
  139: }
  140: 
  141: // Count the number of edges set in the box
  142: int BOX::count(void) const
  143: {
  144:     int cnt = 0;
  145: 
  146:     for (int e = BOX::first; e < BOX::last; e++)
  147:         cnt += isset((EDGE) e);
  148:     return cnt;
  149: }
  150: 
  151: // Clear the box
  152: void BOX::reset(void)
  153: {
  154:     for (int e = BOX::first; e < BOX::last; e++)
  155:         clr((EDGE) e);
  156:     name() = ' ';
  157: } 
Syntax (Markdown)