Commit | Line | Data |
---|---|---|
811a9cdc | 1 | #ifndef lint |
35b95499 | 2 | static char sccsid[] = "@(#)help.c 4.2 (Berkeley) %G%"; |
811a9cdc KM |
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 | ||
35b95499 | 27 | char *Cntvect[3] = |
811a9cdc KM |
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 */ | |
35b95499 | 48 | Game.helps += 1; |
811a9cdc KM |
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 | } |