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