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

bsd-games/2.17/dab/human.cc

    1: /*      $NetBSD: human.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:  * human.C: Human interface for dots, using rogue-like keys.
   41:  */
   42: #include "defs.h"
   43: RCSID("$NetBSD: human.cc,v 1.1 2003/12/27 01:16:55 christos Exp $")
   44: 
   45: #include "human.h"
   46: #include "board.h"
   47: #include "box.h"
   48: 
   49: #define CONTROL(a) ((a) & 037)
   50: 
   51: HUMAN::HUMAN(const char c) :
   52:     PLAYER(c),
   53:     _curx(0),
   54:     _cury(1)
   55: {
   56: }
   57: 
   58: void HUMAN::play(const BOARD& b, size_t& y, size_t& x, int& dir)
   59: {
   60:     int mv;
   61:     b.setpos(_cury, _curx);
   62: 
   63:     for (;;) {
   64:         switch (mv = b.getmove()) {
   65:         case 'h': case 'H':
   66:             _curx -= 2;
   67:             break;
   68: 
   69:         case 'l': case 'L':
   70:             _curx += 2;
   71:             break;
   72: 
   73:         case 'k': case 'K':
   74:             _cury -= 2;
   75:             break;
   76: 
   77:         case 'j': case 'J':
   78:             _cury += 2;
   79:             break;
   80: 
   81:         case 'u': case 'U':
   82:             _curx += 1;
   83:             _cury -= 1;
   84:             break;
   85: 
   86:         case 'y': case 'Y':
   87:             _curx -= 1;
   88:             _cury -= 1;
   89:             break;
   90: 
   91:         case 'b': case 'B':
   92:             _curx -= 1;
   93:             _cury += 1;
   94:             break;
   95: 
   96:         case 'n': case 'N':
   97:             _curx += 1;
   98:             _cury += 1;
   99:             break;
  100: 
  101:         case 'q': case 'Q':
  102:             exit(0);
  103: 
  104:         case CONTROL('L'): case CONTROL('R'):
  105:             b.clean();
  106:             b.paint();
  107:             break;
  108: 
  109:         case ' ':
  110:             {
  111:                 x = _curx / 2;
  112:                 y = _cury / 2;
  113: 
  114:                 if (_cury & 1) {
  115:                     if (_curx == 0)
  116:                         dir = BOX::left;
  117:                     else {
  118:                         x--;
  119:                         dir = BOX::right;
  120:                     }
  121:                 }
  122: 
  123:                 if (_curx & 1) {
  124:                     if (_cury == 0)
  125:                         dir = BOX::top;
  126:                     else {
  127:                         y--;
  128:                         dir = BOX::bottom;
  129:                     }
  130:                 }
  131:             }
  132:             return;
  133: 
  134:         default:
  135:             break;
  136:         }
  137: 
  138:         // We add 2 before the comparison to avoid underflow
  139:         if ((2 + _curx) - (_curx & 1) < 2)
  140:             _curx = (b.nx() * 2) + (_curx & 1);
  141:         if (_curx >= (b.nx() * 2) + 1)
  142:             _curx = (_curx & 1);
  143: 
  144:         if ((2 + _cury) - (_cury & 1) < 2)
  145:             _cury = (b.ny() * 2) + (_cury & 1);
  146:         if (_cury >= (b.ny() * 2) + 1)
  147:             _cury = (_cury & 1);
  148: 
  149:         b.setpos(_cury, _curx);
  150:     }
  151: }
Syntax (Markdown)