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

bsd-games/2.17/trek/help.c

    1: /*      $NetBSD: help.c,v 1.7 2003/08/07 09:37:52 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[] = "@(#)help.c      8.1 (Berkeley) 5/31/93";
   36: #else
   37: __RCSID("$NetBSD: help.c,v 1.7 2003/08/07 09:37:52 agc Exp $");
   38: #endif
   39: #endif /* not lint */
   40: 
   41: #include <stdio.h>
   42: #include <math.h>
   43: #include <unistd.h>
   44: #include "trek.h"
   45: 
   46: /*
   47: **  call starbase for help
   48: **
   49: **      First, the closest starbase is selected.  If there is a
   50: **      a starbase in your own quadrant, you are in good shape.
   51: **      This distance takes quadrant distances into account only.
   52: **
   53: **      A magic number is computed based on the distance which acts
   54: **      as the probability that you will be rematerialized.  You
   55: **      get three tries.
   56: **
   57: **      When it is determined that you should be able to be remater-
   58: **      ialized (i.e., when the probability thing mentioned above
   59: **      comes up positive), you are put into that quadrant (anywhere).
   60: **      Then, we try to see if there is a spot adjacent to the star-
   61: **      base.  If not, you can't be rematerialized!!!  Otherwise,
   62: **      it drops you there.  It only tries five times to find a spot
   63: **      to drop you.  After that, it's your problem.
   64: */
   65: 
   66: const char      *const Cntvect[3] =
   67: {"first", "second", "third"};
   68: 
   69: /*ARGSUSED*/
   70: void
   71: help(v)
   72:         int v __attribute__((__unused__));
   73: {
   74:         int            i;
   75:         double         dist, x;
   76:         int            dx = 0, dy = 0;
   77:         int            j, l = 0;
   78: 
   79:         /* check to see if calling for help is reasonable ... */
   80:         if (Ship.cond == DOCKED) {
   81:                 printf("Uhura: But Captain, we're already docked\n");
   82:                 return;
   83:         }
   84: 
   85:         /* or possible */
   86:         if (damaged(SSRADIO)) {
   87:                 out(SSRADIO);
   88:                 return;
   89:         }
   90:         if (Now.bases <= 0) {
   91:                 printf("Uhura: I'm not getting any response from starbase\n");
   92:                 return;
   93:         }
   94: 
   95:         /* tut tut, there goes the score */
   96:         Game.helps += 1;
   97: 
   98:         /* find the closest base */
   99:         dist = 1e50;
  100:         if (Quad[Ship.quadx][Ship.quady].bases <= 0)
  101:         {
  102:                 /* there isn't one in this quadrant */
  103:                 for (i = 0; i < Now.bases; i++)
  104:                 {
  105:                         /* compute distance */
  106:                         dx = Now.base[i].x - Ship.quadx;
  107:                         dy = Now.base[i].y - Ship.quady;
  108:                         x = dx * dx + dy * dy;
  109:                         x = sqrt(x);
  110: 
  111:                         /* see if better than what we already have */
  112:                         if (x < dist)
  113:                         {
  114:                                 dist = x;
  115:                                 l = i;
  116:                         }
  117:                 }
  118: 
  119:                 /* go to that quadrant */
  120:                 Ship.quadx = Now.base[l].x;
  121:                 Ship.quady = Now.base[l].y;
  122:                 initquad(1);
  123:         }
  124:         else
  125:         {
  126:                 dist = 0.0;
  127:         }
  128: 
  129:         /* dematerialize the Enterprise */
  130:         Sect[Ship.sectx][Ship.secty] = EMPTY;
  131:         printf("Starbase in %d,%d responds\n", Ship.quadx, Ship.quady);
  132: 
  133:         /* this next thing acts as a probability that it will work */
  134:         x = pow(1.0 - pow(0.94, dist), 0.3333333);
  135: 
  136:         /* attempt to rematerialize */
  137:         for (i = 0; i < 3; i++)
  138:         {
  139:                 sleep(2);
  140:                 printf("%s attempt to rematerialize ", Cntvect[i]);
  141:                 if (franf() > x)
  142:                 {
  143:                         /* ok, that's good.  let's see if we can set her down */
  144:                         for (j = 0; j < 5; j++)
  145:                         {
  146:                                 dx = Etc.starbase.x + ranf(3) - 1;
  147:                                 if (dx < 0 || dx >= NSECTS)
  148:                                         continue;
  149:                                 dy = Etc.starbase.y + ranf(3) - 1;
  150:                                 if (dy < 0 || dy >= NSECTS || Sect[dx][dy] != EMPTY)
  151:                                         continue;
  152:                                 break;
  153:                         }
  154:                         if (j < 5)
  155:                         {
  156:                                 /* found an empty spot */
  157:                                 printf("succeeds\n");
  158:                                 Ship.sectx = dx;
  159:                                 Ship.secty = dy;
  160:                                 Sect[dx][dy] = Ship.ship;
  161:                                 dock(0);
  162:                                 compkldist(0);
  163:                                 return;
  164:                         }
  165:                         /* the starbase must have been surrounded */
  166:                 }
  167:                 printf("fails\n");
  168:         }
  169: 
  170:         /* one, two, three strikes, you're out */
  171:         lose(L_NOHELP);
  172: }
Syntax (Markdown)