1 /* $NetBSD: extern.h,v 1.14 2000/02/09 22:27:55 jsm 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. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by the University of 18 * California, Berkeley and its contributors. 19 * 4. Neither the name of the University nor the names of its contributors 20 * may be used to endorse or promote products derived from this software 21 * without specific prior written permission. 22 * 23 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 24 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 25 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 26 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 27 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 28 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 29 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 30 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 31 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 32 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 33 * SUCH DAMAGE. 34 * 35 * @(#)externs.h 8.1 (Berkeley) 5/31/93 36 */ 37 38 #include <stdio.h> 39 #include <signal.h> 40 #include <string.h> 41 #include <ctype.h> 42 #include <setjmp.h> 43 #include <sys/types.h> 44 #include "machdep.h" 45 46 /* program mode */ 47 extern int mode; 48 extern jmp_buf restart; 49 #define MODE_PLAYER 1 50 #define MODE_DRIVER 2 51 #define MODE_LOGGER 3 52 53 /* command line flags */ 54 extern char debug; /* -D */ 55 extern char randomize; /* -x, give first available ship */ 56 extern char longfmt; /* -l, print score in long format */ 57 extern char nobells; /* -b, don't ring bell before Signal */ 58 59 /* other initial modes */ 60 extern gid_t gid; 61 extern gid_t egid; 62 63 #define die() ((rand() >> 3) % 6 + 1) 64 #define sqr(a) ((a) * (a)) 65 #define abs(a) ((a) > 0 ? (a) : -(a)) 66 #define min(a,b) ((a) < (b) ? (a) : (b)) 67 68 #define grappled(a) ((a)->file->ngrap) 69 #define fouled(a) ((a)->file->nfoul) 70 #define snagged(a) (grappled(a) + fouled(a)) 71 72 #define grappled2(a, b) ((a)->file->grap[(b)->file->index].sn_count) 73 #define fouled2(a, b) ((a)->file->foul[(b)->file->index].sn_count) 74 #define snagged2(a, b) (grappled2(a, b) + fouled2(a, b)) 75 76 #define Xgrappled2(a, b) ((a)->file->grap[(b)->file->index].sn_turn < turn-1 ? grappled2(a, b) : 0) 77 #define Xfouled2(a, b) ((a)->file->foul[(b)->file->index].sn_turn < turn-1 ? fouled2(a, b) : 0) 78 #define Xsnagged2(a, b) (Xgrappled2(a, b) + Xfouled2(a, b)) 79 80 #define cleangrapple(a, b, c) Cleansnag(a, b, c, 1) 81 #define cleanfoul(a, b, c) Cleansnag(a, b, c, 2) 82 #define cleansnag(a, b, c) Cleansnag(a, b, c, 3) 83 84 #define sterncolour(sp) ((sp)->file->stern+'0'-((sp)->file->captured?10:0)) 85 #define sternrow(sp) ((sp)->file->row + dr[(sp)->file->dir]) 86 #define sterncol(sp) ((sp)->file->col + dc[(sp)->file->dir]) 87 88 #define capship(sp) ((sp)->file->captured?(sp)->file->captured:(sp)) 89 90 #define readyname(r) ((r) & R_LOADING ? '*' : ((r) & R_INITIAL ? '!' : ' ')) 91 92 /* loadL and loadR, should match loadname[] */ 93 #define L_EMPTY 0 /* should be 0, don't change */ 94 #define L_GRAPE 1 95 #define L_CHAIN 2 96 #define L_ROUND 3 97 #define L_DOUBLE 4 98 #define L_EXPLODE 5 99 100 /* 101 * readyL and readyR, these are bits, except R_EMPTY 102 */ 103 #define R_EMPTY 0 /* not loaded and not loading */ 104 #define R_LOADING 1 /* loading */ 105 #define R_DOUBLE 2 /* loading double */ 106 #define R_LOADED 4 /* loaded */ 107 #define R_INITIAL 8 /* loaded initial */ 108 109 #define HULL 0 110 #define RIGGING 1 111 112 #define W_CAPTAIN 1 113 #define W_CAPTURED 2 114 #define W_CLASS 3 115 #define W_CREW 4 116 #define W_DBP 5 117 #define W_DRIFT 6 118 #define W_EXPLODE 7 119 #define W_FILE 8 120 #define W_FOUL 9 121 #define W_GUNL 10 122 #define W_GUNR 11 123 #define W_HULL 12 124 #define W_MOVE 13 125 #define W_OBP 14 126 #define W_PCREW 15 127 #define W_UNFOUL 16 128 #define W_POINTS 17 129 #define W_QUAL 18 130 #define W_UNGRAP 19 131 #define W_RIGG 20 132 #define W_COL 21 133 #define W_DIR 22 134 #define W_ROW 23 135 #define W_SIGNAL 24 136 #define W_SINK 25 137 #define W_STRUCK 26 138 #define W_TA 27 139 #define W_ALIVE 28 140 #define W_TURN 29 141 #define W_WIND 30 142 #define W_FS 31 143 #define W_GRAP 32 144 #define W_RIG1 33 145 #define W_RIG2 34 146 #define W_RIG3 35 147 #define W_RIG4 36 148 #define W_BEGIN 37 149 #define W_END 38 150 #define W_DDEAD 39 151 152 #define NLOG 10 153 struct logs { 154 char l_name[20]; 155 int l_uid; 156 int l_shipnum; 157 int l_gamenum; 158 int l_netpoints; 159 }; 160 161 struct BP { 162 short turnsent; 163 struct ship *toship; 164 short mensent; 165 }; 166 167 struct snag { 168 short sn_count; 169 short sn_turn; 170 }; 171 172 #define NSCENE nscene 173 #define NSHIP 10 174 #define NBP 3 175 176 #define NNATION 8 177 #define N_A 0 178 #define N_B 1 179 #define N_S 2 180 #define N_F 3 181 #define N_J 4 182 #define N_D 5 183 #define N_K 6 184 #define N_O 7 185 186 struct File { 187 int index; 188 char captain[20]; /* 0 */ 189 short points; /* 20 */ 190 unsigned char loadL; /* 22 */ 191 unsigned char loadR; /* 24 */ 192 unsigned char readyL; /* 26 */ 193 unsigned char readyR; /* 28 */ 194 struct BP OBP[NBP]; /* 30 */ 195 struct BP DBP[NBP]; /* 48 */ 196 char struck; /* 66 */ 197 struct ship *captured; /* 68 */ 198 short pcrew; /* 70 */ 199 char movebuf[10]; /* 72 */ 200 char drift; /* 82 */ 201 short nfoul; 202 short ngrap; 203 struct snag foul[NSHIP]; /* 84 */ 204 struct snag grap[NSHIP]; /* 124 */ 205 char RH; /* 224 */ 206 char RG; /* 226 */ 207 char RR; /* 228 */ 208 char FS; /* 230 */ 209 char explode; /* 232 */ 210 char sink; /* 234 */ 211 unsigned char dir; 212 short col; 213 short row; 214 char loadwith; 215 char stern; 216 }; 217 218 struct ship { 219 const char *shipname; /* 0 */ 220 struct shipspecs *specs; /* 2 */ 221 unsigned char nationality; /* 4 */ 222 short shiprow; /* 6 */ 223 short shipcol; /* 8 */ 224 char shipdir; /* 10 */ 225 struct File *file; /* 12 */ 226 }; 227 228 struct scenario { 229 char winddir; /* 0 */ 230 char windspeed; /* 2 */ 231 char windchange; /* 4 */ 232 unsigned char vessels; /* 12 */ 233 const char *name; /* 14 */ 234 struct ship ship[NSHIP]; /* 16 */ 235 }; 236 extern struct scenario scene[]; 237 extern int nscene; 238 239 struct shipspecs { 240 char bs; 241 char fs; 242 char ta; 243 short guns; 244 unsigned char class; 245 char hull; 246 unsigned char qual; 247 char crew1; 248 char crew2; 249 char crew3; 250 char gunL; 251 char gunR; 252 char carL; 253 char carR; 254 int rig1; 255 int rig2; 256 int rig3; 257 int rig4; 258 short pts; 259 }; 260 extern struct shipspecs specs[]; 261 262 extern struct scenario *cc; /* the current scenario */ 263 extern struct ship *ls; /* &cc->ship[cc->vessels] */ 264 265 #define SHIP(s) (&cc->ship[s]) 266 #define foreachship(sp) for ((sp) = cc->ship; (sp) < ls; (sp)++) 267 268 struct windeffects { 269 char A, B, C, D; 270 }; 271 extern const struct windeffects WET[7][6]; 272 273 struct Tables { 274 char H, G, C, R; 275 }; 276 extern const struct Tables RigTable[11][6]; 277 extern const struct Tables HullTable[11][6]; 278 279 extern const char AMMO[9][4]; 280 extern const char HDT[9][10]; 281 extern const char HDTrake[9][10]; 282 extern const char QUAL[9][5]; 283 extern const char MT[9][3]; 284 285 extern const char *const countryname[]; 286 extern const char *const classname[]; 287 extern const char *const directionname[]; 288 extern const char *const qualname[]; 289 extern const char loadname[]; 290 291 extern const char rangeofshot[]; 292 293 extern const char dr[], dc[]; 294 295 extern int winddir; 296 extern int windspeed; 297 extern int turn; 298 extern int game; 299 extern int alive; 300 extern int people; 301 extern char hasdriver; 302 303 /* assorted.c */ 304 void table __P((int, int, int, struct ship *, struct ship *, int)); 305 void Cleansnag __P((struct ship *, struct ship *, int, int)); 306 307 /* dr_1.c */ 308 void unfoul __P((void)); 309 void boardcomp __P((void)); 310 int fightitout __P((struct ship *, struct ship *, int)); 311 void resolve __P((void)); 312 void compcombat __P((void)); 313 int next __P((void)); 314 315 /* dr_2.c */ 316 void thinkofgrapples __P((void)); 317 void checkup __P((void)); 318 void prizecheck __P((void)); 319 int str_end __P((const char *)); 320 void closeon __P((struct ship *, struct ship *, char[], int, int, int)); 321 int score __P((char[], struct ship *, struct ship *, int)); 322 void move_ship __P((const char *, struct ship *, unsigned char *, short *, short *, char *)); 323 void try __P((char[], char [], int, int, int, int, int, struct ship *, 324 struct ship *, int *, int)); 325 void rmend __P((char *)); 326 327 /* dr_3.c */ 328 void moveall __P((void)); 329 int stillmoving __P((int)); 330 int is_isolated __P((struct ship *)); 331 int push __P((struct ship *, struct ship *)); 332 void step __P((int, struct ship *, char *)); 333 void sendbp __P((struct ship *, struct ship *, int, int)); 334 int is_toughmelee __P((struct ship *, struct ship *, int, int)); 335 void reload __P((void)); 336 void checksails __P((void)); 337 338 /* dr_4.c */ 339 void ungrap __P((struct ship *, struct ship *)); 340 void grap __P((struct ship *, struct ship *)); 341 342 /* dr_5.c */ 343 void subtract __P((struct ship *, int, int [3], struct ship *, int)); 344 int mensent __P((struct ship *, struct ship *, int[3], struct ship **, int *, 345 int)); 346 347 /* dr_main.c */ 348 int dr_main __P((void)); 349 350 /* game.c */ 351 int maxturns __P((struct ship *, char *)); 352 int maxmove __P((struct ship *, int, int)); 353 354 /* lo_main.c */ 355 int lo_main __P((void)); 356 357 /* misc.c */ 358 int range __P((struct ship *, struct ship *)); 359 struct ship *closestenemy __P((struct ship *, int, int)); 360 int angle __P((int, int)); 361 int gunsbear __P((struct ship *, struct ship *)); 362 int portside __P((struct ship *, struct ship *, int)); 363 int colours __P((struct ship *)); 364 void logger __P((struct ship *)); 365 366 /* parties.c */ 367 int meleeing __P((struct ship *, struct ship *)); 368 int boarding __P((struct ship *, int)); 369 void unboard __P((struct ship *, struct ship *, int)); 370 371 /* pl_1.c */ 372 void leave __P((int)) __attribute__((__noreturn__)); 373 void choke __P((int)) __attribute__((__noreturn__)); 374 void child __P((int)); 375 376 /* pl_2.c */ 377 void play __P((void)) __attribute__((__noreturn__)); 378 379 /* pl_3.c */ 380 void acceptcombat __P((void)); 381 void grapungrap __P((void)); 382 void unfoulplayer __P((void)); 383 384 /* pl_4.c */ 385 void changesail __P((void)); 386 void acceptsignal __P((void)); 387 void lookout __P((void)); 388 const char *saywhat __P((struct ship *, int)); 389 void eyeball __P((struct ship *)); 390 391 /* pl_5.c */ 392 void acceptmove __P((void)); 393 void acceptboard __P((void)); 394 void parties __P((int[3], struct ship *, int, int)); 395 396 /* pl_6.c */ 397 void repair __P((void)); 398 int turned __P((void)); 399 void loadplayer __P((void)); 400 401 /* pl_7.c */ 402 void initscreen __P((void)); 403 void cleanupscreen __P((void)); 404 void newturn __P((int)); 405 void Signal __P((const char *, struct ship *, ...)) 406 __attribute__((__format__(__printf__,1,3))); 407 void Msg __P((const char *, ...)) 408 __attribute__((__format__(__printf__,1,2))); 409 void Scroll __P((void)); 410 void prompt __P((const char *, struct ship *)); 411 void endprompt __P((int)); 412 int sgetch __P((const char *, struct ship *, int)); 413 void sgetstr __P((const char *, char *, int)); 414 void draw_screen __P((void)); 415 void draw_view __P((void)); 416 void draw_turn __P((void)); 417 void draw_stat __P((void)); 418 void draw_slot __P((void)); 419 void draw_board __P((void)); 420 void centerview __P((void)); 421 void upview __P((void)); 422 void downview __P((void)); 423 void leftview __P((void)); 424 void rightview __P((void)); 425 void adjustview __P((void)); 426 427 /* pl_main.c */ 428 int pl_main __P((void)); 429 void initialize __P((void)); 430 431 /* sync.c */ 432 void fmtship __P((char *, size_t, const char *, struct ship *)); 433 void makesignal __P((struct ship *, const char *, struct ship *, ...)) 434 __attribute__((__format__(__printf__,2,4))); 435 void makemsg __P((struct ship *, const char *, ...)) 436 __attribute__((__format__(__printf__,2,3))); 437 int sync_exists __P((int)); 438 int sync_open __P((void)); 439 void sync_close __P((int)); 440 void Write __P((int, struct ship *, long, long, long, long)); 441 void Writestr __P((int, struct ship *, const char *)); 442 int Sync __P((void)); 443 int sync_update __P((int, struct ship *, const char *, long, long, long, long)); 444