Home | History | Annotate | Line # | Download | only in sail
pl_6.c revision 1.1
      1 /*
      2  * Copyright (c) 1983 Regents of the University of California.
      3  * 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 
     34 #ifndef lint
     35 static char sccsid[] = "@(#)pl_6.c	5.4 (Berkeley) 6/1/90";
     36 #endif /* not lint */
     37 
     38 #include "player.h"
     39 
     40 repair()
     41 {
     42 	char c;
     43 	register char *repairs;
     44 	register struct shipspecs *ptr = mc;
     45 	register int count;
     46 
     47 #define FIX(x, m) (m - ptr->x > count \
     48 	? (ptr->x += count, count = 0) : (count -= m - ptr->x, ptr->x = m))
     49 
     50 	if (repaired || loaded || fired || changed || turned()) {
     51 		Signal("No hands free to repair", (struct ship *)0);
     52 		return;
     53 	}
     54 	c = sgetch("Repair (hull, guns, rigging)? ", (struct ship *)0, 1);
     55 	switch (c) {
     56 		case 'h':
     57 			repairs = &mf->RH;
     58 			break;
     59 		case 'g':
     60 			repairs = &mf->RG;
     61 			break;
     62 		case 'r':
     63 			repairs = &mf->RR;
     64 			break;
     65 		default:
     66 			Signal("Avast heaving!", (struct ship *)0);
     67 			return;
     68 	}
     69 	if (++*repairs >= 3) {
     70 		count = 2;
     71 		switch (c) {
     72 		case 'h': {
     73 			int max = ptr->guns/4;
     74 			if (ptr->hull < max) {
     75 				FIX(hull, max);
     76 				Write(W_HULL, ms, 0, ptr->hull, 0, 0, 0);
     77 			}
     78 			break;
     79 			}
     80 		case 'g':
     81 			if (ptr->gunL < ptr->gunR) {
     82 				int max = ptr->guns/5 - ptr->carL;
     83 				if (ptr->gunL < max) {
     84 					FIX(gunL, max);
     85 					Write(W_GUNL, ms, 0, ptr->gunL,
     86 						ptr->carL, 0, 0);
     87 				}
     88 			} else {
     89 				int max = ptr->guns/5 - ptr->carR;
     90 				if (ptr->gunR < max) {
     91 					FIX(gunR, max);
     92 					Write(W_GUNR, ms, 0, ptr->gunR,
     93 						ptr->carR, 0, 0);
     94 				}
     95 			}
     96 			break;
     97 		case 'r':
     98 #define X 2
     99 			if (ptr->rig4 >= 0 && ptr->rig4 < X) {
    100 				FIX(rig4, X);
    101 				Write(W_RIG4, ms, 0, ptr->rig4, 0, 0, 0);
    102 			}
    103 			if (count && ptr->rig3 < X) {
    104 				FIX(rig3, X);
    105 				Write(W_RIG3, ms, 0, ptr->rig3, 0, 0, 0);
    106 			}
    107 			if (count && ptr->rig2 < X) {
    108 				FIX(rig2, X);
    109 				Write(W_RIG2, ms, 0, ptr->rig2, 0, 0, 0);
    110 			}
    111 			if (count && ptr->rig1 < X) {
    112 				FIX(rig1, X);
    113 				Write(W_RIG1, ms, 0, ptr->rig1, 0, 0, 0);
    114 			}
    115 			break;
    116 		}
    117 		if (count == 2) {
    118 			Signal("Repairs completed.", (struct ship *)0);
    119 			*repairs = 2;
    120 		} else {
    121 			*repairs = 0;
    122 			blockalarm();
    123 			draw_stat();
    124 			unblockalarm();
    125 		}
    126 	}
    127 	blockalarm();
    128 	draw_slot();
    129 	unblockalarm();
    130 	repaired = 1;
    131 }
    132 
    133 turned()
    134 {
    135 	register char *p;
    136 
    137 	for (p = movebuf; *p; p++)
    138 		if (*p == 'r' || *p == 'l')
    139 			return 1;
    140 	return 0;
    141 }
    142 
    143 loadplayer()
    144 {
    145 	char c;
    146 	register loadL, loadR, ready, load;
    147 
    148 	if (!mc->crew3) {
    149 		Signal("Out of crew", (struct ship *)0);
    150 		return;
    151 	}
    152 	loadL = mf->loadL;
    153 	loadR = mf->loadR;
    154 	if (!loadL && !loadR) {
    155 		c = sgetch("Load which broadside (left or right)? ",
    156 			(struct ship *)0, 1);
    157 		if (c == 'r')
    158 			loadL = 1;
    159 		else
    160 			loadR = 1;
    161 	}
    162 	if (!loadL && loadR || loadL && !loadR) {
    163 		c = sgetch("Reload with (round, double, chain, grape)? ",
    164 			(struct ship *)0, 1);
    165 		switch (c) {
    166 		case 'r':
    167 			load = L_ROUND;
    168 			ready = 0;
    169 			break;
    170 		case 'd':
    171 			load = L_DOUBLE;
    172 			ready = R_DOUBLE;
    173 			break;
    174 		case 'c':
    175 			load = L_CHAIN;
    176 			ready = 0;
    177 			break;
    178 		case 'g':
    179 			load = L_GRAPE;
    180 			ready = 0;
    181 			break;
    182 		default:
    183 			Signal("Broadside not loaded.",
    184 				(struct ship *)0);
    185 			return;
    186 		}
    187 		if (!loadR) {
    188 			mf->loadR = load;
    189 			mf->readyR = ready|R_LOADING;
    190 		} else {
    191 			mf->loadL = load;
    192 			mf->readyL = ready|R_LOADING;
    193 		}
    194 		loaded = 1;
    195 	}
    196 }
    197