xref: /netbsd/games/trek/dock.c (revision bf9ec67e)
1 /*	$NetBSD: dock.c,v 1.5 1999/09/08 21:45:32 jsm Exp $	*/
2 
3 /*
4  * Copyright (c) 1980, 1993
5  *	The Regents of the University of California.  All rights reserved.
6  *
7  * Redistribution and use in source and binary forms, with or without
8  * modification, are permitted provided that the following conditions
9  * are met:
10  * 1. Redistributions of source code must retain the above copyright
11  *    notice, this list of conditions and the following disclaimer.
12  * 2. Redistributions in binary form must reproduce the above copyright
13  *    notice, this list of conditions and the following disclaimer in the
14  *    documentation and/or other materials provided with the distribution.
15  * 3. All advertising materials mentioning features or use of this software
16  *    must display the following acknowledgement:
17  *	This product includes software developed by the University of
18  *	California, Berkeley and its contributors.
19  * 4. Neither the name of the University nor the names of its contributors
20  *    may be used to endorse or promote products derived from this software
21  *    without specific prior written permission.
22  *
23  * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
24  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
25  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
26  * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
27  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
28  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
29  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
30  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
31  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
32  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
33  * SUCH DAMAGE.
34  */
35 
36 #include <sys/cdefs.h>
37 #ifndef lint
38 #if 0
39 static char sccsid[] = "@(#)dock.c	8.1 (Berkeley) 5/31/93";
40 #else
41 __RCSID("$NetBSD: dock.c,v 1.5 1999/09/08 21:45:32 jsm Exp $");
42 #endif
43 #endif /* not lint */
44 
45 #include <stdio.h>
46 #include "trek.h"
47 
48 /*
49 **  DOCK TO STARBASE
50 **
51 **	The starship is docked to a starbase.  For this to work you
52 **	must be adjacent to a starbase.
53 **
54 **	You get your supplies replenished and your captives are
55 **	disembarked.  Note that your score is updated now, not when
56 **	you actually take the captives.
57 **
58 **	Any repairs that need to be done are rescheduled to take
59 **	place sooner.  This provides for the faster repairs when you
60 **	are docked.
61 */
62 
63 /*ARGSUSED*/
64 void
65 dock(v)
66 	int v __attribute__((__unused__));
67 {
68 	int		i, j;
69 	int		ok;
70 	struct event	*e;
71 
72 	if (Ship.cond == DOCKED) {
73 		printf("Chekov: But captain, we are already docked\n");
74 		return;
75 	}
76 	/* check for ok to dock, i.e., adjacent to a starbase */
77 	ok = 0;
78 	for (i = Ship.sectx - 1; i <= Ship.sectx + 1 && !ok; i++)
79 	{
80 		if (i < 0 || i >= NSECTS)
81 			continue;
82 		for (j = Ship.secty - 1; j <= Ship.secty + 1; j++)
83 		{
84 			if (j  < 0 || j >= NSECTS)
85 				continue;
86 			if (Sect[i][j] == BASE)
87 			{
88 				ok++;
89 				break;
90 			}
91 		}
92 	}
93 	if (!ok) {
94 		printf("Chekov: But captain, we are not adjacent to a starbase.\n");
95 		return;
96 	}
97 
98 	/* restore resources */
99 	Ship.energy = Param.energy;
100 	Ship.torped = Param.torped;
101 	Ship.shield = Param.shield;
102 	Ship.crew = Param.crew;
103 	Game.captives += Param.brigfree - Ship.brigfree;
104 	Ship.brigfree = Param.brigfree;
105 
106 	/* reset ship's defenses */
107 	Ship.shldup = 0;
108 	Ship.cloaked = 0;
109 	Ship.cond = DOCKED;
110 	Ship.reserves = Param.reserves;
111 
112 	/* recalibrate space inertial navigation system */
113 	Ship.sinsbad = 0;
114 
115 	/* output any saved radio messages */
116 	dumpssradio();
117 
118 	/* reschedule any device repairs */
119 	for (i = 0; i < MAXEVENTS; i++)
120 	{
121 		e = &Event[i];
122 		if (e->evcode != E_FIXDV)
123 			continue;
124 		reschedule(e, (e->date - Now.date) * Param.dockfac);
125 	}
126 	return;
127 }
128 
129 
130 /*
131 **  LEAVE A STARBASE
132 **
133 **	This is the inverse of dock().  The main function it performs
134 **	is to reschedule any damages so that they will take longer.
135 */
136 
137 /*ARGSUSED*/
138 void
139 undock(v)
140 	int v __attribute__((__unused__));
141 {
142 	struct event	*e;
143 	int		i;
144 
145 	if (Ship.cond != DOCKED)
146 	{
147 		printf("Sulu: Pardon me captain, but we are not docked.\n");
148 		return;
149 	}
150 	Ship.cond = GREEN;
151 	Move.free = 0;
152 
153 	/* reschedule device repair times (again) */
154 	for (i = 0; i < MAXEVENTS; i++)
155 	{
156 		e = &Event[i];
157 		if (e->evcode != E_FIXDV)
158 			continue;
159 		reschedule(e, (e->date - Now.date) / Param.dockfac);
160 	}
161 	return;
162 }
163