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