1 /* $NetBSD: pl_2.c,v 1.13 2009/03/15 03:33:56 dholland Exp $ */ 2 3 /* 4 * Copyright (c) 1983, 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[] = "@(#)pl_2.c 8.1 (Berkeley) 5/31/93"; 36 #else 37 __RCSID("$NetBSD: pl_2.c,v 1.13 2009/03/15 03:33:56 dholland Exp $"); 38 #endif 39 #endif /* not lint */ 40 41 #include <signal.h> 42 #include <unistd.h> 43 #include "display.h" 44 #include "extern.h" 45 #include "player.h" 46 47 /*ARGSUSED*/ 48 void 49 newturn(int n __unused) 50 { 51 repaired = loaded = fired = changed = 0; 52 movebuf[0] = '\0'; 53 54 alarm(0); 55 if (mf->readyL & R_LOADING) { 56 if (mf->readyL & R_DOUBLE) 57 mf->readyL = R_LOADING; 58 else 59 mf->readyL = R_LOADED; 60 } 61 if (mf->readyR & R_LOADING) { 62 if (mf->readyR & R_DOUBLE) 63 mf->readyR = R_LOADING; 64 else 65 mf->readyR = R_LOADED; 66 } 67 if (!hasdriver) 68 send_ddead(); 69 70 display_hide_prompt(); 71 if (Sync() < 0) 72 leave(LEAVE_SYNC); 73 if (!hasdriver) 74 leave(LEAVE_DRIVER); 75 display_reshow_prompt(); 76 77 if (turn % 50 == 0) 78 send_alive(); 79 if (mf->FS && (!mc->rig1 || windspeed == 6)) 80 send_fs(ms, 0); 81 if (mf->FS == 1) 82 send_fs(ms, 2); 83 84 if (mf->struck) 85 leave(LEAVE_QUIT); 86 if (mf->captured != 0) 87 leave(LEAVE_CAPTURED); 88 if (windspeed == 7) 89 leave(LEAVE_HURRICAN); 90 91 display_adjust_view(); 92 display_redraw(); 93 94 signal(SIGALRM, newturn); 95 alarm(7); 96 } 97 98 void 99 play(void) 100 { 101 struct ship *sp; 102 103 for (;;) { 104 blockalarm(); 105 display_redraw(); 106 unblockalarm(); 107 108 switch (sgetch("~ ", (struct ship *)0, 0)) { 109 case 14: /* ^N */ 110 display_scroll_pagedown(); 111 break; 112 case 16: /* ^P */ 113 display_scroll_pageup(); 114 break; 115 case 'm': 116 acceptmove(); 117 break; 118 case 's': 119 acceptsignal(); 120 break; 121 case 'g': 122 grapungrap(); 123 break; 124 case 'u': 125 unfoulplayer(); 126 break; 127 case 'v': 128 Msg("%s", version); 129 break; 130 case 'b': 131 acceptboard(); 132 break; 133 case 'f': 134 acceptcombat(); 135 break; 136 case 'l': 137 loadplayer(); 138 break; 139 case 'c': 140 changesail(); 141 break; 142 case 'r': 143 repair(); 144 break; 145 case 'B': 146 Msg("'Hands to stations!'"); 147 unboard(ms, ms, 1); /* cancel DBP's */ 148 unboard(ms, ms, 0); /* cancel offense */ 149 break; 150 case '\f': 151 centerview(); 152 display_force_full_redraw(); 153 break; 154 case 'L': 155 mf->loadL = L_EMPTY; 156 mf->loadR = L_EMPTY; 157 mf->readyL = R_EMPTY; 158 mf->readyR = R_EMPTY; 159 Msg("Broadsides unloaded"); 160 break; 161 case 'q': 162 Msg("Type 'Q' to quit"); 163 break; 164 case 'Q': 165 leave(LEAVE_QUIT); 166 break; 167 case 'I': 168 foreachship(sp) 169 if (sp != ms) 170 eyeball(sp); 171 break; 172 case 'i': 173 if ((sp = closestenemy(ms, 0, 1)) == NULL) 174 Msg("No more ships left."); 175 else 176 eyeball(sp); 177 break; 178 case 'C': 179 centerview(); 180 break; 181 case 'U': 182 upview(); 183 break; 184 case 'D': 185 case 'N': 186 downview(); 187 break; 188 case 'H': 189 leftview(); 190 break; 191 case 'J': 192 rightview(); 193 break; 194 case 'F': 195 lookout(); 196 break; 197 case 'S': 198 dont_adjust = !dont_adjust; 199 break; 200 } 201 } 202 } 203