home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / games / trek / help.c < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-08  |  4.7 KB  |  158 lines

  1. /*
  2.  * Copyright (c) 1980 Regents of the University of California.
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  * 1. Redistributions of source code must retain the above copyright
  9.  *    notice, this list of conditions and the following disclaimer.
  10.  * 2. Redistributions in binary form must reproduce the above copyright
  11.  *    notice, this list of conditions and the following disclaimer in the
  12.  *    documentation and/or other materials provided with the distribution.
  13.  * 3. All advertising materials mentioning features or use of this software
  14.  *    must display the following acknowledgement:
  15.  *    This product includes software developed by the University of
  16.  *    California, Berkeley and its contributors.
  17.  * 4. Neither the name of the University nor the names of its contributors
  18.  *    may be used to endorse or promote products derived from this software
  19.  *    without specific prior written permission.
  20.  *
  21.  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
  22.  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
  23.  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
  24.  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
  25.  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
  26.  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
  27.  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
  28.  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
  29.  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
  30.  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
  31.  * SUCH DAMAGE.
  32.  */
  33.  
  34. #ifndef lint
  35. static char sccsid[] = "@(#)help.c    5.4 (Berkeley) 6/1/90";
  36. #endif /* not lint */
  37.  
  38. # include    "trek.h"
  39.  
  40. /*
  41. **  call starbase for help
  42. **
  43. **    First, the closest starbase is selected.  If there is a
  44. **    a starbase in your own quadrant, you are in good shape.
  45. **    This distance takes quadrant distances into account only.
  46. **
  47. **    A magic number is computed based on the distance which acts
  48. **    as the probability that you will be rematerialized.  You
  49. **    get three tries.
  50. **
  51. **    When it is determined that you should be able to be remater-
  52. **    ialized (i.e., when the probability thing mentioned above
  53. **    comes up positive), you are put into that quadrant (anywhere).
  54. **    Then, we try to see if there is a spot adjacent to the star-
  55. **    base.  If not, you can't be rematerialized!!!  Otherwise,
  56. **    it drops you there.  It only tries five times to find a spot
  57. **    to drop you.  After that, it's your problem.
  58. */
  59.  
  60. char    *Cntvect[3] =
  61. {"first", "second", "third"};
  62.  
  63. help()
  64. {
  65.     register int        i;
  66.     double            dist, x;
  67.     register int        dx, dy;
  68.     int            j, l;
  69.  
  70.     /* check to see if calling for help is reasonable ... */
  71.     if (Ship.cond == DOCKED)
  72.         return (printf("Uhura: But Captain, we're already docked\n"));
  73.  
  74.     /* or possible */
  75.     if (damaged(SSRADIO))
  76.         return (out(SSRADIO));
  77.     if (Now.bases <= 0)
  78.         return (printf("Uhura: I'm not getting any response from starbase\n"));
  79.  
  80.     /* tut tut, there goes the score */
  81.     Game.helps += 1;
  82.  
  83.     /* find the closest base */
  84.     dist = 1e50;
  85.     if (Quad[Ship.quadx][Ship.quady].bases <= 0)
  86.     {
  87.         /* there isn't one in this quadrant */
  88.         for (i = 0; i < Now.bases; i++)
  89.         {
  90.             /* compute distance */
  91.             dx = Now.base[i].x - Ship.quadx;
  92.             dy = Now.base[i].y - Ship.quady;
  93.             x = dx * dx + dy * dy;
  94.             x = sqrt(x);
  95.  
  96.             /* see if better than what we already have */
  97.             if (x < dist)
  98.             {
  99.                 dist = x;
  100.                 l = i;
  101.             }
  102.         }
  103.  
  104.         /* go to that quadrant */
  105.         Ship.quadx = Now.base[l].x;
  106.         Ship.quady = Now.base[l].y;
  107.         initquad(1);
  108.     }
  109.     else
  110.     {
  111.         dist = 0.0;
  112.     }
  113.  
  114.     /* dematerialize the Enterprise */
  115.     Sect[Ship.sectx][Ship.secty] = EMPTY;
  116.     printf("Starbase in %d,%d responds\n", Ship.quadx, Ship.quady);
  117.  
  118.     /* this next thing acts as a probability that it will work */
  119.     x = pow(1.0 - pow(0.94, dist), 0.3333333);
  120.  
  121.     /* attempt to rematerialize */
  122.     for (i = 0; i < 3; i++)
  123.     {
  124.         sleep(2);
  125.         printf("%s attempt to rematerialize ", Cntvect[i]);
  126.         if (franf() > x)
  127.         {
  128.             /* ok, that's good.  let's see if we can set her down */
  129.             for (j = 0; j < 5; j++)
  130.             {
  131.                 dx = Etc.starbase.x + ranf(3) - 1;
  132.                 if (dx < 0 || dx >= NSECTS)
  133.                     continue;
  134.                 dy = Etc.starbase.y + ranf(3) - 1;
  135.                 if (dy < 0 || dy >= NSECTS || Sect[dx][dy] != EMPTY)
  136.                     continue;
  137.                 break;
  138.             }
  139.             if (j < 5)
  140.             {
  141.                 /* found an empty spot */
  142.                 printf("succeeds\n");
  143.                 Ship.sectx = dx;
  144.                 Ship.secty = dy;
  145.                 Sect[dx][dy] = Ship.ship;
  146.                 dock();
  147.                 compkldist(0);
  148.                 return;
  149.             }
  150.             /* the starbase must have been surrounded */
  151.         }
  152.         printf("fails\n");
  153.     }
  154.  
  155.     /* one, two, three strikes, you're out */
  156.     lose(L_NOHELP);
  157. }
  158.