games@tekred.TEK.COM (04/14/88)
Submitted by: bostic@okeeffe.Berkeley.EDU (Keith Bostic)
Comp.sources.games: Volume 4, Issue 11
Archive-name: sail/Part03
#! /bin/sh
# This is a shell archive. Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file". To overwrite existing
# files, type "sh file -c". You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g.. If this archive is complete, you
# will see the following message at the end:
# "End of archive 3 (of 4)."
# Contents: Makefile dr_2.c externs.h machdep.h misc.c pl_1.c pl_2.c
# pl_3.c pl_4.c pl_6.c pl_main.c player.h
# Wrapped by billr@saab on Wed Apr 13 13:38:22 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f Makefile -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"Makefile\"
else
echo shar: Extracting \"Makefile\" \(7030 characters\)
sed "s/^X//" >Makefile <<'END_OF_Makefile'
X#
X# Copyright (c) 1987 Regents of the University of California.
X# All rights reserved.
X#
X# Redistribution and use in source and binary forms are permitted
X# provided that this notice is preserved and that due credit is given
X# to the University of California at Berkeley. The name of the University
X# may not be used to endorse or promote products derived from this
X# software without specific prior written permission. This software
X# is provided ``as is'' without express or implied warranty.
X#
X# @(#)Makefile 5.6 (Berkeley) 3/9/88
X#
XCFLAGS= -O
XLIBC= /lib/libc.a
XLIBS= -lcurses -ltermlib
XSRCS= main.c pl_main.c pl_1.c pl_2.c pl_3.c pl_4.c pl_5.c pl_6.c pl_7.c \
X dr_main.c dr_1.c dr_2.c dr_3.c dr_4.c dr_5.c lo_main.c \
X assorted.c game.c globals.c misc.c parties.c sync.c version.c
XOBJS= main.o pl_main.o pl_1.o pl_2.o pl_3.o pl_4.o pl_5.o pl_6.o pl_7.o \
X dr_main.o dr_1.o dr_2.o dr_3.o dr_4.o dr_5.o lo_main.o \
X assorted.o game.o globals.o misc.o parties.o sync.o version.o
X
Xall: sail
X
Xsail: ${OBJS} ${LIBC}
X ${CC} -o $@ ${OBJS} ${LIBS}
X
Xclean: FRC
X rm -f ${OBJS} core sail
X
Xdepend: FRC
X mkdep ${CFLAGS} ${SRCS}
X
Xinstall: FRC
X install -c -o games -g bin -m 600 /dev/null ${DESTDIR}/usr/games/lib/saillog
X install -s -o games -g bin -m 4700 sail ${DESTDIR}/usr/games/hide
X (cd ${DESTDIR}/usr/games; rm -f sail; ln -s dm sail; chown games.bin sail)
X
Xlint: FRC
X lint ${CFLAGS} ${SRCS}
X
Xtags: FRC
X ctags ${SRCS}
X
XFRC:
X
X# DO NOT DELETE THIS LINE -- mkdep uses it.
X# DO NOT PUT ANYTHING AFTER THIS LINE, IT WILL GO AWAY.
X
Xmain.o: main.c externs.h /usr/include/stdio.h /usr/include/signal.h
Xmain.o: /usr/include/machine/trap.h /usr/include/ctype.h /usr/include/setjmp.h
Xmain.o: machdep.h
Xpl_main.o: pl_main.c player.h /usr/include/curses.h /usr/include/stdio.h
Xpl_main.o: /usr/include/sgtty.h /usr/include/sys/ioctl.h
Xpl_main.o: /usr/include/sys/ttychars.h /usr/include/sys/ttydev.h externs.h
Xpl_main.o: /usr/include/stdio.h /usr/include/signal.h
Xpl_main.o: /usr/include/machine/trap.h /usr/include/ctype.h
Xpl_main.o: /usr/include/setjmp.h machdep.h /usr/include/sys/types.h
Xpl_main.o: /usr/include/sys/wait.h /usr/include/machine/machparam.h
Xpl_1.o: pl_1.c player.h /usr/include/curses.h /usr/include/stdio.h
Xpl_1.o: /usr/include/sgtty.h /usr/include/sys/ioctl.h
Xpl_1.o: /usr/include/sys/ttychars.h /usr/include/sys/ttydev.h externs.h
Xpl_1.o: /usr/include/stdio.h /usr/include/signal.h /usr/include/machine/trap.h
Xpl_1.o: /usr/include/ctype.h /usr/include/setjmp.h machdep.h
Xpl_1.o: /usr/include/sys/types.h /usr/include/sys/wait.h
Xpl_1.o: /usr/include/machine/machparam.h
Xpl_2.o: pl_2.c player.h /usr/include/curses.h /usr/include/stdio.h
Xpl_2.o: /usr/include/sgtty.h /usr/include/sys/ioctl.h
Xpl_2.o: /usr/include/sys/ttychars.h /usr/include/sys/ttydev.h externs.h
Xpl_2.o: /usr/include/stdio.h /usr/include/signal.h /usr/include/machine/trap.h
Xpl_2.o: /usr/include/ctype.h /usr/include/setjmp.h machdep.h
Xpl_3.o: pl_3.c player.h /usr/include/curses.h /usr/include/stdio.h
Xpl_3.o: /usr/include/sgtty.h /usr/include/sys/ioctl.h
Xpl_3.o: /usr/include/sys/ttychars.h /usr/include/sys/ttydev.h externs.h
Xpl_3.o: /usr/include/stdio.h /usr/include/signal.h /usr/include/machine/trap.h
Xpl_3.o: /usr/include/ctype.h /usr/include/setjmp.h machdep.h
Xpl_4.o: pl_4.c player.h /usr/include/curses.h /usr/include/stdio.h
Xpl_4.o: /usr/include/sgtty.h /usr/include/sys/ioctl.h
Xpl_4.o: /usr/include/sys/ttychars.h /usr/include/sys/ttydev.h externs.h
Xpl_4.o: /usr/include/stdio.h /usr/include/signal.h /usr/include/machine/trap.h
Xpl_4.o: /usr/include/ctype.h /usr/include/setjmp.h machdep.h
Xpl_5.o: pl_5.c player.h /usr/include/curses.h /usr/include/stdio.h
Xpl_5.o: /usr/include/sgtty.h /usr/include/sys/ioctl.h
Xpl_5.o: /usr/include/sys/ttychars.h /usr/include/sys/ttydev.h externs.h
Xpl_5.o: /usr/include/stdio.h /usr/include/signal.h /usr/include/machine/trap.h
Xpl_5.o: /usr/include/ctype.h /usr/include/setjmp.h machdep.h
Xpl_6.o: pl_6.c player.h /usr/include/curses.h /usr/include/stdio.h
Xpl_6.o: /usr/include/sgtty.h /usr/include/sys/ioctl.h
Xpl_6.o: /usr/include/sys/ttychars.h /usr/include/sys/ttydev.h externs.h
Xpl_6.o: /usr/include/stdio.h /usr/include/signal.h /usr/include/machine/trap.h
Xpl_6.o: /usr/include/ctype.h /usr/include/setjmp.h machdep.h
Xpl_7.o: pl_7.c player.h /usr/include/curses.h /usr/include/stdio.h
Xpl_7.o: /usr/include/sgtty.h /usr/include/sys/ioctl.h
Xpl_7.o: /usr/include/sys/ttychars.h /usr/include/sys/ttydev.h externs.h
Xpl_7.o: /usr/include/stdio.h /usr/include/signal.h /usr/include/machine/trap.h
Xpl_7.o: /usr/include/ctype.h /usr/include/setjmp.h machdep.h
Xdr_main.o: dr_main.c driver.h externs.h /usr/include/stdio.h
Xdr_main.o: /usr/include/signal.h /usr/include/machine/trap.h
Xdr_main.o: /usr/include/ctype.h /usr/include/setjmp.h machdep.h
Xdr_1.o: dr_1.c driver.h externs.h /usr/include/stdio.h /usr/include/signal.h
Xdr_1.o: /usr/include/machine/trap.h /usr/include/ctype.h /usr/include/setjmp.h
Xdr_1.o: machdep.h
Xdr_2.o: dr_2.c driver.h externs.h /usr/include/stdio.h /usr/include/signal.h
Xdr_2.o: /usr/include/machine/trap.h /usr/include/ctype.h /usr/include/setjmp.h
Xdr_2.o: machdep.h
Xdr_3.o: dr_3.c driver.h externs.h /usr/include/stdio.h /usr/include/signal.h
Xdr_3.o: /usr/include/machine/trap.h /usr/include/ctype.h /usr/include/setjmp.h
Xdr_3.o: machdep.h
Xdr_4.o: dr_4.c externs.h /usr/include/stdio.h /usr/include/signal.h
Xdr_4.o: /usr/include/machine/trap.h /usr/include/ctype.h /usr/include/setjmp.h
Xdr_4.o: machdep.h
Xdr_5.o: dr_5.c externs.h /usr/include/stdio.h /usr/include/signal.h
Xdr_5.o: /usr/include/machine/trap.h /usr/include/ctype.h /usr/include/setjmp.h
Xdr_5.o: machdep.h
Xlo_main.o: lo_main.c /usr/include/pwd.h externs.h /usr/include/stdio.h
Xlo_main.o: /usr/include/signal.h /usr/include/machine/trap.h
Xlo_main.o: /usr/include/ctype.h /usr/include/setjmp.h machdep.h
Xassorted.o: assorted.c externs.h /usr/include/stdio.h /usr/include/signal.h
Xassorted.o: /usr/include/machine/trap.h /usr/include/ctype.h
Xassorted.o: /usr/include/setjmp.h machdep.h
Xgame.o: game.c externs.h /usr/include/stdio.h /usr/include/signal.h
Xgame.o: /usr/include/machine/trap.h /usr/include/ctype.h /usr/include/setjmp.h
Xgame.o: machdep.h
Xglobals.o: globals.c externs.h /usr/include/stdio.h /usr/include/signal.h
Xglobals.o: /usr/include/machine/trap.h /usr/include/ctype.h
Xglobals.o: /usr/include/setjmp.h machdep.h
Xmisc.o: misc.c externs.h /usr/include/stdio.h /usr/include/signal.h
Xmisc.o: /usr/include/machine/trap.h /usr/include/ctype.h /usr/include/setjmp.h
Xmisc.o: machdep.h /usr/include/sys/file.h
Xparties.o: parties.c externs.h /usr/include/stdio.h /usr/include/signal.h
Xparties.o: /usr/include/machine/trap.h /usr/include/ctype.h
Xparties.o: /usr/include/setjmp.h machdep.h
Xsync.o: sync.c externs.h /usr/include/stdio.h /usr/include/signal.h
Xsync.o: /usr/include/machine/trap.h /usr/include/ctype.h /usr/include/setjmp.h
Xsync.o: machdep.h /usr/include/sys/file.h /usr/include/sys/errno.h
Xsync.o: /usr/include/sys/types.h /usr/include/sys/stat.h
Xversion.o: version.c
X
X# IF YOU PUT ANYTHING HERE IT WILL GO AWAY
END_OF_Makefile
if test 7030 -ne `wc -c <Makefile`; then
echo shar: \"Makefile\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f dr_2.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"dr_2.c\"
else
echo shar: Extracting \"dr_2.c\" \(5895 characters\)
sed "s/^X//" >dr_2.c <<'END_OF_dr_2.c'
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X */
X
X#ifndef lint
Xstatic char sccsid[] = "@(#)dr_2.c 5.2 (Berkeley) 3/9/88";
X#endif /* not lint */
X
X#include "driver.h"
X
X#define couldwin(f,t) (f->specs->crew2 > t->specs->crew2 * 1.5)
X
Xthinkofgrapples()
X{
X register struct ship *sp, *sq;
X char friendly;
X
X foreachship(sp) {
X if (sp->file->captain[0] || sp->file->dir == 0)
X continue;
X foreachship(sq) {
X friendly = sp->nationality == capship(sq)->nationality;
X if (!friendly) {
X if (sp->file->struck || sp->file->captured != 0)
X continue;
X if (range(sp, sq) != 1)
X continue;
X if (grappled2(sp, sq))
X if (toughmelee(sp, sq, 0, 0))
X ungrap(sp, sq);
X else
X grap(sp, sq);
X else if (couldwin(sp, sq)) {
X grap(sp, sq);
X sp->file->loadwith = L_GRAPE;
X }
X } else
X ungrap(sp, sq);
X }
X }
X}
X
Xcheckup()
X{
X register struct ship *sp, *sq;
X register char explode, sink;
X
X foreachship(sp) {
X if (sp->file->dir == 0)
X continue;
X explode = sp->file->explode;
X sink = sp->file->sink;
X if (explode != 1 && sink != 1)
X continue;
X if (die() < 5)
X continue;
X Write(sink == 1 ? W_SINK : W_EXPLODE, sp, 0, 2, 0, 0, 0);
X Write(W_DIR, sp, 0, 0, 0, 0, 0);
X if (snagged(sp))
X foreachship(sq)
X cleansnag(sp, sq, 1);
X if (sink != 1) {
X makesignal(sp, "exploding!", (struct ship *)0);
X foreachship(sq) {
X if (sp != sq && sq->file->dir && range(sp, sq) < 4)
X table(RIGGING, L_EXPLODE, sp->specs->guns/13, sq, sp, 6);
X }
X } else
X makesignal(sp, "sinking!", (struct ship *)0);
X }
X}
X
Xprizecheck()
X{
X register struct ship *sp;
X
X foreachship(sp) {
X if (sp->file->captured == 0)
X continue;
X if (sp->file->struck || sp->file->dir == 0)
X continue;
X if (sp->specs->crew1 + sp->specs->crew2 + sp->specs->crew3 > sp->file->pcrew * 6) {
X Write(W_SIGNAL, sp, 1,
X (int)"prize crew overthrown", 0, 0, 0);
X Write(W_POINTS, sp->file->captured, 0, sp->file->captured->file->points - 2 * sp->specs->pts, 0, 0, 0);
X Write(W_CAPTURED, sp, 0, -1, 0, 0, 0);
X }
X }
X}
X
Xstrend(str)
Xchar *str;
X{
X register char *p;
X
X for (p = str; *p; p++)
X ;
X return p == str ? 0 : p[-1];
X}
X
Xcloseon(from, to, command, ta, ma, af)
Xregister struct ship *from, *to;
Xchar command[];
Xint ma, ta, af;
X{
X int high;
X char temp[10];
X
X temp[0] = command[0] = '\0';
X high = -30000;
X try(command, temp, ma, ta, af, ma, from->file->dir, from, to, &high, 0);
X}
X
Xint dtab[] = {0,1,1,2,3,4,4,5}; /* diagonal distances in x==y */
X
Xscore(movement, ship, to, onlytemp)
Xchar movement[];
Xregister struct ship *ship, *to;
Xchar onlytemp;
X{
X char drift;
X int row, col, dir, total, ran;
X register struct File *fp = ship->file;
X
X if ((dir = fp->dir) == 0)
X return 0;
X row = fp->row;
X col = fp->col;
X drift = fp->drift;
X move(movement, ship, &fp->dir, &fp->row, &fp->col, &drift);
X if (!*movement)
X (void) strcpy(movement, "d");
X
X ran = range(ship, to);
X total = -50 * ran;
X if (ran < 4 && gunsbear(ship, to))
X total += 60;
X if ((ran = portside(ship, to, 1) - fp->dir) == 4 || ran == -4)
X total = -30000;
X
X if (!onlytemp) {
X fp->row = row;
X fp->col = col;
X fp->dir = dir;
X }
X return total;
X}
X
Xmove(p, ship, dir, row, col, drift)
Xregister char *p;
Xregister struct ship *ship;
Xregister char *dir;
Xregister short *row, *col;
Xregister char *drift;
X{
X int dist;
X char moved = 0;
X
X for (; *p; p++) {
X switch (*p) {
X case 'r':
X if (++*dir == 9)
X *dir = 1;
X break;
X case 'l':
X if (--*dir == 0)
X *dir = 8;
X break;
X case '1': case '2': case '3': case '4':
X case '5': case '6': case '7':
X moved++;
X if (*dir % 2 == 0)
X dist = dtab[*p - '0'];
X else
X dist = *p - '0';
X *row -= dr[*dir] * dist;
X *col -= dc[*dir] * dist;
X break;
X }
X }
X if (!moved) {
X if (windspeed != 0 && ++*drift > 2) {
X if (ship->specs->class >= 3 && !snagged(ship)
X || (turn & 1) == 0) {
X *row -= dr[winddir];
X *col -= dc[winddir];
X }
X }
X } else
X *drift = 0;
X}
X
Xtry(command, temp, ma, ta, af, vma, dir, f, t, high, rakeme)
Xregister struct ship *f, *t;
Xint ma, ta, af, *high, rakeme;
Xchar command[], temp[];
X{
X register int new, n;
X char st[4];
X#define rakeyou (gunsbear(f, t) && !gunsbear(t, f))
X
X if ((n = strend(temp)) < '1' || n > '9')
X for (n = 1; vma - n >= 0; n++) {
X (void) sprintf(st, "%d", n);
X (void) strcat(temp, st);
X new = score(temp, f, t, rakeme);
X if (new > *high && (!rakeme || rakeyou)) {
X *high = new;
X (void) strcpy(command, temp);
X }
X try(command, temp, ma-n, ta, af, vma-n,
X dir, f, t, high, rakeme);
X rmend(temp);
X }
X if (ma > 0 && ta > 0 && (n = strend(temp)) != 'l' && n != 'r' || !strlen(temp)) {
X (void) strcat(temp, "r");
X new = score(temp, f, t, rakeme);
X if (new > *high && (!rakeme || gunsbear(f, t) && !gunsbear(t, f))) {
X *high = new;
X (void) strcpy(command, temp);
X }
X try(command, temp, ma-1, ta-1, af, min(ma-1, maxmove(f, (dir == 8 ? 1 : dir+1), 0)), (dir == 8 ? 1 : dir+1),f,t,high,rakeme);
X rmend(temp);
X }
X if ((ma > 0 && ta > 0 && (n = strend(temp)) != 'l' && n != 'r') || !strlen(temp)){
X (void) strcat(temp, "l");
X new = score(temp, f, t, rakeme);
X if (new > *high && (!rakeme || (gunsbear(f, t) && !gunsbear(t, f)))){
X *high = new;
X (void) strcpy(command, temp);
X }
X try(command, temp, ma-1, ta-1, af, (min(ma-1,maxmove(f, (dir-1 ? dir-1 : 8), 0))), (dir-1 ? dir -1 : 8), f, t, high, rakeme);
X rmend(temp);
X }
X}
X
Xrmend(str)
Xchar *str;
X{
X register char *p;
X
X for (p = str; *p; p++)
X ;
X if (p != str)
X *--p = 0;
X}
END_OF_dr_2.c
if test 5895 -ne `wc -c <dr_2.c`; then
echo shar: \"dr_2.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f externs.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"externs.h\"
else
echo shar: Extracting \"externs.h\" \(6214 characters\)
sed "s/^X//" >externs.h <<'END_OF_externs.h'
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X *
X * @(#)externs.h 5.2 (Berkeley) 3/9/88
X */
X
X#include <stdio.h>
X#include <signal.h>
X#include <ctype.h>
X#include <setjmp.h>
X#include "machdep.h"
X
X /* program mode */
Xint mode;
Xjmp_buf restart;
X#define MODE_PLAYER 1
X#define MODE_DRIVER 2
X#define MODE_LOGGER 3
X
X /* command line flags */
Xchar debug; /* -D */
Xchar randomize; /* -x, give first available ship */
Xchar longfmt; /* -l, print score in long format */
Xchar nobells; /* -b, don't ring bell before Signal */
X
X /* other initial modes */
Xchar issetuid; /* running setuid */
X
X#define die() ((rand() >> 3) % 6 + 1)
X#define sqr(a) ((a) * (a))
X#define abs(a) ((a) > 0 ? (a) : -(a))
X#define min(a,b) ((a) < (b) ? (a) : (b))
X
X#define grappled(a) ((a)->file->ngrap)
X#define fouled(a) ((a)->file->nfoul)
X#define snagged(a) (grappled(a) + fouled(a))
X
X#define grappled2(a, b) ((a)->file->grap[(b)->file->index].sn_count)
X#define fouled2(a, b) ((a)->file->foul[(b)->file->index].sn_count)
X#define snagged2(a, b) (grappled2(a, b) + fouled2(a, b))
X
X#define Xgrappled2(a, b) ((a)->file->grap[(b)->file->index].sn_turn < turn-1 ? grappled2(a, b) : 0)
X#define Xfouled2(a, b) ((a)->file->foul[(b)->file->index].sn_turn < turn-1 ? fouled2(a, b) : 0)
X#define Xsnagged2(a, b) (Xgrappled2(a, b) + Xfouled2(a, b))
X
X#define cleangrapple(a, b, c) Cleansnag(a, b, c, 1)
X#define cleanfoul(a, b, c) Cleansnag(a, b, c, 2)
X#define cleansnag(a, b, c) Cleansnag(a, b, c, 3)
X
X#define sterncolour(sp) ((sp)->file->stern+'0'-((sp)->file->captured?10:0))
X#define sternrow(sp) ((sp)->file->row + dr[(sp)->file->dir])
X#define sterncol(sp) ((sp)->file->col + dc[(sp)->file->dir])
X
X#define capship(sp) ((sp)->file->captured?(sp)->file->captured:(sp))
X
X#define readyname(r) ((r) & R_LOADING ? '*' : ((r) & R_INITIAL ? '!' : ' '))
X
X/* loadL and loadR, should match loadname[] */
X#define L_EMPTY 0 /* should be 0, don't change */
X#define L_GRAPE 1
X#define L_CHAIN 2
X#define L_ROUND 3
X#define L_DOUBLE 4
X#define L_EXPLODE 5
X
X/*
X * readyL and readyR, these are bits, except R_EMPTY
X */
X#define R_EMPTY 0 /* not loaded and not loading */
X#define R_LOADING 1 /* loading */
X#define R_DOUBLE 2 /* loading double */
X#define R_LOADED 4 /* loaded */
X#define R_INITIAL 8 /* loaded initial */
X
X#define HULL 0
X#define RIGGING 1
X
X#define W_CAPTAIN 1
X#define W_CAPTURED 2
X#define W_CLASS 3
X#define W_CREW 4
X#define W_DBP 5
X#define W_DRIFT 6
X#define W_EXPLODE 7
X#define W_FILE 8
X#define W_FOUL 9
X#define W_GUNL 10
X#define W_GUNR 11
X#define W_HULL 12
X#define W_MOVE 13
X#define W_OBP 14
X#define W_PCREW 15
X#define W_UNFOUL 16
X#define W_POINTS 17
X#define W_QUAL 18
X#define W_UNGRAP 19
X#define W_RIGG 20
X#define W_COL 21
X#define W_DIR 22
X#define W_ROW 23
X#define W_SIGNAL 24
X#define W_SINK 25
X#define W_STRUCK 26
X#define W_TA 27
X#define W_ALIVE 28
X#define W_TURN 29
X#define W_WIND 30
X#define W_FS 31
X#define W_GRAP 32
X#define W_RIG1 33
X#define W_RIG2 34
X#define W_RIG3 35
X#define W_RIG4 36
X#define W_BEGIN 37
X#define W_END 38
X#define W_DDEAD 39
X
X#define NLOG 10
Xstruct logs {
X char l_name[20];
X int l_uid;
X int l_shipnum;
X int l_gamenum;
X int l_netpoints;
X};
X
Xstruct BP {
X short turnsent;
X struct ship *toship;
X short mensent;
X};
X
Xstruct snag {
X short sn_count;
X short sn_turn;
X};
X
X#define NSCENE nscene
X#define NSHIP 10
X#define NBP 3
X
X#define NNATION 8
X#define N_A 0
X#define N_B 1
X#define N_S 2
X#define N_F 3
X#define N_J 4
X#define N_D 5
X#define N_K 6
X#define N_O 7
X
Xstruct File {
X int index;
X char captain[20]; /* 0 */
X short points; /* 20 */
X char loadL; /* 22 */
X char loadR; /* 24 */
X char readyL; /* 26 */
X char readyR; /* 28 */
X struct BP OBP[NBP]; /* 30 */
X struct BP DBP[NBP]; /* 48 */
X char struck; /* 66 */
X struct ship *captured; /* 68 */
X short pcrew; /* 70 */
X char movebuf[10]; /* 72 */
X char drift; /* 82 */
X short nfoul;
X short ngrap;
X struct snag foul[NSHIP]; /* 84 */
X struct snag grap[NSHIP]; /* 124 */
X char RH; /* 224 */
X char RG; /* 226 */
X char RR; /* 228 */
X char FS; /* 230 */
X char explode; /* 232 */
X char sink; /* 234 */
X char dir;
X short col;
X short row;
X char loadwith;
X char stern;
X};
X
Xstruct ship {
X char *shipname; /* 0 */
X struct shipspecs *specs; /* 2 */
X char nationality; /* 4 */
X short shiprow; /* 6 */
X short shipcol; /* 8 */
X char shipdir; /* 10 */
X struct File *file; /* 12 */
X};
X
Xstruct scenario {
X char winddir; /* 0 */
X char windspeed; /* 2 */
X char windchange; /* 4 */
X char vessels; /* 12 */
X char *name; /* 14 */
X struct ship ship[NSHIP]; /* 16 */
X};
Xstruct scenario scene[];
Xint nscene;
X
Xstruct shipspecs {
X char bs;
X char fs;
X char ta;
X short guns;
X char class;
X char hull;
X char qual;
X char crew1;
X char crew2;
X char crew3;
X char gunL;
X char gunR;
X char carL;
X char carR;
X char rig1;
X char rig2;
X char rig3;
X char rig4;
X short pts;
X};
Xstruct shipspecs specs[];
X
Xstruct scenario *cc; /* the current scenario */
Xstruct ship *ls; /* &cc->ship[cc->vessels] */
X
X#define SHIP(s) (&cc->ship[s])
X#define foreachship(sp) for ((sp) = cc->ship; (sp) < ls; (sp)++)
X
Xstruct windeffects {
X char A, B, C, D;
X};
Xstruct windeffects WET[7][6];
X
Xstruct Tables {
X char H, G, C, R;
X};
Xstruct Tables RigTable[11][6];
Xstruct Tables HullTable[11][6];
X
Xchar AMMO[9][4];
Xchar HDT[9][10];
Xchar HDTrake[9][10];
Xchar QUAL[9][5];
Xchar MT[9][3];
X
Xchar *countryname[];
Xchar *classname[];
Xchar *directionname[];
Xchar *qualname[];
Xchar loadname[];
X
Xchar rangeofshot[];
X
Xchar dr[], dc[];
X
Xint winddir;
Xint windspeed;
Xint turn;
Xint game;
Xint alive;
Xint people;
Xchar hasdriver;
X
Xchar *info();
Xchar *quality();
Xdouble arctan();
Xchar *saywhat();
Xstruct ship *closestenemy();
X
Xchar *calloc();
Xchar *rindex();
Xchar *strcpy();
Xchar *strcat();
Xchar *strncpy();
Xchar *getenv();
Xchar *gets();
END_OF_externs.h
if test 6214 -ne `wc -c <externs.h`; then
echo shar: \"externs.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f machdep.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"machdep.h\"
else
echo shar: Extracting \"machdep.h\" \(988 characters\)
sed "s/^X//" >machdep.h <<'END_OF_machdep.h'
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X *
X * @(#)machdep.h 5.2 (Berkeley) 3/9/88
X */
X
X#define LOGFILE "/usr/games/lib/saillog" /* has to match the makefile */
X
X#define TIMEOUT 300 /* Sync() timeout in seconds */
X
X/* for 4.2bsd machines */
X#define blockalarm() ((void) sigblock(1 << SIGALRM-1))
X#define unblockalarm() ((void) sigsetmask(sigblock(0) & ~(1 << SIGALRM-1)))
X
X/* for 2.9bsd machines (onyx)
Xtypedef int void;
X#define blockalarm() ((void) sighold(SIGALRM))
X#define unblockalarm() ((void) sigrelse(SIGALRM))
X*/
END_OF_machdep.h
if test 988 -ne `wc -c <machdep.h`; then
echo shar: \"machdep.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f misc.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"misc.c\"
else
echo shar: Extracting \"misc.c\" \(4932 characters\)
sed "s/^X//" >misc.c <<'END_OF_misc.c'
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X */
X
X#ifndef lint
Xstatic char sccsid[] = "@(#)misc.c 5.2 (Berkeley) 3/9/88";
X#endif /* not lint */
X
X#include "externs.h"
X
X#define distance(x,y) (abs(x) >= abs(y) ? abs(x) + abs(y)/2 : abs(y) + abs(x)/2)
X
X/* XXX */
Xrange(from, to)
Xstruct ship *from, *to;
X{
X register bow1r, bow1c, bow2r, bow2c;
X int stern1r, stern1c, stern2c, stern2r;
X register int bb, bs, sb, ss, result;
X
X if (!to->file->dir)
X return -1;
X stern1r = bow1r = from->file->row;
X stern1c = bow1c = from->file->col;
X stern2r = bow2r = to->file->row;
X stern2c = bow2c = to->file->col;
X result = bb = distance(bow2r - bow1r, bow2c - bow1c);
X if (bb < 5) {
X stern2r += dr[to->file->dir];
X stern2c += dc[to->file->dir];
X stern1r += dr[from->file->dir];
X stern1c += dc[from->file->dir];
X bs = distance((bow2r - stern1r), (bow2c - stern1c));
X sb = distance((bow1r - stern2r), (bow1c - stern2c));
X ss = distance((stern2r - stern1r) ,(stern2c - stern1c));
X result = min(bb, min(bs, min(sb, ss)));
X }
X return result;
X}
X
Xstruct ship *
Xclosestenemy(from, side, anyship)
Xregister struct ship *from;
Xchar side, anyship;
X{
X register struct ship *sp;
X register char a;
X int olddist = 30000, dist;
X struct ship *closest = 0;
X
X a = capship(from)->nationality;
X foreachship(sp) {
X if (sp == from)
X continue;
X if (sp->file->dir == 0)
X continue;
X if (a == capship(sp)->nationality && !anyship)
X continue;
X if (side && gunsbear(from, sp) != side)
X continue;
X dist = range(from, sp);
X if (dist < olddist) {
X closest = sp;
X olddist = dist;
X }
X }
X return closest;
X}
X
Xangle(dr, dc)
Xregister dr, dc;
X{
X register i;
X
X if (dc >= 0 && dr > 0)
X i = 0;
X else if (dr <= 0 && dc > 0)
X i = 2;
X else if (dc <= 0 && dr < 0)
X i = 4;
X else
X i = 6;
X dr = abs(dr);
X dc = abs(dc);
X if ((i == 0 || i == 4) && dc * 2.4 > dr) {
X i++;
X if (dc > dr * 2.4)
X i++;
X } else if ((i == 2 || i == 6) && dr * 2.4 > dc) {
X i++;
X if (dr > dc * 2.4)
X i++;
X }
X return i % 8 + 1;
X}
X
Xgunsbear(from, to) /* checks for target bow or stern */
Xregister struct ship *from, *to;
X{
X int Dr, Dc, i;
X register ang;
X
X Dr = from->file->row - to->file->row;
X Dc = to->file->col - from->file->col;
X for (i = 2; i; i--) {
X if ((ang = angle(Dr, Dc) - from->file->dir + 1) < 1)
X ang += 8;
X if (ang >= 2 && ang <= 4)
X return 'r';
X if (ang >= 6 && ang <= 7)
X return 'l';
X Dr += dr[to->file->dir];
X Dc += dc[to->file->dir];
X }
X return 0;
X}
X
Xportside(from, on, quick)
Xregister struct ship *from, *on;
Xint quick; /* returns true if fromship is */
X{ /* shooting at onship's starboard side */
X register ang;
X register Dr, Dc;
X
X Dr = from->file->row - on->file->row;
X Dc = on->file->col - from->file->col;
X if (quick == -1) {
X Dr += dr[on->file->dir];
X Dc += dc[on->file->dir];
X }
X ang = angle(Dr, Dc);
X if (quick != 0)
X return ang;
X ang = (ang + 4 - on->file->dir - 1) % 8 + 1;
X return ang < 5;
X}
X
Xcolours(sp)
Xregister struct ship *sp;
X{
X register char flag;
X
X if (sp->file->struck)
X flag = '!';
X if (sp->file->explode)
X flag = '#';
X if (sp->file->sink)
X flag = '~';
X if (sp->file->struck)
X return flag;
X flag = *countryname[capship(sp)->nationality];
X return sp->file->FS ? flag : tolower(flag);
X}
X
X#include <sys/file.h>
Xlog(s)
Xregister struct ship *s;
X{
X FILE *fp;
X int persons;
X int n;
X struct logs log[NLOG];
X float net;
X register struct logs *lp;
X
X if ((fp = fopen(LOGFILE, "r+")) == NULL)
X return;
X#ifdef LOCK_EX
X if (flock(fileno(fp), LOCK_EX) < 0)
X return;
X#endif
X net = (float)s->file->points / s->specs->pts;
X persons = getw(fp);
X n = fread((char *)log, sizeof(struct logs), NLOG, fp);
X for (lp = &log[n]; lp < &log[NLOG]; lp++)
X lp->l_name[0] = lp->l_uid = lp->l_shipnum
X = lp->l_gamenum = lp->l_netpoints = 0;
X rewind(fp);
X if (persons < 0)
X (void) putw(1, fp);
X else
X (void) putw(persons + 1, fp);
X for (lp = log; lp < &log[NLOG]; lp++)
X if (net > (float)lp->l_netpoints
X / scene[lp->l_gamenum].ship[lp->l_shipnum].specs->pts) {
X (void) fwrite((char *)log,
X sizeof (struct logs), lp - log, fp);
X (void) strcpy(log[NLOG-1].l_name, s->file->captain);
X log[NLOG-1].l_uid = getuid();
X log[NLOG-1].l_shipnum = s->file->index;
X log[NLOG-1].l_gamenum = game;
X log[NLOG-1].l_netpoints = s->file->points;
X (void) fwrite((char *)&log[NLOG-1],
X sizeof (struct logs), 1, fp);
X (void) fwrite((char *)lp,
X sizeof (struct logs), &log[NLOG-1] - lp, fp);
X break;
X }
X#ifdef LOCK_EX
X (void) flock(fileno(fp), LOCK_UN);
X#endif
X (void) fclose(fp);
X}
END_OF_misc.c
if test 4932 -ne `wc -c <misc.c`; then
echo shar: \"misc.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f pl_1.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"pl_1.c\"
else
echo shar: Extracting \"pl_1.c\" \(2643 characters\)
sed "s/^X//" >pl_1.c <<'END_OF_pl_1.c'
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X */
X
X#ifndef lint
Xstatic char sccsid[] = "@(#)pl_1.c 5.2 (Berkeley) 3/9/88";
X#endif /* not lint */
X
X#include "player.h"
X#include <sys/types.h>
X#include <sys/wait.h>
X
X/*
X * If we get here before a ship is chosen, then ms == 0 and
X * we don't want to update the score file, or do any Write's either.
X * We can assume the sync file is already created and may need
X * to be removed.
X * Of course, we don't do any more Sync()'s if we got here
X * because of a Sync() failure.
X */
Xleave(conditions)
Xint conditions;
X{
X (void) signal(SIGHUP, SIG_IGN);
X (void) signal(SIGINT, SIG_IGN);
X (void) signal(SIGQUIT, SIG_IGN);
X (void) signal(SIGALRM, SIG_IGN);
X (void) signal(SIGCHLD, SIG_IGN);
X
X if (done_curses) {
X Signal("It looks like you've had it!",
X (struct ship *)0);
X switch (conditions) {
X case LEAVE_QUIT:
X break;
X case LEAVE_CAPTURED:
X Signal("Your ship was captured.",
X (struct ship *)0);
X break;
X case LEAVE_HURRICAN:
X Signal("Hurricane! All ships destroyed.",
X (struct ship *)0);
X break;
X case LEAVE_DRIVER:
X Signal("The driver died.", (struct ship *)0);
X break;
X case LEAVE_SYNC:
X Signal("Synchronization error.", (struct ship *)0);
X break;
X default:
X Signal("A funny thing happened (%d).",
X (struct ship *)0, conditions);
X }
X } else {
X switch (conditions) {
X case LEAVE_QUIT:
X break;
X case LEAVE_DRIVER:
X printf("The driver died.\n");
X break;
X case LEAVE_FORK:
X perror("fork");
X break;
X case LEAVE_SYNC:
X printf("Synchronization error\n.");
X break;
X default:
X printf("A funny thing happened (%d).\n",
X conditions);
X }
X }
X
X if (ms != 0) {
X log(ms);
X if (conditions != LEAVE_SYNC) {
X makesignal(ms, "Captain %s relinquishing.",
X (struct ship *)0, mf->captain);
X Write(W_END, ms, 0, 0, 0, 0, 0);
X (void) Sync();
X }
X }
X sync_close(!hasdriver);
X cleanupscreen();
X exit(0);
X}
X
Xchoke()
X{
X leave(LEAVE_QUIT);
X}
X
Xchild()
X{
X union wait status;
X int pid;
X
X (void) signal(SIGCHLD, SIG_IGN);
X do {
X pid = wait3(&status, WNOHANG, (struct rusage *)0);
X if (pid < 0 || pid > 0 && !WIFSTOPPED(status))
X hasdriver = 0;
X } while (pid > 0);
X (void) signal(SIGCHLD, child);
X}
END_OF_pl_1.c
if test 2643 -ne `wc -c <pl_1.c`; then
echo shar: \"pl_1.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f pl_2.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"pl_2.c\"
else
echo shar: Extracting \"pl_2.c\" \(2512 characters\)
sed "s/^X//" >pl_2.c <<'END_OF_pl_2.c'
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X */
X
X#ifndef lint
Xstatic char sccsid[] = "@(#)pl_2.c 5.2 (Berkeley) 3/9/88";
X#endif /* not lint */
X
X#include "player.h"
X
Xplay()
X{
X register struct ship *sp;
X
X for (;;) {
X switch (sgetch("~\b", (struct ship *)0, 0)) {
X case 'm':
X acceptmove();
X break;
X case 's':
X acceptsignal();
X break;
X case 'g':
X grapungrap();
X break;
X case 'u':
X unfoulplayer();
X break;
X case 'v':
X Signal("%s", (struct ship *)0, version);
X break;
X case 'b':
X acceptboard();
X break;
X case 'f':
X acceptcombat();
X break;
X case 'l':
X loadplayer();
X break;
X case 'c':
X changesail();
X break;
X case 'r':
X repair();
X break;
X case 'B':
X Signal("'Hands to stations!'", (struct ship *)0);
X unboard(ms, ms, 1); /* cancel DBP's */
X unboard(ms, ms, 0); /* cancel offense */
X break;
X case '\f':
X centerview();
X blockalarm();
X draw_board();
X draw_screen();
X unblockalarm();
X break;
X case 'L':
X mf->loadL = L_EMPTY;
X mf->loadR = L_EMPTY;
X mf->readyL = R_EMPTY;
X mf->readyR = R_EMPTY;
X Signal("Broadsides unloaded", (struct ship *)0);
X break;
X case 'q':
X Signal("Type 'Q' to quit", (struct ship *)0);
X break;
X case 'Q':
X leave(LEAVE_QUIT);
X break;
X case 'I':
X foreachship(sp)
X if (sp != ms)
X eyeball(sp);
X break;
X case 'i':
X if ((sp = closestenemy(ms, 0, 1)) == 0)
X Signal("No more ships left.");
X else
X eyeball(sp);
X break;
X case 'C':
X centerview();
X blockalarm();
X draw_view();
X unblockalarm();
X break;
X case 'U':
X upview();
X blockalarm();
X draw_view();
X unblockalarm();
X break;
X case 'D':
X case 'N':
X downview();
X blockalarm();
X draw_view();
X unblockalarm();
X break;
X case 'H':
X leftview();
X blockalarm();
X draw_view();
X unblockalarm();
X break;
X case 'J':
X rightview();
X blockalarm();
X draw_view();
X unblockalarm();
X break;
X case 'F':
X lookout();
X break;
X case 'S':
X dont_adjust = !dont_adjust;
X blockalarm();
X draw_turn();
X unblockalarm();
X break;
X }
X }
X}
END_OF_pl_2.c
if test 2512 -ne `wc -c <pl_2.c`; then
echo shar: \"pl_2.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f pl_3.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"pl_3.c\"
else
echo shar: Extracting \"pl_3.c\" \(5916 characters\)
sed "s/^X//" >pl_3.c <<'END_OF_pl_3.c'
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X */
X
X#ifndef lint
Xstatic char sccsid[] = "@(#)pl_3.c 5.2 (Berkeley) 3/9/88";
X#endif /* not lint */
X
X#include "player.h"
X
Xacceptcombat()
X{
X int men = 0;
X int target, temp;
X int n, r;
X int index, rakehim, sternrake;
X int hhits = 0, ghits = 0, rhits = 0, chits = 0;
X int crew[3];
X int load;
X int guns, car, ready, shootat, hit;
X int roll;
X struct ship *closest;
X
X crew[0] = mc->crew1;
X crew[1] = mc->crew2;
X crew[2] = mc->crew3;
X for (n = 0; n < 3; n++) {
X if (mf->OBP[n].turnsent)
X men += mf->OBP[n].mensent;
X }
X for (n = 0; n < 3; n++) {
X if (mf->DBP[n].turnsent)
X men += mf->DBP[n].mensent;
X }
X if (men) {
X crew[0] = men/100 ? 0 : crew[0] != 0;
X crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
X crew[2] = men%10 ? 0 : crew[2] != 0;
X }
X for (r = 0; r < 2; r++) {
X if (r) {
X ready = mf->readyR;
X load = mf->loadR;
X guns = mc->gunR;
X car = mc->carR;
X } else {
X ready = mf->readyL;
X load = mf->loadL;
X guns = mc->gunL;
X car = mc->carL;
X }
X if (!guns && !car || load == L_EMPTY || (ready & R_LOADED) == 0)
X goto cant;
X if (mf->struck || !crew[2])
X goto cant;
X closest = closestenemy(ms, (r ? 'r' : 'l'), 1);
X if (closest == 0)
X goto cant;
X if (closest->file->struck)
X goto cant;
X target = range(ms, closest);
X if (target > rangeofshot[load] || !guns && target >= 3)
X goto cant;
X Signal("%s (%c%c) within range of %s broadside.",
X closest, r ? "right" : "left");
X if (load > L_CHAIN && target < 6) {
X switch (sgetch("Aim for hull or rigging? ",
X (struct ship *)0, 1)) {
X case 'r':
X shootat = RIGGING;
X break;
X case 'h':
X shootat = HULL;
X break;
X default:
X shootat = -1;
X Signal("'Avast there! Hold your fire.'",
X (struct ship *)0);
X }
X } else {
X if (sgetch("Fire? ", (struct ship *)0, 1) == 'n') {
X shootat = -1;
X Signal("Belay that! Hold your fire.",
X (struct ship *)0);
X } else
X shootat = RIGGING;
X }
X if (shootat == -1)
X continue;
X fired = 1;
X rakehim = gunsbear(ms, closest) && !gunsbear(closest, ms);
X temp = portside(closest, ms, 1) - closest->file->dir + 1;
X if (temp < 1)
X temp += 8;
X else if (temp > 8)
X temp -= 8;
X sternrake = temp > 4 && temp < 6;
X if (rakehim)
X if (!sternrake)
X Signal("Raking the %s!", closest);
X else
X Signal("Stern Rake! %s splintering!", closest);
X index = guns;
X if (target < 3)
X index += car;
X index = (index - 1)/3;
X index = index > 8 ? 8 : index;
X if (!rakehim)
X hit = HDT[index][target-1];
X else
X hit = HDTrake[index][target-1];
X if (rakehim && sternrake)
X hit++;
X hit += QUAL[index][mc->qual-1];
X for (n = 0; n < 3 && mf->captured == 0; n++)
X if (!crew[n])
X if (index <= 5)
X hit--;
X else
X hit -= 2;
X if (ready & R_INITIAL)
X if (index <= 3)
X hit++;
X else
X hit += 2;
X if (mf->captured != 0)
X if (index <= 1)
X hit--;
X else
X hit -= 2;
X hit += AMMO[index][load - 1];
X if (((temp = mc->class) >= 5 || temp == 1) && windspeed == 5)
X hit--;
X if (windspeed == 6 && temp == 4)
X hit -= 2;
X if (windspeed == 6 && temp <= 3)
X hit--;
X if (hit >= 0) {
X roll = die();
X if (load == L_GRAPE)
X chits = hit;
X else {
X struct Tables *t;
X if (hit > 10)
X hit = 10;
X t = &(shootat == RIGGING ? RigTable : HullTable)
X [hit][roll-1];
X chits = t->C;
X rhits = t->R;
X hhits = t->H;
X ghits = t->G;
X if (closest->file->FS)
X rhits *= 2;
X if (load == L_CHAIN) {
X ghits = 0;
X hhits = 0;
X }
X }
X table(shootat, load, hit, closest, ms, roll);
X }
X Signal("Damage inflicted on the %s:",
X (struct ship *)0, closest->shipname);
X Signal("\t%d HULL, %d GUNS, %d CREW, %d RIGGING",
X (struct ship *)0, hhits, ghits, chits, rhits);
X if (!r) {
X mf->loadL = L_EMPTY;
X mf->readyL = R_EMPTY;
X } else {
X mf->loadR = L_EMPTY;
X mf->readyR = R_EMPTY;
X }
X continue;
X cant:
X Signal("Unable to fire %s broadside",
X (struct ship *)0, r ? "right" : "left");
X }
X blockalarm();
X draw_stat();
X unblockalarm();
X}
X
Xgrapungrap()
X{
X register struct ship *sp;
X register int i;
X
X foreachship(sp) {
X if (sp == ms || sp->file->dir == 0)
X continue;
X if (range(ms, sp) > 1 && !grappled2(ms, sp))
X continue;
X switch (sgetch("Attempt to grapple or ungrapple %s (%c%c): ",
X sp, 1)) {
X case 'g':
X if (die() < 3
X || ms->nationality == capship(sp)->nationality) {
X Write(W_GRAP, ms, 0, sp->file->index, 0, 0, 0);
X Write(W_GRAP, sp, 0, player, 0, 0, 0);
X Signal("Attempt succeeds!", (struct ship *)0);
X makesignal(ms, "grappled with %s (%c%c)", sp);
X } else
X Signal("Attempt fails.", (struct ship *)0);
X break;
X case 'u':
X for (i = grappled2(ms, sp); --i >= 0;) {
X if (ms->nationality
X == capship(sp)->nationality
X || die() < 3) {
X cleangrapple(ms, sp, 0);
X Signal("Attempt succeeds!",
X (struct ship *)0);
X makesignal(ms,
X "ungrappling with %s (%c%c)",
X sp);
X } else
X Signal("Attempt fails.",
X (struct ship *)0);
X }
X break;
X }
X }
X}
X
Xunfoulplayer()
X{
X register struct ship *to;
X register i;
X
X foreachship(to) {
X if (fouled2(ms, to) == 0)
X continue;
X if (sgetch("Attempt to unfoul with the %s (%c%c)? ", to, 1) != 'y')
X continue;
X for (i = fouled2(ms, to); --i >= 0;) {
X if (die() <= 2) {
X cleanfoul(ms, to, 0);
X Signal("Attempt succeeds!", (struct ship *)0);
X makesignal(ms, "Unfouling %s (%c%c)", to);
X } else
X Signal("Attempt fails.", (struct ship *)0);
X }
X }
X}
END_OF_pl_3.c
if test 5916 -ne `wc -c <pl_3.c`; then
echo shar: \"pl_3.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f pl_4.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"pl_4.c\"
else
echo shar: Extracting \"pl_4.c\" \(2373 characters\)
sed "s/^X//" >pl_4.c <<'END_OF_pl_4.c'
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X */
X
X#ifndef lint
Xstatic char sccsid[] = "@(#)pl_4.c 5.2 (Berkeley) 3/9/88";
X#endif /* not lint */
X
X#include "player.h"
X
Xchangesail()
X{
X int rig, full;
X
X rig = mc->rig1;
X full = mf->FS;
X if (windspeed == 6 || windspeed == 5 && mc->class > 4)
X rig = 0;
X if (mc->crew3 && rig) {
X if (!full) {
X if (sgetch("Increase to Full sails? ",
X (struct ship *)0, 1) == 'y') {
X changed = 1;
X Write(W_FS, ms, 0, 1, 0, 0, 0);
X }
X } else {
X if (sgetch("Reduce to Battle sails? ",
X (struct ship *)0, 1) == 'y') {
X Write(W_FS, ms, 0, 0, 0, 0, 0);
X changed = 1;
X }
X }
X } else if (!rig)
X Signal("Sails rent to pieces", (struct ship *)0);
X}
X
Xacceptsignal()
X{
X char buf[60];
X register char *p = buf;
X
X *p++ = '"';
X sgetstr("Message? ", p, sizeof buf - 2);
X while (*p++)
X ;
X p[-1] = '"';
X *p = 0;
X Write(W_SIGNAL, ms, 1, (int)buf, 0, 0, 0);
X}
X
Xlookout()
X{
X register struct ship *sp;
X char buf[3];
X register char c;
X
X sgetstr("What ship? ", buf, sizeof buf);
X foreachship(sp) {
X c = *countryname[sp->nationality];
X if ((c == *buf || tolower(c) == *buf || colours(sp) == *buf)
X && (sp->file->stern == buf[1] || sterncolour(sp) == buf[1]
X || buf[1] == '?')) {
X eyeball(sp);
X }
X }
X}
X
Xchar *
Xsaywhat(sp, flag)
Xregister struct ship *sp;
Xchar flag;
X{
X if (sp->file->captain[0])
X return sp->file->captain;
X else if (sp->file->struck)
X return "(struck)";
X else if (sp->file->captured != 0)
X return "(captured)";
X else if (flag)
X return "(available)";
X else
X return "(computer)";
X}
X
Xeyeball(ship)
Xregister struct ship *ship;
X{
X int i;
X
X if (ship->file->dir != 0) {
X Signal("Sail ho! (range %d, %s)",
X (struct ship *)0, range(ms, ship), saywhat(ship, 0));
X i = portside(ms, ship, 1) - mf->dir;
X if (i <= 0)
X i += 8;
X Signal("%s (%c%c) %s %s %s.",
X ship, countryname[ship->nationality],
X classname[ship->specs->class], directionname[i]);
X }
X}
END_OF_pl_4.c
if test 2373 -ne `wc -c <pl_4.c`; then
echo shar: \"pl_4.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f pl_6.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"pl_6.c\"
else
echo shar: Extracting \"pl_6.c\" \(3596 characters\)
sed "s/^X//" >pl_6.c <<'END_OF_pl_6.c'
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X */
X
X#ifndef lint
Xstatic char sccsid[] = "@(#)pl_6.c 5.2 (Berkeley) 3/9/88";
X#endif /* not lint */
X
X#include "player.h"
X
Xrepair()
X{
X char c;
X register char *repairs;
X register struct shipspecs *ptr = mc;
X register int count;
X
X#define FIX(x, m) (m - ptr->x > count \
X ? (ptr->x += count, count = 0) : (count -= m - ptr->x, ptr->x = m))
X
X if (repaired || loaded || fired || changed || turned()) {
X Signal("No hands free to repair", (struct ship *)0);
X return;
X }
X c = sgetch("Repair (hull, guns, rigging)? ", (struct ship *)0, 1);
X switch (c) {
X case 'h':
X repairs = &mf->RH;
X break;
X case 'g':
X repairs = &mf->RG;
X break;
X case 'r':
X repairs = &mf->RR;
X break;
X default:
X Signal("Avast heaving!", (struct ship *)0);
X return;
X }
X if (++*repairs >= 3) {
X count = 2;
X switch (c) {
X case 'h': {
X int max = ptr->guns/4;
X if (ptr->hull < max) {
X FIX(hull, max);
X Write(W_HULL, ms, 0, ptr->hull, 0, 0, 0);
X }
X break;
X }
X case 'g':
X if (ptr->gunL < ptr->gunR) {
X int max = ptr->guns/5 - ptr->carL;
X if (ptr->gunL < max) {
X FIX(gunL, max);
X Write(W_GUNL, ms, 0, ptr->gunL,
X ptr->carL, 0, 0);
X }
X } else {
X int max = ptr->guns/5 - ptr->carR;
X if (ptr->gunR < max) {
X FIX(gunR, max);
X Write(W_GUNR, ms, 0, ptr->gunR,
X ptr->carR, 0, 0);
X }
X }
X break;
X case 'r':
X#define X 2
X if (ptr->rig4 >= 0 && ptr->rig4 < X) {
X FIX(rig4, X);
X Write(W_RIG4, ms, 0, ptr->rig4, 0, 0, 0);
X }
X if (count && ptr->rig3 < X) {
X FIX(rig3, X);
X Write(W_RIG3, ms, 0, ptr->rig3, 0, 0, 0);
X }
X if (count && ptr->rig2 < X) {
X FIX(rig2, X);
X Write(W_RIG2, ms, 0, ptr->rig2, 0, 0, 0);
X }
X if (count && ptr->rig1 < X) {
X FIX(rig1, X);
X Write(W_RIG1, ms, 0, ptr->rig1, 0, 0, 0);
X }
X break;
X }
X if (count == 2) {
X Signal("Repairs completed.", (struct ship *)0);
X *repairs = 2;
X } else {
X *repairs = 0;
X blockalarm();
X draw_stat();
X unblockalarm();
X }
X }
X blockalarm();
X draw_slot();
X unblockalarm();
X repaired = 1;
X}
X
Xturned()
X{
X register char *p;
X
X for (p = movebuf; *p; p++)
X if (*p == 'r' || *p == 'l')
X return 1;
X return 0;
X}
X
Xloadplayer()
X{
X char c;
X register loadL, loadR, ready, load;
X
X if (!mc->crew3) {
X Signal("Out of crew", (struct ship *)0);
X return;
X }
X loadL = mf->loadL;
X loadR = mf->loadR;
X if (!loadL && !loadR) {
X c = sgetch("Load which broadside (left or right)? ",
X (struct ship *)0, 1);
X if (c == 'r')
X loadL = 1;
X else
X loadR = 1;
X }
X if (!loadL && loadR || loadL && !loadR) {
X c = sgetch("Reload with (round, double, chain, grape)? ",
X (struct ship *)0, 1);
X switch (c) {
X case 'r':
X load = L_ROUND;
X ready = 0;
X break;
X case 'd':
X load = L_DOUBLE;
X ready = R_DOUBLE;
X break;
X case 'c':
X load = L_CHAIN;
X ready = 0;
X break;
X case 'g':
X load = L_GRAPE;
X ready = 0;
X break;
X default:
X Signal("Broadside not loaded.",
X (struct ship *)0);
X return;
X }
X if (!loadR) {
X mf->loadR = load;
X mf->readyR = ready|R_LOADING;
X } else {
X mf->loadL = load;
X mf->readyL = ready|R_LOADING;
X }
X loaded = 1;
X }
X}
END_OF_pl_6.c
if test 3596 -ne `wc -c <pl_6.c`; then
echo shar: \"pl_6.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f pl_main.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"pl_main.c\"
else
echo shar: Extracting \"pl_main.c\" \(4998 characters\)
sed "s/^X//" >pl_main.c <<'END_OF_pl_main.c'
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X */
X
X#ifndef lint
Xstatic char sccsid[] = "@(#)pl_main.c 5.2 (Berkeley) 3/9/88";
X#endif /* not lint */
X
X#include "player.h"
X#include <sys/types.h>
X#include <sys/wait.h>
X
Xint choke(), child();
X
X/*ARGSUSED*/
Xpl_main()
X{
X
X if (!SCREENTEST()) {
X printf("Can't sail on this terminal.\n");
X exit(1);
X }
X initialize();
X Signal("Aye aye, Sir", (struct ship *)0);
X play();
X return 0; /* for lint, play() never returns */
X}
X
Xinitialize()
X{
X register struct File *fp;
X register struct ship *sp;
X char captain[80];
X char message[60];
X int load;
X register int n;
X char *nameptr;
X int nat[NNATION];
X
X if (game < 0) {
X (void) puts("Choose a scenario:\n");
X (void) puts("\n\tNUMBER\tSHIPS\tIN PLAY\tTITLE");
X for (n = 0; n < NSCENE; n++) {
X /* ( */
X printf("\t%d):\t%d\t%s\t%s\n", n, scene[n].vessels,
X sync_exists(n) ? "YES" : "no",
X scene[n].name);
X }
Xreprint:
X printf("\nScenario number? ");
X (void) fflush(stdout);
X (void) scanf("%d", &game);
X while (getchar() != '\n')
X ;
X }
X if (game < 0 || game >= NSCENE) {
X (void) puts("Very funny.");
X exit(1);
X }
X cc = &scene[game];
X ls = SHIP(cc->vessels);
X
X for (n = 0; n < NNATION; n++)
X nat[n] = 0;
X foreachship(sp) {
X if (sp->file == NULL &&
X (sp->file = (struct File *)calloc(1, sizeof (struct File))) == NULL) {
X (void) puts("OUT OF MEMORY");
X exit(1);
X }
X sp->file->index = sp - SHIP(0);
X sp->file->stern = nat[sp->nationality]++;
X sp->file->dir = sp->shipdir;
X sp->file->row = sp->shiprow;
X sp->file->col = sp->shipcol;
X }
X windspeed = cc->windspeed;
X winddir = cc->winddir;
X
X (void) signal(SIGHUP, choke);
X (void) signal(SIGINT, choke);
X
X hasdriver = sync_exists(game);
X if (sync_open() < 0) {
X perror("sail: syncfile");
X exit(1);
X }
X
X if (hasdriver) {
X (void) puts("Synchronizing with the other players...");
X (void) fflush(stdout);
X if (Sync() < 0)
X leave(LEAVE_SYNC);
X }
X for (;;) {
X foreachship(sp)
X if (sp->file->captain[0] == 0 && !sp->file->struck
X && sp->file->captured == 0)
X break;
X if (sp >= ls) {
X (void) puts("All ships taken in that scenario.");
X foreachship(sp)
X free((char *)sp->file);
X sync_close(0);
X people = 0;
X goto reprint;
X }
X if (randomize) {
X player = sp - SHIP(0);
X } else {
X printf("%s\n\n", cc->name);
X foreachship(sp)
X printf(" %2d: %-10s %-15s (%-2d pts) %s\n",
X sp->file->index,
X countryname[sp->nationality],
X sp->shipname,
X sp->specs->pts,
X saywhat(sp, 1));
X printf("\nWhich ship (0-%d)? ", cc->vessels-1);
X (void) fflush(stdout);
X if (scanf("%d", &player) != 1 || player < 0
X || player >= cc->vessels) {
X while (getchar() != '\n')
X ;
X (void) puts("Say what?");
X player = -1;
X } else
X while (getchar() != '\n')
X ;
X }
X if (player < 0)
X continue;
X if (Sync() < 0)
X leave(LEAVE_SYNC);
X fp = SHIP(player)->file;
X if (fp->captain[0] || fp->struck || fp->captured != 0)
X (void) puts("That ship is taken.");
X else
X break;
X }
X
X ms = SHIP(player);
X mf = ms->file;
X mc = ms->specs;
X
X Write(W_BEGIN, ms, 0, 0, 0, 0, 0);
X if (Sync() < 0)
X leave(LEAVE_SYNC);
X
X (void) signal(SIGCHLD, child);
X if (!hasdriver)
X switch (fork()) {
X case 0:
X longjmp(restart, MODE_DRIVER);
X /*NOTREACHED*/
X case -1:
X perror("fork");
X leave(LEAVE_FORK);
X break;
X default:
X hasdriver++;
X }
X
X printf("Your ship is the %s, a %d gun %s (%s crew).\n",
X ms->shipname, mc->guns, classname[mc->class],
X qualname[mc->qual]);
X if ((nameptr = (char *) getenv("SAILNAME")) && *nameptr)
X (void) strncpy(captain, nameptr, sizeof captain);
X else {
X (void) printf("Your name, Captain? ");
X (void) fflush(stdout);
X (void) gets(captain);
X if (!*captain)
X (void) strcpy(captain, "no name");
X }
X captain[sizeof captain - 1] = '\0';
X Write(W_CAPTAIN, ms, 1, (int)captain, 0, 0, 0);
X for (n = 0; n < 2; n++) {
X char buf[10];
X
X printf("\nInitial broadside %s (grape, chain, round, double): ",
X n ? "right" : "left");
X (void) fflush(stdout);
X (void) scanf("%s", buf);
X switch (*buf) {
X case 'g':
X load = L_GRAPE;
X break;
X case 'c':
X load = L_CHAIN;
X break;
X case 'r':
X load = L_ROUND;
X break;
X case 'd':
X load = L_DOUBLE;
X break;
X default:
X load = L_ROUND;
X }
X if (n) {
X mf->loadR = load;
X mf->readyR = R_LOADED|R_INITIAL;
X } else {
X mf->loadL = load;
X mf->readyL = R_LOADED|R_INITIAL;
X }
X }
X
X initscreen();
X draw_board();
X (void) sprintf(message, "Captain %s assuming command", captain);
X Write(W_SIGNAL, ms, 1, (int)message, 0, 0, 0);
X newturn();
X}
END_OF_pl_main.c
if test 4998 -ne `wc -c <pl_main.c`; then
echo shar: \"pl_main.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f player.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"player.h\"
else
echo shar: Extracting \"player.h\" \(2642 characters\)
sed "s/^X//" >player.h <<'END_OF_player.h'
X/*
X * Copyright (c) 1983 Regents of the University of California.
X * All rights reserved.
X *
X * Redistribution and use in source and binary forms are permitted
X * provided that this notice is preserved and that due credit is given
X * to the University of California at Berkeley. The name of the University
X * may not be used to endorse or promote products derived from this
X * software without specific prior written permission. This software
X * is provided ``as is'' without express or implied warranty.
X *
X * @(#)player.h 5.2 (Berkeley) 3/9/88
X */
X
X#include <curses.h>
X#include "externs.h"
X
X/* sizes and coordinates for the screen */
X
X#define LINE_T 0
X#define LINE_L 0
X#define LINE_X COLS
X#define LINE_Y 1
X#define LINE_B (LINE_T+LINE_Y-1)
X#define LINE_R (LINE_L+LINE_X-1)
X
X#define BOX_T 1
X#define BOX_L 0
X#define BOX_X 65
X#define BOX_Y 16
X#define BOX_B (BOX_T+BOX_Y-1)
X#define BOX_R (BOX_L+BOX_X-1)
X
X#define TURN_T BOX_B
X#define TURN_Y 1
X#define TURN_L ((BOX_L+BOX_R-TURN_X)/2)
X#define TURN_X 9
X#define TURN_B (TURN_T+TURN_Y+1)
X#define TURN_R (TURN_L+TURN_X+1)
X
X#define STAT_T 0
X#define STAT_B BOX_B
X#define STAT_L (BOX_R+2)
X#define STAT_X 14
X#define STAT_Y (STAT_B-STAT_T+1)
X#define STAT_R (STAT_L+STAT_X-1)
X#define STAT_1 0
X#define STAT_2 (STAT_1+4)
X#define STAT_3 (STAT_2+7)
X
X#define SCROLL_T (BOX_B+1)
X#define SCROLL_L 0
X#define SCROLL_B (LINES-1)
X#define SCROLL_R (COLS-1)
X#define SCROLL_X (SCROLL_R-SCROLL_L+1)
X#define SCROLL_Y (SCROLL_B-SCROLL_T+1)
X
X#define VIEW_T (BOX_T+1)
X#define VIEW_L (BOX_L+1)
X#define VIEW_X (BOX_X-5)
X#define VIEW_Y (BOX_Y-2)
X#define VIEW_B (VIEW_T+VIEW_Y-1)
X#define VIEW_R (VIEW_L+VIEW_X-1)
X
X#define SLOT_T VIEW_T
X#define SLOT_L (VIEW_R+1)
X#define SLOT_X 3
X#define SLOT_Y VIEW_Y
X#define SLOT_B VIEW_B
X#define SLOT_R (SLOT_L+SLOT_X-1)
X
X#ifdef SIGTSTP
X#define SCREENTEST() (initscr() != ERR && signal(SIGTSTP, SIG_DFL) != BADSIG && STAT_R < COLS && SCROLL_Y > 0)
X#else
X#define SCREENTEST() (initscr() != ERR && STAT_R < COLS && SCROLL_Y > 0)
X#endif
X
XWINDOW *view_w;
XWINDOW *slot_w;
XWINDOW *scroll_w;
XWINDOW *stat_w;
XWINDOW *turn_w;
X
Xchar done_curses;
Xchar loaded, fired, changed, repaired;
Xchar dont_adjust;
Xint viewrow, viewcol;
Xchar movebuf[sizeof SHIP(0)->file->movebuf];
Xchar version[];
Xint player;
Xstruct ship *ms; /* memorial structure, &cc->ship[player] */
Xstruct File *mf; /* ms->file */
Xstruct shipspecs *mc; /* ms->specs */
X
X/* condition codes for leave() */
X#define LEAVE_QUIT 0
X#define LEAVE_CAPTURED 1
X#define LEAVE_HURRICAN 2
X#define LEAVE_DRIVER 3
X#define LEAVE_FORK 4
X#define LEAVE_SYNC 5
X
X#ifndef CTRL
X#define CTRL(c) ((c)&037)
X#endif
END_OF_player.h
if test 2642 -ne `wc -c <player.h`; then
echo shar: \"player.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 3 \(of 4\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 ; do
if test ! -f ark${I}isdone ; then
MISSING="${MISSING} ${I}"
fi
done
if test "${MISSING}" = "" ; then
echo You have unpacked all 4 archives.
rm -f ark[1-9]isdone
else
echo You still need to unpack the following archives:
echo " " ${MISSING}
fi
## End of shell archive.
exit 0