xref: /original-bsd/games/trek/help.c (revision fbb2a877)
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 are permitted
6  * provided that the above copyright notice and this paragraph are
7  * duplicated in all such forms and that any documentation,
8  * advertising materials, and other materials related to such
9  * distribution and use acknowledge that the software was developed
10  * by the University of California, Berkeley.  The name of the
11  * University may not be used to endorse or promote products derived
12  * from this software without specific prior written permission.
13  * THIS SOFTWARE IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
14  * IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
15  * WARRANTIES OF MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE.
16  */
17 
18 #ifndef lint
19 static char sccsid[] = "@(#)help.c	5.3 (Berkeley) 06/18/88";
20 #endif /* not lint */
21 
22 # include	"trek.h"
23 
24 /*
25 **  call starbase for help
26 **
27 **	First, the closest starbase is selected.  If there is a
28 **	a starbase in your own quadrant, you are in good shape.
29 **	This distance takes quadrant distances into account only.
30 **
31 **	A magic number is computed based on the distance which acts
32 **	as the probability that you will be rematerialized.  You
33 **	get three tries.
34 **
35 **	When it is determined that you should be able to be remater-
36 **	ialized (i.e., when the probability thing mentioned above
37 **	comes up positive), you are put into that quadrant (anywhere).
38 **	Then, we try to see if there is a spot adjacent to the star-
39 **	base.  If not, you can't be rematerialized!!!  Otherwise,
40 **	it drops you there.  It only tries five times to find a spot
41 **	to drop you.  After that, it's your problem.
42 */
43 
44 char	*Cntvect[3] =
45 {"first", "second", "third"};
46 
47 help()
48 {
49 	register int		i;
50 	double			dist, x;
51 	register int		dx, dy;
52 	int			j, l;
53 
54 	/* check to see if calling for help is reasonable ... */
55 	if (Ship.cond == DOCKED)
56 		return (printf("Uhura: But Captain, we're already docked\n"));
57 
58 	/* or possible */
59 	if (damaged(SSRADIO))
60 		return (out(SSRADIO));
61 	if (Now.bases <= 0)
62 		return (printf("Uhura: I'm not getting any response from starbase\n"));
63 
64 	/* tut tut, there goes the score */
65 	Game.helps += 1;
66 
67 	/* find the closest base */
68 	dist = 1e50;
69 	if (Quad[Ship.quadx][Ship.quady].bases <= 0)
70 	{
71 		/* there isn't one in this quadrant */
72 		for (i = 0; i < Now.bases; i++)
73 		{
74 			/* compute distance */
75 			dx = Now.base[i].x - Ship.quadx;
76 			dy = Now.base[i].y - Ship.quady;
77 			x = dx * dx + dy * dy;
78 			x = sqrt(x);
79 
80 			/* see if better than what we already have */
81 			if (x < dist)
82 			{
83 				dist = x;
84 				l = i;
85 			}
86 		}
87 
88 		/* go to that quadrant */
89 		Ship.quadx = Now.base[l].x;
90 		Ship.quady = Now.base[l].y;
91 		initquad(1);
92 	}
93 	else
94 	{
95 		dist = 0.0;
96 	}
97 
98 	/* dematerialize the Enterprise */
99 	Sect[Ship.sectx][Ship.secty] = EMPTY;
100 	printf("Starbase in %d,%d responds\n", Ship.quadx, Ship.quady);
101 
102 	/* this next thing acts as a probability that it will work */
103 	x = pow(1.0 - pow(0.94, dist), 0.3333333);
104 
105 	/* attempt to rematerialize */
106 	for (i = 0; i < 3; i++)
107 	{
108 		sleep(2);
109 		printf("%s attempt to rematerialize ", Cntvect[i]);
110 		if (franf() > x)
111 		{
112 			/* ok, that's good.  let's see if we can set her down */
113 			for (j = 0; j < 5; j++)
114 			{
115 				dx = Etc.starbase.x + ranf(3) - 1;
116 				if (dx < 0 || dx >= NSECTS)
117 					continue;
118 				dy = Etc.starbase.y + ranf(3) - 1;
119 				if (dy < 0 || dy >= NSECTS || Sect[dx][dy] != EMPTY)
120 					continue;
121 				break;
122 			}
123 			if (j < 5)
124 			{
125 				/* found an empty spot */
126 				printf("succeeds\n");
127 				Ship.sectx = dx;
128 				Ship.secty = dy;
129 				Sect[dx][dy] = Ship.ship;
130 				dock();
131 				compkldist(0);
132 				return;
133 			}
134 			/* the starbase must have been surrounded */
135 		}
136 		printf("fails\n");
137 	}
138 
139 	/* one, two, three strikes, you're out */
140 	lose(L_NOHELP);
141 }
142