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

bsd-games/2.17/hack/hack.worn.c

    1: /*      $NetBSD: hack.worn.c,v 1.5 2003/04/02 18:36:42 jsm Exp $     */
    2: 
    3: /*
    4:  * Copyright (c) 1985, Stichting Centrum voor Wiskunde en Informatica,
    5:  * Amsterdam
    6:  * All rights reserved.
    7:  *
    8:  * Redistribution and use in source and binary forms, with or without
    9:  * modification, are permitted provided that the following conditions are
   10:  * met:
   11:  *
   12:  * - Redistributions of source code must retain the above copyright notice,
   13:  * this list of conditions and the following disclaimer.
   14:  *
   15:  * - 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:  * - Neither the name of the Stichting Centrum voor Wiskunde en
   20:  * Informatica, nor the names of its contributors may be used to endorse or
   21:  * promote products derived from this software without specific prior
   22:  * written permission.
   23:  *
   24:  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
   25:  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
   26:  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
   27:  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
   28:  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   29:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   30:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   31:  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   32:  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   33:  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   34:  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   35:  */
   36: 
   37: /*
   38:  * Copyright (c) 1982 Jay Fenlason <hack@gnu.org>
   39:  * All rights reserved.
   40:  *
   41:  * Redistribution and use in source and binary forms, with or without
   42:  * modification, are permitted provided that the following conditions
   43:  * are met:
   44:  * 1. Redistributions of source code must retain the above copyright
   45:  *    notice, this list of conditions and the following disclaimer.
   46:  * 2. Redistributions in binary form must reproduce the above copyright
   47:  *    notice, this list of conditions and the following disclaimer in the
   48:  *    documentation and/or other materials provided with the distribution.
   49:  * 3. The name of the author may not be used to endorse or promote products
   50:  *    derived from this software without specific prior written permission.
   51:  *
   52:  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
   53:  * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY
   54:  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL
   55:  * THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   56:  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   57:  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
   58:  * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
   59:  * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
   60:  * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
   61:  * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   62:  */
   63: 
   64: #include <sys/cdefs.h>
   65: #ifndef lint
   66: __RCSID("$NetBSD: hack.worn.c,v 1.5 2003/04/02 18:36:42 jsm Exp $");
   67: #endif                          /* not lint */
   68: 
   69: #include "hack.h"
   70: #include "extern.h"
   71: 
   72: struct worn {
   73:         long            w_mask;
   74:         struct obj    **w_obj;
   75: }               worn[] = {
   76:         {
   77:                 W_ARM, &uarm
   78:         },
   79:         {
   80:                 W_ARM2, &uarm2
   81:         },
   82:         {
   83:                 W_ARMH, &uarmh
   84:         },
   85:         {
   86:                 W_ARMS, &uarms
   87:         },
   88:         {
   89:                 W_ARMG, &uarmg
   90:         },
   91:         {
   92:                 W_RINGL, &uleft
   93:         },
   94:         {
   95:                 W_RINGR, &uright
   96:         },
   97:         {
   98:                 W_WEP, &uwep
   99:         },
  100:         {
  101:                 W_BALL, &uball
  102:         },
  103:         {
  104:                 W_CHAIN, &uchain
  105:         },
  106:         {
  107:                 0, 0
  108:         }
  109: };
  110: 
  111: void
  112: setworn(obj, mask)
  113:         struct obj     *obj;
  114:         long            mask;
  115: {
  116:         struct worn    *wp;
  117:         struct obj     *oobj;
  118: 
  119:         for (wp = worn; wp->w_mask; wp++)
  120:                 if (wp->w_mask & mask) {
  121:                         oobj = *(wp->w_obj);
  122:                         if (oobj && !(oobj->owornmask & wp->w_mask))
  123:                                 impossible("Setworn: mask = %ld.", wp->w_mask);
  124:                         if (oobj)
  125:                                 oobj->owornmask &= ~wp->w_mask;
  126:                         if (obj && oobj && wp->w_mask == W_ARM) {
  127:                                 if (uarm2) {
  128:                                         impossible("Setworn: uarm2 set?");
  129:                                 } else
  130:                                         setworn(uarm, W_ARM2);
  131:                         }
  132:                         *(wp->w_obj) = obj;
  133:                         if (obj)
  134:                                 obj->owornmask |= wp->w_mask;
  135:                 }
  136:         if (uarm2 && !uarm) {
  137:                 uarm = uarm2;
  138:                 uarm2 = 0;
  139:                 uarm->owornmask ^= (W_ARM | W_ARM2);
  140:         }
  141: }
  142: 
  143: /* called e.g. when obj is destroyed */
  144: void
  145: setnotworn(obj)
  146:         struct obj     *obj;
  147: {
  148:         struct worn    *wp;
  149: 
  150:         for (wp = worn; wp->w_mask; wp++)
  151:                 if (obj == *(wp->w_obj)) {
  152:                         *(wp->w_obj) = 0;
  153:                         obj->owornmask &= ~wp->w_mask;
  154:                 }
  155:         if (uarm2 && !uarm) {
  156:                 uarm = uarm2;
  157:                 uarm2 = 0;
  158:                 uarm->owornmask ^= (W_ARM | W_ARM2);
  159:         }
  160: }
Syntax (Markdown)