|
|
1.1 root 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) 6/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: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.