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