Commit | Line | Data |
---|---|---|
b6f0a7e4 DF |
1 | /* |
2 | * Copyright (c) 1980 Regents of the University of California. | |
e9fb6bea KB |
3 | * All rights reserved. |
4 | * | |
5 | * Redistribution and use in source and binary forms are permitted | |
d99e6414 KB |
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. | |
b6f0a7e4 DF |
16 | */ |
17 | ||
5144807d | 18 | #ifndef lint |
d99e6414 | 19 | static char sccsid[] = "@(#)dock.c 5.3 (Berkeley) %G%"; |
e9fb6bea | 20 | #endif /* not lint */ |
5144807d KM |
21 | |
22 | # include "trek.h" | |
23 | ||
24 | /* | |
25 | ** DOCK TO STARBASE | |
26 | ** | |
27 | ** The starship is docked to a starbase. For this to work you | |
28 | ** must be adjacent to a starbase. | |
29 | ** | |
30 | ** You get your supplies replenished and your captives are | |
31 | ** disembarked. Note that your score is updated now, not when | |
32 | ** you actually take the captives. | |
33 | ** | |
34 | ** Any repairs that need to be done are rescheduled to take | |
35 | ** place sooner. This provides for the faster repairs when you | |
36 | ** are docked. | |
37 | */ | |
38 | ||
39 | dock() | |
40 | { | |
41 | register int i, j; | |
42 | int ok; | |
43 | register struct event *e; | |
44 | ||
45 | if (Ship.cond == DOCKED) | |
46 | return (printf("Chekov: But captain, we are already docked\n")); | |
47 | /* check for ok to dock, i.e., adjacent to a starbase */ | |
48 | ok = 0; | |
49 | for (i = Ship.sectx - 1; i <= Ship.sectx + 1 && !ok; i++) | |
50 | { | |
51 | if (i < 0 || i >= NSECTS) | |
52 | continue; | |
53 | for (j = Ship.secty - 1; j <= Ship.secty + 1; j++) | |
54 | { | |
55 | if (j < 0 || j >= NSECTS) | |
56 | continue; | |
57 | if (Sect[i][j] == BASE) | |
58 | { | |
59 | ok++; | |
60 | break; | |
61 | } | |
62 | } | |
63 | } | |
64 | if (!ok) | |
65 | return (printf("Chekov: But captain, we are not adjacent to a starbase.\n")); | |
66 | ||
67 | /* restore resources */ | |
68 | Ship.energy = Param.energy; | |
69 | Ship.torped = Param.torped; | |
70 | Ship.shield = Param.shield; | |
71 | Ship.crew = Param.crew; | |
35b95499 | 72 | Game.captives += Param.brigfree - Ship.brigfree; |
5144807d KM |
73 | Ship.brigfree = Param.brigfree; |
74 | ||
75 | /* reset ship's defenses */ | |
76 | Ship.shldup = 0; | |
77 | Ship.cloaked = 0; | |
78 | Ship.cond = DOCKED; | |
79 | Ship.reserves = Param.reserves; | |
80 | ||
81 | /* recalibrate space inertial navigation system */ | |
82 | Ship.sinsbad = 0; | |
83 | ||
84 | /* output any saved radio messages */ | |
85 | dumpssradio(); | |
86 | ||
87 | /* reschedule any device repairs */ | |
88 | for (i = 0; i < MAXEVENTS; i++) | |
89 | { | |
90 | e = &Event[i]; | |
91 | if (e->evcode != E_FIXDV) | |
92 | continue; | |
93 | reschedule(e, (e->date - Now.date) * Param.dockfac); | |
94 | } | |
95 | return; | |
96 | } | |
97 | ||
98 | ||
99 | /* | |
100 | ** LEAVE A STARBASE | |
101 | ** | |
102 | ** This is the inverse of dock(). The main function it performs | |
103 | ** is to reschedule any damages so that they will take longer. | |
104 | */ | |
105 | ||
106 | undock() | |
107 | { | |
108 | register struct event *e; | |
109 | register int i; | |
110 | ||
111 | if (Ship.cond != DOCKED) | |
112 | { | |
113 | printf("Sulu: Pardon me captain, but we are not docked.\n"); | |
114 | return; | |
115 | } | |
116 | Ship.cond = GREEN; | |
117 | Move.free = 0; | |
118 | ||
119 | /* reschedule device repair times (again) */ | |
120 | for (i = 0; i < MAXEVENTS; i++) | |
121 | { | |
122 | e = &Event[i]; | |
123 | if (e->evcode != E_FIXDV) | |
124 | continue; | |
125 | reschedule(e, (e->date - Now.date) / Param.dockfac); | |
126 | } | |
127 | return; | |
128 | } |