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

bsd-games/2.17/trek/snova.c

    1: /*      $NetBSD: snova.c,v 1.5 2003/08/07 09:37:54 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[] = "@(#)snova.c     8.1 (Berkeley) 5/31/93";
   36: #else
   37: __RCSID("$NetBSD: snova.c,v 1.5 2003/08/07 09:37:54 agc Exp $");
   38: #endif
   39: #endif /* not lint */
   40: 
   41: #include <stdio.h>
   42: #include <unistd.h>
   43: #include "trek.h"
   44: 
   45: /*
   46: **  CAUSE SUPERNOVA TO OCCUR
   47: **
   48: **      A supernova occurs.  If 'ix' < 0, a random quadrant is chosen;
   49: **      otherwise, the current quadrant is taken, and (ix, iy) give
   50: **      the sector quadrants of the star which is blowing up.
   51: **
   52: **      If the supernova turns out to be in the quadrant you are in,
   53: **      you go into "emergency override mode", which tries to get you
   54: **      out of the quadrant as fast as possible.  However, if you
   55: **      don't have enough fuel, or if you by chance run into something,
   56: **      or some such thing, you blow up anyway.  Oh yeh, if you are
   57: **      within two sectors of the star, there is nothing that can
   58: **      be done for you.
   59: **
   60: **      When a star has gone supernova, the quadrant becomes uninhab-
   61: **      itable for the rest of eternity, i.e., the game.  If you ever
   62: **      try stopping in such a quadrant, you will go into emergency
   63: **      override mode.
   64: */
   65: 
   66: void
   67: snova(x, y)
   68: int     x, y;
   69: {
   70:         int            qx, qy;
   71:         int            ix, iy = 0;
   72:         int            f;
   73:         int            dx, dy;
   74:         int            n;
   75:         struct quad    *q;
   76: 
   77:         f = 0;
   78:         ix = x;
   79:         if (ix < 0)
   80:         {
   81:                 /* choose a quadrant */
   82:                 while (1)
   83:                 {
   84:                         qx = ranf(NQUADS);
   85:                         qy = ranf(NQUADS);
   86:                         q = &Quad[qx][qy];
   87:                         if (q->stars > 0)
   88:                                 break;
   89:                 }
   90:                 if (Ship.quadx == qx && Ship.quady == qy)
   91:                 {
   92:                         /* select a particular star */
   93:                         n = ranf(q->stars);
   94:                         for (ix = 0; ix < NSECTS; ix++)
   95:                         {
   96:                                 for (iy = 0; iy < NSECTS; iy++)
   97:                                         if (Sect[ix][iy] == STAR || Sect[ix][iy] == INHABIT)
   98:                                                 if ((n -= 1) <= 0)
   99:                                                         break;
  100:                                 if (n <= 0)
  101:                                         break;
  102:                         }
  103:                         f = 1;
  104:                 }
  105:         }
  106:         else
  107:         {
  108:                 /* current quadrant */
  109:                 iy = y;
  110:                 qx = Ship.quadx;
  111:                 qy = Ship.quady;
  112:                 q = &Quad[qx][qy];
  113:                 f = 1;
  114:         }
  115:         if (f)
  116:         {
  117:                 /* supernova is in same quadrant as Enterprise */
  118:                 printf("\nRED ALERT: supernova occuring at %d,%d\n", ix, iy);
  119:                 dx = ix - Ship.sectx;
  120:                 dy = iy - Ship.secty;
  121:                 if (dx * dx + dy * dy <= 2)
  122:                 {
  123:                         printf("***  Emergency override attem");
  124:                         sleep(1);
  125:                         printf("\n");
  126:                         lose(L_SNOVA);
  127:                 }
  128:                 q->scanned = 1000;
  129:         }
  130:         else
  131:         {
  132:                 if (!damaged(SSRADIO))
  133:                 {
  134:                         q->scanned = 1000;
  135:                         printf("\nUhura: Captain, Starfleet Command reports a supernova\n");
  136:                         printf("  in quadrant %d,%d.  Caution is advised\n", qx, qy);
  137:                 }
  138:         }
  139: 
  140:         /* clear out the supernova'ed quadrant */
  141:         dx = q->klings;
  142:         dy = q->stars;
  143:         Now.klings -= dx;
  144:         if (x >= 0)
  145:         {
  146:                 /* Enterprise caused supernova */
  147:                 Game.kills += dy;
  148:                 if (q->bases)
  149:                         killb(qx, qy);
  150:                 Game.killk += dx;
  151:         }
  152:         else
  153:                 if (q->bases)
  154:                         killb(qx, qy);
  155:         killd(qx, qy, (x >= 0));
  156:         q->stars = -1;
  157:         q->klings = 0;
  158:         if (Now.klings <= 0)
  159:         {
  160:                 printf("Lucky devil, that supernova destroyed the last klingon\n");
  161:                 win();
  162:         }
  163:         return;
  164: }
Syntax (Markdown)