1 /* 2 * Copyright (c) 1983, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright 11 * notice, this list of conditions and the following disclaimer in the 12 * documentation and/or other materials provided with the distribution. 13 * 3. All advertising materials mentioning features or use of this software 14 * must display the following acknowledgement: 15 * This product includes software developed by the University of 16 * California, Berkeley and its contributors. 17 * 4. Neither the name of the University nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 * 33 * @(#)pl_6.c 8.1 (Berkeley) 5/31/93 34 * $FreeBSD: src/games/sail/pl_6.c,v 1.5 1999/11/30 03:49:37 billf Exp $ 35 * $DragonFly: src/games/sail/pl_6.c,v 1.3 2006/09/03 17:33:13 pavalos Exp $ 36 */ 37 38 #include "player.h" 39 40 static bool turned(void); 41 42 void 43 repair(void) 44 { 45 char c; 46 char *repairs; 47 struct shipspecs *ptr = mc; 48 int count; 49 50 #define FIX(x, m) (m - ptr->x > count \ 51 ? (ptr->x += count, count = 0) : (count -= m - ptr->x, ptr->x = m)) 52 53 if (repaired || loaded || fired || changed || turned()) { 54 Signal("No hands free to repair", NULL); 55 return; 56 } 57 c = sgetch("Repair (hull, guns, rigging)? ", NULL, 1); 58 switch (c) { 59 case 'h': 60 repairs = &mf->RH; 61 break; 62 case 'g': 63 repairs = &mf->RG; 64 break; 65 case 'r': 66 repairs = &mf->RR; 67 break; 68 default: 69 Signal("Avast heaving!", NULL); 70 return; 71 } 72 if (++*repairs >= 3) { 73 count = 2; 74 switch (c) { 75 case 'h': { 76 int max = ptr->guns/4; 77 if (ptr->hull < max) { 78 FIX(hull, max); 79 Write(W_HULL, ms, ptr->hull, 0, 0, 0); 80 } 81 break; 82 } 83 case 'g': 84 if (ptr->gunL < ptr->gunR) { 85 int max = ptr->guns/5 - ptr->carL; 86 if (ptr->gunL < max) { 87 FIX(gunL, max); 88 Write(W_GUNL, ms, ptr->gunL, 89 ptr->carL, 0, 0); 90 } 91 } else { 92 int max = ptr->guns/5 - ptr->carR; 93 if (ptr->gunR < max) { 94 FIX(gunR, max); 95 Write(W_GUNR, ms, ptr->gunR, 96 ptr->carR, 0, 0); 97 } 98 } 99 break; 100 case 'r': 101 #define X 2 102 if (ptr->rig4 >= 0 && ptr->rig4 < X) { 103 FIX(rig4, X); 104 Write(W_RIG4, ms, ptr->rig4, 0, 0, 0); 105 } 106 if (count && ptr->rig3 < X) { 107 FIX(rig3, X); 108 Write(W_RIG3, ms, ptr->rig3, 0, 0, 0); 109 } 110 if (count && ptr->rig2 < X) { 111 FIX(rig2, X); 112 Write(W_RIG2, ms, ptr->rig2, 0, 0, 0); 113 } 114 if (count && ptr->rig1 < X) { 115 FIX(rig1, X); 116 Write(W_RIG1, ms, ptr->rig1, 0, 0, 0); 117 } 118 break; 119 } 120 if (count == 2) { 121 Signal("Repairs completed.", NULL); 122 *repairs = 2; 123 } else { 124 *repairs = 0; 125 blockalarm(); 126 draw_stat(); 127 unblockalarm(); 128 } 129 } 130 blockalarm(); 131 draw_slot(); 132 unblockalarm(); 133 repaired = 1; 134 } 135 136 static bool 137 turned(void) 138 { 139 char *p; 140 141 for (p = movebuf; *p; p++) 142 if (*p == 'r' || *p == 'l') 143 return 1; 144 return 0; 145 } 146 147 void 148 loadplayer(void) 149 { 150 char c; 151 int loadL, loadR, ready, load; 152 153 if (!mc->crew3) { 154 Signal("Out of crew", NULL); 155 return; 156 } 157 loadL = mf->loadL; 158 loadR = mf->loadR; 159 if (!loadL && !loadR) { 160 c = sgetch("Load which broadside (left or right)? ", 161 NULL, 1); 162 if (c == 'r') 163 loadL = 1; 164 else 165 loadR = 1; 166 } 167 if ((!loadL && loadR) || (loadL && !loadR)) { 168 c = sgetch("Reload with (round, double, chain, grape)? ", 169 NULL, 1); 170 switch (c) { 171 case 'r': 172 load = L_ROUND; 173 ready = 0; 174 break; 175 case 'd': 176 load = L_DOUBLE; 177 ready = R_DOUBLE; 178 break; 179 case 'c': 180 load = L_CHAIN; 181 ready = 0; 182 break; 183 case 'g': 184 load = L_GRAPE; 185 ready = 0; 186 break; 187 default: 188 Signal("Broadside not loaded.", 189 NULL); 190 return; 191 } 192 if (!loadR) { 193 mf->loadR = load; 194 mf->readyR = ready|R_LOADING; 195 } else { 196 mf->loadL = load; 197 mf->readyL = ready|R_LOADING; 198 } 199 loaded = 1; 200 } 201 } 202