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

bsd-games/2.17/trek/attack.c

    1: /*      $NetBSD: attack.c,v 1.5 2003/08/07 09:37:49 agc Exp $        */
    2: 
    3: /*
    4:  * Copyright (c) 1980, 1993
    5:  *      The Regents of the University of California.  All rights reserved.
    6:  *
    7:  * Redistribution and use in source and binary forms, with or without
    8:  * modification, are permitted provided that the following conditions
    9:  * are met:
   10:  * 1. Redistributions of source code must retain the above copyright
   11:  *    notice, this list of conditions and the following disclaimer.
   12:  * 2. Redistributions in binary form must reproduce the above copyright
   13:  *    notice, this list of conditions and the following disclaimer in the
   14:  *    documentation and/or other materials provided with the distribution.
   15:  * 3. Neither the name of the University nor the names of its contributors
   16:  *    may be used to endorse or promote products derived from this software
   17:  *    without specific prior written permission.
   18:  *
   19:  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
   20:  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   21:  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   22:  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
   23:  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   24:  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   25:  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   26:  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   27:  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   28:  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   29:  * SUCH DAMAGE.
   30:  */
   31: 
   32: #include <sys/cdefs.h>
   33: #ifndef lint
   34: #if 0
   35: static char sccsid[] = "@(#)attack.c    8.1 (Berkeley) 5/31/93";
   36: #else
   37: __RCSID("$NetBSD: attack.c,v 1.5 2003/08/07 09:37:49 agc Exp $");
   38: #endif
   39: #endif /* not lint */
   40: 
   41: #include <stdio.h>
   42: #include <math.h>
   43: #include "trek.h"
   44: 
   45: /*
   46: **  Klingon Attack Routine
   47: **
   48: **      This routine performs the Klingon attack provided that
   49: **      (1) Something happened this move (i.e., not free), and
   50: **      (2) You are not cloaked.  Note that if you issue the
   51: **      cloak command, you are not considered cloaked until you
   52: **      expend some time.
   53: **
   54: **      Klingons are permitted to move both before and after the
   55: **      attack.  They will tend to move toward you before the
   56: **      attack and away from you after the attack.
   57: **
   58: **      Under certain conditions you can get a critical hit.  This
   59: **      sort of hit damages devices.  The probability that a given
   60: **      device is damaged depends on the device.  Well protected
   61: **      devices (such as the computer, which is in the core of the
   62: **      ship and has considerable redundancy) almost never get
   63: **      damaged, whereas devices which are exposed (such as the
   64: **      warp engines) or which are particularly delicate (such as
   65: **      the transporter) have a much higher probability of being
   66: **      damaged.
   67: **
   68: **      The actual amount of damage (i.e., how long it takes to fix
   69: **      it) depends on the amount of the hit and the "damfac[]"
   70: **      entry for the particular device.
   71: **
   72: **      Casualties can also occur.
   73: */
   74: 
   75: void
   76: attack(resting)
   77: int     resting;    /* set if attack while resting */
   78: {
   79:         int            hit, i, l;
   80:         int            maxhit, tothit, shldabsb;
   81:         double         chgfac, propor, extradm;
   82:         double         dustfac, tothe;
   83:         int            cas;
   84:         int            hitflag;
   85: 
   86:         if (Move.free)
   87:                 return;
   88:         if (Etc.nkling <= 0 || Quad[Ship.quadx][Ship.quady].stars < 0)
   89:                 return;
   90:         if (Ship.cloaked && Ship.cloakgood)
   91:                 return;
   92:         /* move before attack */
   93:         klmove(0);
   94:         if (Ship.cond == DOCKED)
   95:         {
   96:                 if (!resting)
   97:                         printf("Starbase shields protect the %s\n", Ship.shipname);
   98:                 return;
   99:         }
  100:         /* setup shield effectiveness */
  101:         chgfac = 1.0;
  102:         if (Move.shldchg)
  103:                 chgfac = 0.25 + 0.50 * franf();
  104:         maxhit = tothit = 0;
  105:         hitflag = 0;
  106: 
  107:         /* let each Klingon do his damndest */
  108:         for (i = 0; i < Etc.nkling; i++)
  109:         {
  110:                 /* if he's low on power he won't attack */
  111:                 if (Etc.klingon[i].power < 20)
  112:                         continue;
  113:                 if (!hitflag)
  114:                 {
  115:                         printf("\nStardate %.2f: Klingon attack:\n",
  116:                                 Now.date);
  117:                         hitflag++;
  118:                 }
  119:                 /* complete the hit */
  120:                 dustfac = 0.90 + 0.01 * franf();
  121:                 tothe = Etc.klingon[i].avgdist;
  122:                 hit = Etc.klingon[i].power * pow(dustfac, tothe) * Param.hitfac;
  123:                 /* deplete his energy */
  124:                 dustfac = Etc.klingon[i].power;
  125:                 Etc.klingon[i].power = dustfac * Param.phasfac * (1.0 + (franf() - 0.5) * 0.2);
  126:                 /* see how much of hit shields will absorb */
  127:                 shldabsb = 0;
  128:                 if (Ship.shldup || Move.shldchg)
  129:                 {
  130:                         propor = Ship.shield;
  131:                         propor /= Param.shield;
  132:                         shldabsb = propor * chgfac * hit;
  133:                         if (shldabsb > Ship.shield)
  134:                                 shldabsb = Ship.shield;
  135:                         Ship.shield -= shldabsb;
  136:                 }
  137:                 /* actually do the hit */
  138:                 printf("HIT: %d units", hit);
  139:                 if (!damaged(SRSCAN))
  140:                         printf(" from %d,%d", Etc.klingon[i].x, Etc.klingon[i].y);
  141:                 cas = (shldabsb * 100) / hit;
  142:                 hit -= shldabsb;
  143:                 if (shldabsb > 0)
  144:                         printf(", shields absorb %d%%, effective hit %d\n",
  145:                                 cas, hit);
  146:                 else
  147:                         printf("\n");
  148:                 tothit += hit;
  149:                 if (hit > maxhit)
  150:                         maxhit = hit;
  151:                 Ship.energy -= hit;
  152:                 /* see if damages occurred */
  153:                 if (hit >= (15 - Game.skill) * (25 - ranf(12)))
  154:                 {
  155:                         printf("CRITICAL HIT!!!\n");
  156:                         /* select a device from probability vector */
  157:                         cas = ranf(1000);
  158:                         for (l = 0; cas >= 0; l++)
  159:                                 cas -= Param.damprob[l];
  160:                         l -= 1;
  161:                         /* compute amount of damage */
  162:                         extradm = (hit * Param.damfac[l]) / (75 + ranf(25)) + 0.5;
  163:                         /* damage the device */
  164:                         damage(l, extradm);
  165:                         if (damaged(SHIELD))
  166:                         {
  167:                                 if (Ship.shldup)
  168:                                         printf("Sulu: Shields knocked down, captain.\n");
  169:                                 Ship.shldup = 0;
  170:                                 Move.shldchg = 0;
  171:                         }
  172:                 }
  173:                 if (Ship.energy <= 0)
  174:                         lose(L_DSTRYD);
  175:         }
  176: 
  177:         /* see what our casualities are like */
  178:         if (maxhit >= 200 || tothit >= 500)
  179:         {
  180:                 cas = tothit * 0.015 * franf();
  181:                 if (cas >= 2)
  182:                 {
  183:                         printf("McCoy: we suffered %d casualties in that attack.\n",
  184:                                 cas);
  185:                         Game.deaths += cas;
  186:                         Ship.crew -= cas;
  187:                 }
  188:         }
  189: 
  190:         /* allow Klingons to move after attacking */
  191:         klmove(1);
  192: 
  193:         return;
  194: }
Syntax (Markdown)