mirror of
https://github.com/vattam/BSDGames.git
synced 2025-12-20 19:04:49 +00:00
Initial revision
git-svn-id: file:///srv/svn/joey/bsdgames-trunk@5086 a4a2c43b-8ac3-0310-8836-e0e880c912e2
This commit is contained in:
14
sail/Makefile.bsd
Normal file
14
sail/Makefile.bsd
Normal file
@@ -0,0 +1,14 @@
|
||||
# $NetBSD: Makefile,v 1.10 1998/02/18 22:37:32 jtc Exp $
|
||||
# @(#)Makefile 8.1 (Berkeley) 5/31/93
|
||||
|
||||
PROG= sail
|
||||
SRCS= 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 \
|
||||
dr_main.c dr_1.c dr_2.c dr_3.c dr_4.c dr_5.c lo_main.c \
|
||||
assorted.c game.c globals.c misc.c parties.c sync.c version.c
|
||||
MAN= sail.6
|
||||
DPADD= ${LIBCURSES}
|
||||
LDADD= -lcurses
|
||||
HIDEGAME=hidegame
|
||||
SETGIDGAME=yes
|
||||
|
||||
.include <bsd.prog.mk>
|
||||
12
sail/Makefrag
Normal file
12
sail/Makefrag
Normal file
@@ -0,0 +1,12 @@
|
||||
# Makefrag - makefile fragment for sail
|
||||
|
||||
sail_DIRS := $(GAMESDIR) $(MAN6DIR)
|
||||
|
||||
sail_all: sail/sail sail/sail.6
|
||||
|
||||
sail_install: sail_all
|
||||
$(INSTALL_SCORE_GAME) sail/sail $(INSTALL_PREFIX)$(GAMESDIR)/sail
|
||||
$(HIDE_GAME) sail
|
||||
$(INSTALL_SCORE_FILE) $(SAIL_SCOREFILE)
|
||||
$(INSTALL_SAIL_DIR) $(INSTALL_PREFIX)$(SAIL_DIR)
|
||||
$(INSTALL_MANUAL) sail/sail.6
|
||||
297
sail/assorted.c
Normal file
297
sail/assorted.c
Normal file
@@ -0,0 +1,297 @@
|
||||
/* $NetBSD: assorted.c,v 1.6 1997/10/13 21:02:57 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)assorted.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: assorted.c,v 1.6 1997/10/13 21:02:57 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <err.h>
|
||||
|
||||
static void strike __P((struct ship *, struct ship *));
|
||||
|
||||
void
|
||||
table(rig, shot, hittable, on, from, roll)
|
||||
struct ship *on, *from;
|
||||
int rig, shot, hittable, roll;
|
||||
{
|
||||
int hhits = 0, chits = 0, ghits = 0, rhits = 0;
|
||||
int Ghit = 0, Hhit = 0, Rhit = 0, Chit = 0;
|
||||
int guns, car, pc, hull;
|
||||
int crew[3];
|
||||
int n;
|
||||
int rigg[4];
|
||||
char *message;
|
||||
struct Tables *tp;
|
||||
|
||||
pc = on->file->pcrew;
|
||||
hull = on->specs->hull;
|
||||
crew[0] = on->specs->crew1;
|
||||
crew[1] = on->specs->crew2;
|
||||
crew[2] = on->specs->crew3;
|
||||
rigg[0] = on->specs->rig1;
|
||||
rigg[1] = on->specs->rig2;
|
||||
rigg[2] = on->specs->rig3;
|
||||
rigg[3] = on->specs->rig4;
|
||||
if (shot == L_GRAPE)
|
||||
Chit = chits = hittable;
|
||||
else {
|
||||
tp = &(rig ? RigTable : HullTable)[hittable][roll-1];
|
||||
Chit = chits = tp->C;
|
||||
Rhit = rhits = tp->R;
|
||||
Hhit = hhits = tp->H;
|
||||
Ghit = ghits = tp->G;
|
||||
if (on->file->FS)
|
||||
rhits *= 2;
|
||||
if (shot == L_CHAIN) {
|
||||
Ghit = ghits = 0;
|
||||
Hhit = hhits = 0;
|
||||
}
|
||||
}
|
||||
if (on->file->captured != 0) {
|
||||
pc -= (chits + 1) / 2;
|
||||
chits /= 2;
|
||||
}
|
||||
for (n = 0; n < 3; n++)
|
||||
if (chits > crew[n]) {
|
||||
chits -= crew[n];
|
||||
crew[n] = 0;
|
||||
} else {
|
||||
crew[n] -= chits;
|
||||
chits = 0;
|
||||
}
|
||||
for (n = 0; n < 3; n++)
|
||||
if (rhits > rigg[n]){
|
||||
rhits -= rigg[n];
|
||||
rigg[n] = 0;
|
||||
} else {
|
||||
rigg[n] -= rhits;
|
||||
rhits = 0;
|
||||
}
|
||||
if (rigg[3] != -1 && rhits > rigg[3]) {
|
||||
rhits -= rigg[3];
|
||||
rigg[3] = 0;
|
||||
} else if (rigg[3] != -1) {
|
||||
rigg[3] -= rhits;
|
||||
}
|
||||
if (rig && !rigg[2] && (!rigg[3] || rigg[3] == -1))
|
||||
makemsg(on, "dismasted!");
|
||||
if (portside(from, on, 0)) {
|
||||
guns = on->specs->gunR;
|
||||
car = on->specs->carR;
|
||||
} else {
|
||||
guns = on->specs->gunL;
|
||||
car = on->specs->carL;
|
||||
}
|
||||
if (ghits > car) {
|
||||
ghits -= car;
|
||||
car = 0;
|
||||
} else {
|
||||
car -= ghits;
|
||||
ghits = 0;
|
||||
}
|
||||
if (ghits > guns){
|
||||
ghits -= guns;
|
||||
guns = 0;
|
||||
} else {
|
||||
guns -= ghits;
|
||||
ghits = 0;
|
||||
}
|
||||
hull -= ghits;
|
||||
if (Ghit)
|
||||
Write(portside(from, on, 0) ? W_GUNR : W_GUNL,
|
||||
on, 0, guns, car, 0, 0);
|
||||
hull -= hhits;
|
||||
hull = hull < 0 ? 0 : hull;
|
||||
if (on->file->captured != 0 && Chit)
|
||||
Write(W_PCREW, on, 0, pc, 0, 0, 0);
|
||||
if (Hhit)
|
||||
Write(W_HULL, on, 0, hull, 0, 0, 0);
|
||||
if (Chit)
|
||||
Write(W_CREW, on, 0, crew[0], crew[1], crew[2], 0);
|
||||
if (Rhit)
|
||||
Write(W_RIGG, on, 0, rigg[0], rigg[1], rigg[2], rigg[3]);
|
||||
switch (shot) {
|
||||
case L_ROUND:
|
||||
message = "firing round shot on $$";
|
||||
break;
|
||||
case L_GRAPE:
|
||||
message = "firing grape shot on $$";
|
||||
break;
|
||||
case L_CHAIN:
|
||||
message = "firing chain shot on $$";
|
||||
break;
|
||||
case L_DOUBLE:
|
||||
message = "firing double shot on $$";
|
||||
break;
|
||||
case L_EXPLODE:
|
||||
message = "exploding shot on $$";
|
||||
break;
|
||||
default:
|
||||
errx(1, "Unknown shot type %d", shot);
|
||||
|
||||
}
|
||||
makesignal(from, message, on);
|
||||
if (roll == 6 && rig) {
|
||||
switch(Rhit) {
|
||||
case 0:
|
||||
message = "fore topsail sheets parted";
|
||||
break;
|
||||
case 1:
|
||||
message = "mizzen shrouds parted";
|
||||
break;
|
||||
case 2:
|
||||
message = "main topsail yard shot away";
|
||||
break;
|
||||
case 4:
|
||||
message = "fore topmast and foremast shrouds shot away";
|
||||
break;
|
||||
case 5:
|
||||
message = "mizzen mast and yard shot through";
|
||||
break;
|
||||
case 6:
|
||||
message = "foremast and spritsail yard shattered";
|
||||
break;
|
||||
case 7:
|
||||
message = "main topmast and mizzen mast shattered";
|
||||
break;
|
||||
default:
|
||||
errx(1, "Bad Rhit = %d", Rhit);
|
||||
}
|
||||
makemsg(on, message);
|
||||
} else if (roll == 6) {
|
||||
switch (Hhit) {
|
||||
case 0:
|
||||
message = "anchor cables severed";
|
||||
break;
|
||||
case 1:
|
||||
message = "two anchor stocks shot away";
|
||||
break;
|
||||
case 2:
|
||||
message = "quarterdeck bulwarks damaged";
|
||||
break;
|
||||
case 3:
|
||||
message = "three gun ports shot away";
|
||||
break;
|
||||
case 4:
|
||||
message = "four guns dismounted";
|
||||
break;
|
||||
case 5:
|
||||
message = "rudder cables shot through";
|
||||
Write(W_TA, on, 0, 0, 0, 0, 0);
|
||||
break;
|
||||
case 6:
|
||||
message = "shot holes below the water line";
|
||||
break;
|
||||
default:
|
||||
errx(1, "Bad Hhit = %d", Hhit);
|
||||
}
|
||||
makemsg(on, message);
|
||||
}
|
||||
/*
|
||||
if (Chit > 1 && on->file->readyL&R_INITIAL && on->file->readyR&R_INITIAL) {
|
||||
on->specs->qual--;
|
||||
if (on->specs->qual <= 0) {
|
||||
makemsg(on, "crew mutinying!");
|
||||
on->specs->qual = 5;
|
||||
Write(W_CAPTURED, on, 0, on->file->index, 0, 0, 0);
|
||||
} else
|
||||
makemsg(on, "crew demoralized");
|
||||
Write(W_QUAL, on, 0, on->specs->qual, 0, 0, 0);
|
||||
}
|
||||
*/
|
||||
if (!hull)
|
||||
strike(on, from);
|
||||
}
|
||||
|
||||
void
|
||||
Cleansnag(from, to, all, flag)
|
||||
struct ship *from, *to;
|
||||
char all, flag;
|
||||
{
|
||||
if (flag & 1) {
|
||||
Write(W_UNGRAP, from, 0, to->file->index, all, 0, 0);
|
||||
Write(W_UNGRAP, to, 0, from->file->index, all, 0, 0);
|
||||
}
|
||||
if (flag & 2) {
|
||||
Write(W_UNFOUL, from, 0, to->file->index, all, 0, 0);
|
||||
Write(W_UNFOUL, to, 0, from->file->index, all, 0, 0);
|
||||
}
|
||||
if (!snagged2(from, to)) {
|
||||
if (!snagged(from)) {
|
||||
unboard(from, from, 1); /* defense */
|
||||
unboard(from, from, 0); /* defense */
|
||||
} else
|
||||
unboard(from, to, 0); /* offense */
|
||||
if (!snagged(to)) {
|
||||
unboard(to, to, 1); /* defense */
|
||||
unboard(to, to, 0); /* defense */
|
||||
} else
|
||||
unboard(to, from, 0); /* offense */
|
||||
}
|
||||
}
|
||||
|
||||
static void
|
||||
strike(ship, from)
|
||||
struct ship *ship, *from;
|
||||
{
|
||||
int points;
|
||||
|
||||
if (ship->file->struck)
|
||||
return;
|
||||
Write(W_STRUCK, ship, 0, 1, 0, 0, 0);
|
||||
points = ship->specs->pts + from->file->points;
|
||||
Write(W_POINTS, from, 0, points, 0, 0, 0);
|
||||
unboard(ship, ship, 0); /* all offense */
|
||||
unboard(ship, ship, 1); /* all defense */
|
||||
switch (die()) {
|
||||
case 3:
|
||||
case 4: /* ship may sink */
|
||||
Write(W_SINK, ship, 0, 1, 0, 0, 0);
|
||||
break;
|
||||
case 5:
|
||||
case 6: /* ship may explode */
|
||||
Write(W_EXPLODE, ship, 0, 1, 0, 0, 0);
|
||||
break;
|
||||
}
|
||||
Write(W_SIGNAL, ship, 1, (int) "striking her colours!", 0, 0, 0);
|
||||
}
|
||||
478
sail/dr_1.c
Normal file
478
sail/dr_1.c
Normal file
@@ -0,0 +1,478 @@
|
||||
/* $NetBSD: dr_1.c,v 1.7 1998/08/30 09:19:40 veego Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)dr_1.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: dr_1.c,v 1.7 1998/08/30 09:19:40 veego Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "driver.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
void
|
||||
unfoul()
|
||||
{
|
||||
struct ship *sp;
|
||||
struct ship *to;
|
||||
int nat;
|
||||
int i;
|
||||
|
||||
foreachship(sp) {
|
||||
if (sp->file->captain[0])
|
||||
continue;
|
||||
nat = capship(sp)->nationality;
|
||||
foreachship(to) {
|
||||
if (nat != capship(to)->nationality &&
|
||||
!is_toughmelee(sp, to, 0, 0))
|
||||
continue;
|
||||
for (i = fouled2(sp, to); --i >= 0;)
|
||||
if (die() <= 2)
|
||||
cleanfoul(sp, to, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
boardcomp()
|
||||
{
|
||||
int crew[3];
|
||||
struct ship *sp, *sq;
|
||||
|
||||
foreachship(sp) {
|
||||
if (*sp->file->captain)
|
||||
continue;
|
||||
if (sp->file->dir == 0)
|
||||
continue;
|
||||
if (sp->file->struck || sp->file->captured != 0)
|
||||
continue;
|
||||
if (!snagged(sp))
|
||||
continue;
|
||||
crew[0] = sp->specs->crew1 != 0;
|
||||
crew[1] = sp->specs->crew2 != 0;
|
||||
crew[2] = sp->specs->crew3 != 0;
|
||||
foreachship(sq) {
|
||||
if (!Xsnagged2(sp, sq))
|
||||
continue;
|
||||
if (meleeing(sp, sq))
|
||||
continue;
|
||||
if (!sq->file->dir
|
||||
|| sp->nationality == capship(sq)->nationality)
|
||||
continue;
|
||||
switch (sp->specs->class - sq->specs->class) {
|
||||
case -3: case -4: case -5:
|
||||
if (crew[0]) {
|
||||
/* OBP */
|
||||
sendbp(sp, sq, crew[0]*100, 0);
|
||||
crew[0] = 0;
|
||||
} else if (crew[1]){
|
||||
/* OBP */
|
||||
sendbp(sp, sq, crew[1]*10, 0);
|
||||
crew[1] = 0;
|
||||
}
|
||||
break;
|
||||
case -2:
|
||||
if (crew[0] || crew[1]) {
|
||||
/* OBP */
|
||||
sendbp(sp, sq, crew[0]*100+crew[1]*10,
|
||||
0);
|
||||
crew[0] = crew[1] = 0;
|
||||
}
|
||||
break;
|
||||
case -1: case 0: case 1:
|
||||
if (crew[0]) {
|
||||
/* OBP */
|
||||
sendbp(sp, sq, crew[0]*100+crew[1]*10,
|
||||
0);
|
||||
crew[0] = crew[1] = 0;
|
||||
}
|
||||
break;
|
||||
case 2: case 3: case 4: case 5:
|
||||
/* OBP */
|
||||
sendbp(sp, sq, crew[0]*100+crew[1]*10+crew[2],
|
||||
0);
|
||||
crew[0] = crew[1] = crew[2] = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
fightitout(from, to, key)
|
||||
struct ship *from, *to;
|
||||
int key;
|
||||
{
|
||||
struct ship *fromcap, *tocap;
|
||||
int crewfrom[3], crewto[3], menfrom, mento;
|
||||
int pcto, pcfrom, fromstrength, strengthto, frominjured, toinjured;
|
||||
int topoints;
|
||||
int index, totalfrom = 0, totalto = 0;
|
||||
int count;
|
||||
char message[60];
|
||||
|
||||
menfrom = mensent(from, to, crewfrom, &fromcap, &pcfrom, key);
|
||||
mento = mensent(to, from, crewto, &tocap, &pcto, 0);
|
||||
if (fromcap == 0)
|
||||
fromcap = from;
|
||||
if (tocap == 0)
|
||||
tocap = to;
|
||||
if (key) {
|
||||
if (!menfrom) { /* if crew surprised */
|
||||
if (fromcap == from)
|
||||
menfrom = from->specs->crew1
|
||||
+ from->specs->crew2
|
||||
+ from->specs->crew3;
|
||||
else
|
||||
menfrom = from->file->pcrew;
|
||||
} else {
|
||||
menfrom *= 2; /* DBP's fight at an advantage */
|
||||
}
|
||||
}
|
||||
fromstrength = menfrom * fromcap->specs->qual;
|
||||
strengthto = mento * tocap->specs->qual;
|
||||
for (count = 0;
|
||||
((fromstrength < strengthto * 3 && strengthto < fromstrength * 3)
|
||||
|| fromstrength == -1) && count < 4;
|
||||
count++) {
|
||||
index = fromstrength/10;
|
||||
if (index > 8)
|
||||
index = 8;
|
||||
toinjured = MT[index][2 - die() / 3];
|
||||
totalto += toinjured;
|
||||
index = strengthto/10;
|
||||
if (index > 8)
|
||||
index = 8;
|
||||
frominjured = MT[index][2 - die() / 3];
|
||||
totalfrom += frominjured;
|
||||
menfrom -= frominjured;
|
||||
mento -= toinjured;
|
||||
fromstrength = menfrom * fromcap->specs->qual;
|
||||
strengthto = mento * tocap->specs->qual;
|
||||
}
|
||||
if (fromstrength >= strengthto * 3 || count == 4) {
|
||||
unboard(to, from, 0);
|
||||
subtract(from, totalfrom, crewfrom, fromcap, pcfrom);
|
||||
subtract(to, totalto, crewto, tocap, pcto);
|
||||
makemsg(from, "boarders from %s repelled", to->shipname);
|
||||
(void) sprintf(message, "killed in melee: %d. %s: %d",
|
||||
totalto, from->shipname, totalfrom);
|
||||
Write(W_SIGNAL, to, 1, (long) message, 0, 0, 0);
|
||||
if (key)
|
||||
return 1;
|
||||
} else if (strengthto >= fromstrength * 3) {
|
||||
unboard(from, to, 0);
|
||||
subtract(from, totalfrom, crewfrom, fromcap, pcfrom);
|
||||
subtract(to, totalto, crewto, tocap, pcto);
|
||||
if (key) {
|
||||
if (fromcap != from)
|
||||
Write(W_POINTS, fromcap, 0,
|
||||
fromcap->file->points -
|
||||
from->file->struck
|
||||
? from->specs->pts
|
||||
: 2 * from->specs->pts,
|
||||
0, 0, 0);
|
||||
|
||||
/* ptr1 points to the shipspec for the ship that was just unboarded.
|
||||
I guess that what is going on here is that the pointer is multiplied
|
||||
or something. */
|
||||
|
||||
Write(W_CAPTURED, from, 0, to->file->index, 0, 0, 0);
|
||||
topoints = 2 * from->specs->pts + to->file->points;
|
||||
if (from->file->struck)
|
||||
topoints -= from->specs->pts;
|
||||
Write(W_POINTS, to, 0, topoints, 0, 0, 0);
|
||||
mento = crewto[0] ? crewto[0] : crewto[1];
|
||||
if (mento) {
|
||||
subtract(to, mento, crewto, tocap, pcto);
|
||||
subtract(from, - mento, crewfrom, to, 0);
|
||||
}
|
||||
(void) sprintf(message, "captured by the %s!",
|
||||
to->shipname);
|
||||
Write(W_SIGNAL, from, 1, (long) message, 0, 0, 0);
|
||||
(void) sprintf(message, "killed in melee: %d. %s: %d",
|
||||
totalto, from->shipname, totalfrom);
|
||||
Write(W_SIGNAL, to, 1, (long) message, 0, 0, 0);
|
||||
mento = 0;
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
resolve()
|
||||
{
|
||||
int thwart;
|
||||
struct ship *sp, *sq;
|
||||
|
||||
foreachship(sp) {
|
||||
if (sp->file->dir == 0)
|
||||
continue;
|
||||
for (sq = sp + 1; sq < ls; sq++)
|
||||
if (sq->file->dir && meleeing(sp, sq) && meleeing(sq, sp))
|
||||
(void) fightitout(sp, sq, 0);
|
||||
thwart = 2;
|
||||
foreachship(sq) {
|
||||
if (sq->file->dir && meleeing(sq, sp))
|
||||
thwart = fightitout(sp, sq, 1);
|
||||
if (!thwart)
|
||||
break;
|
||||
}
|
||||
if (!thwart) {
|
||||
foreachship(sq) {
|
||||
if (sq->file->dir && meleeing(sq, sp))
|
||||
unboard(sq, sp, 0);
|
||||
unboard(sp, sq, 0);
|
||||
}
|
||||
unboard(sp, sp, 1);
|
||||
} else if (thwart == 2)
|
||||
unboard(sp, sp, 1);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
compcombat()
|
||||
{
|
||||
int n;
|
||||
struct ship *sp;
|
||||
struct ship *closest;
|
||||
int crew[3], men = 0, target, temp;
|
||||
int r, guns, ready, load, car;
|
||||
int index, rakehim, sternrake;
|
||||
int shootat, hit;
|
||||
|
||||
foreachship(sp) {
|
||||
if (sp->file->captain[0] || sp->file->dir == 0)
|
||||
continue;
|
||||
crew[0] = sp->specs->crew1;
|
||||
crew[1] = sp->specs->crew2;
|
||||
crew[2] = sp->specs->crew3;
|
||||
for (n = 0; n < 3; n++) {
|
||||
if (sp->file->OBP[n].turnsent)
|
||||
men += sp->file->OBP[n].mensent;
|
||||
}
|
||||
for (n = 0; n < 3; n++) {
|
||||
if (sp->file->DBP[n].turnsent)
|
||||
men += sp->file->DBP[n].mensent;
|
||||
}
|
||||
if (men){
|
||||
crew[0] = men/100 ? 0 : crew[0] != 0;
|
||||
crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
|
||||
crew[2] = men%10 ? 0 : crew[2] != 0;
|
||||
}
|
||||
for (r = 0; r < 2; r++) {
|
||||
if (!crew[2])
|
||||
continue;
|
||||
if (sp->file->struck)
|
||||
continue;
|
||||
if (r) {
|
||||
ready = sp->file->readyR;
|
||||
guns = sp->specs->gunR;
|
||||
car = sp->specs->carR;
|
||||
} else {
|
||||
ready = sp->file->readyL;
|
||||
guns = sp->specs->gunL;
|
||||
car = sp->specs->carL;
|
||||
}
|
||||
if (!guns && !car)
|
||||
continue;
|
||||
if ((ready & R_LOADED) == 0)
|
||||
continue;
|
||||
closest = closestenemy(sp, r ? 'r' : 'l', 0);
|
||||
if (closest == 0)
|
||||
continue;
|
||||
if (range(closest, sp) > range(sp, closestenemy(sp, r ? 'r' : 'l', 1)))
|
||||
continue;
|
||||
if (closest->file->struck)
|
||||
continue;
|
||||
target = range(sp, closest);
|
||||
if (target > 10)
|
||||
continue;
|
||||
if (!guns && target >= 3)
|
||||
continue;
|
||||
load = L_ROUND;
|
||||
if (target == 1 && sp->file->loadwith == L_GRAPE)
|
||||
load = L_GRAPE;
|
||||
if (target <= 3 && closest->file->FS)
|
||||
load = L_CHAIN;
|
||||
if (target == 1 && load != L_GRAPE)
|
||||
load = L_DOUBLE;
|
||||
if (load > L_CHAIN && target < 6)
|
||||
shootat = HULL;
|
||||
else
|
||||
shootat = RIGGING;
|
||||
rakehim = gunsbear(sp, closest)
|
||||
&& !gunsbear(closest, sp);
|
||||
temp = portside(closest, sp, 1)
|
||||
- closest->file->dir + 1;
|
||||
if (temp < 1)
|
||||
temp += 8;
|
||||
if (temp > 8)
|
||||
temp -= 8;
|
||||
sternrake = temp > 4 && temp < 6;
|
||||
index = guns;
|
||||
if (target < 3)
|
||||
index += car;
|
||||
index = (index - 1) / 3;
|
||||
index = index > 8 ? 8 : index;
|
||||
if (!rakehim)
|
||||
hit = HDT[index][target-1];
|
||||
else
|
||||
hit = HDTrake[index][target-1];
|
||||
if (rakehim && sternrake)
|
||||
hit++;
|
||||
hit += QUAL[index][capship(sp)->specs->qual - 1];
|
||||
for (n = 0; n < 3 && sp->file->captured == 0; n++)
|
||||
if (!crew[n]) {
|
||||
if (index <= 5)
|
||||
hit--;
|
||||
else
|
||||
hit -= 2;
|
||||
}
|
||||
if (ready & R_INITIAL) {
|
||||
if (!r)
|
||||
sp->file->readyL &= ~R_INITIAL;
|
||||
else
|
||||
sp->file->readyR &= ~R_INITIAL;
|
||||
if (index <= 3)
|
||||
hit++;
|
||||
else
|
||||
hit += 2;
|
||||
}
|
||||
if (sp->file->captured != 0) {
|
||||
if (index <= 1)
|
||||
hit--;
|
||||
else
|
||||
hit -= 2;
|
||||
}
|
||||
hit += AMMO[index][load - 1];
|
||||
temp = sp->specs->class;
|
||||
if ((temp >= 5 || temp == 1) && windspeed == 5)
|
||||
hit--;
|
||||
if (windspeed == 6 && temp == 4)
|
||||
hit -= 2;
|
||||
if (windspeed == 6 && temp <= 3)
|
||||
hit--;
|
||||
if (hit >= 0) {
|
||||
if (load != L_GRAPE)
|
||||
hit = hit > 10 ? 10 : hit;
|
||||
table(shootat, load, hit, closest, sp, die());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
next()
|
||||
{
|
||||
if (++turn % 55 == 0) {
|
||||
if (alive)
|
||||
alive = 0;
|
||||
else
|
||||
people = 0;
|
||||
}
|
||||
if (people <= 0 || windspeed == 7) {
|
||||
struct ship *s;
|
||||
struct ship *bestship = NULL;
|
||||
float net, best = 0.0;
|
||||
foreachship(s) {
|
||||
if (*s->file->captain)
|
||||
continue;
|
||||
net = (float)s->file->points / s->specs->pts;
|
||||
if (net > best) {
|
||||
best = net;
|
||||
bestship = s;
|
||||
}
|
||||
}
|
||||
if (best > 0.0) {
|
||||
char *p = getenv("WOTD");
|
||||
if (p == 0)
|
||||
p = "Driver";
|
||||
if (islower(*p))
|
||||
*p = toupper(*p);
|
||||
(void) strncpy(bestship->file->captain, p,
|
||||
sizeof bestship->file->captain);
|
||||
bestship->file->captain
|
||||
[sizeof bestship->file->captain - 1] = 0;
|
||||
logger(bestship);
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
Write(W_TURN, SHIP(0), 0, turn, 0, 0, 0);
|
||||
if (turn % 7 == 0 && (die() >= cc->windchange || !windspeed)) {
|
||||
switch (die()) {
|
||||
case 1:
|
||||
winddir = 1;
|
||||
break;
|
||||
case 2:
|
||||
break;
|
||||
case 3:
|
||||
winddir++;
|
||||
break;
|
||||
case 4:
|
||||
winddir--;
|
||||
break;
|
||||
case 5:
|
||||
winddir += 2;
|
||||
break;
|
||||
case 6:
|
||||
winddir -= 2;
|
||||
break;
|
||||
}
|
||||
if (winddir > 8)
|
||||
winddir -= 8;
|
||||
if (winddir < 1)
|
||||
winddir += 8;
|
||||
if (windspeed)
|
||||
switch (die()) {
|
||||
case 1:
|
||||
case 2:
|
||||
windspeed--;
|
||||
break;
|
||||
case 5:
|
||||
case 6:
|
||||
windspeed++;
|
||||
break;
|
||||
}
|
||||
else
|
||||
windspeed++;
|
||||
Write(W_WIND, SHIP(0), 0, winddir, windspeed, 0, 0);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
292
sail/dr_2.c
Normal file
292
sail/dr_2.c
Normal file
@@ -0,0 +1,292 @@
|
||||
/* $NetBSD: dr_2.c,v 1.8 1998/09/11 14:13:46 hubertf Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)dr_2.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: dr_2.c,v 1.8 1998/09/11 14:13:46 hubertf Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "driver.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
#define couldwin(f,t) (f->specs->crew2 > t->specs->crew2 * 1.5)
|
||||
|
||||
void
|
||||
thinkofgrapples()
|
||||
{
|
||||
struct ship *sp, *sq;
|
||||
char friendly;
|
||||
|
||||
foreachship(sp) {
|
||||
if (sp->file->captain[0] || sp->file->dir == 0)
|
||||
continue;
|
||||
foreachship(sq) {
|
||||
friendly = sp->nationality == capship(sq)->nationality;
|
||||
if (!friendly) {
|
||||
if (sp->file->struck || sp->file->captured != 0)
|
||||
continue;
|
||||
if (range(sp, sq) != 1)
|
||||
continue;
|
||||
if (grappled2(sp, sq))
|
||||
if (is_toughmelee(sp, sq, 0, 0))
|
||||
ungrap(sp, sq);
|
||||
else
|
||||
grap(sp, sq);
|
||||
else if (couldwin(sp, sq)) {
|
||||
grap(sp, sq);
|
||||
sp->file->loadwith = L_GRAPE;
|
||||
}
|
||||
} else
|
||||
ungrap(sp, sq);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
checkup()
|
||||
{
|
||||
struct ship *sp, *sq;
|
||||
char explode, sink;
|
||||
|
||||
foreachship(sp) {
|
||||
if (sp->file->dir == 0)
|
||||
continue;
|
||||
explode = sp->file->explode;
|
||||
sink = sp->file->sink;
|
||||
if (explode != 1 && sink != 1)
|
||||
continue;
|
||||
if (die() < 5)
|
||||
continue;
|
||||
Write(sink == 1 ? W_SINK : W_EXPLODE, sp, 0, 2, 0, 0, 0);
|
||||
Write(W_DIR, sp, 0, 0, 0, 0, 0);
|
||||
if (snagged(sp))
|
||||
foreachship(sq)
|
||||
cleansnag(sp, sq, 1);
|
||||
if (sink != 1) {
|
||||
makemsg(sp, "exploding!");
|
||||
foreachship(sq) {
|
||||
if (sp != sq && sq->file->dir && range(sp, sq) < 4)
|
||||
table(RIGGING, L_EXPLODE, sp->specs->guns/13, sq, sp, 6);
|
||||
}
|
||||
} else
|
||||
makemsg(sp, "sinking!");
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
prizecheck()
|
||||
{
|
||||
struct ship *sp;
|
||||
|
||||
foreachship(sp) {
|
||||
if (sp->file->captured == 0)
|
||||
continue;
|
||||
if (sp->file->struck || sp->file->dir == 0)
|
||||
continue;
|
||||
if (sp->specs->crew1 + sp->specs->crew2 + sp->specs->crew3 > sp->file->pcrew * 6) {
|
||||
Write(W_SIGNAL, sp, 1,
|
||||
(long)"prize crew overthrown", 0, 0, 0);
|
||||
Write(W_POINTS, sp->file->captured, 0, sp->file->captured->file->points - 2 * sp->specs->pts, 0, 0, 0);
|
||||
Write(W_CAPTURED, sp, 0, -1, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
str_end(str)
|
||||
char *str;
|
||||
{
|
||||
char *p;
|
||||
|
||||
for (p = str; *p; p++)
|
||||
;
|
||||
return p == str ? 0 : p[-1];
|
||||
}
|
||||
|
||||
void
|
||||
closeon(from, to, command, ta, ma, af)
|
||||
struct ship *from, *to;
|
||||
char command[];
|
||||
int ma, ta, af;
|
||||
{
|
||||
int high;
|
||||
char temp[10];
|
||||
|
||||
temp[0] = command[0] = '\0';
|
||||
high = -30000;
|
||||
try(command, temp, ma, ta, af, ma, from->file->dir, from, to, &high, 0);
|
||||
}
|
||||
|
||||
int dtab[] = {0,1,1,2,3,4,4,5}; /* diagonal distances in x==y */
|
||||
|
||||
int
|
||||
score(movement, ship, to, onlytemp)
|
||||
char movement[];
|
||||
struct ship *ship, *to;
|
||||
char onlytemp;
|
||||
{
|
||||
char drift;
|
||||
int row, col, dir, total, ran;
|
||||
struct File *fp = ship->file;
|
||||
|
||||
if ((dir = fp->dir) == 0)
|
||||
return 0;
|
||||
row = fp->row;
|
||||
col = fp->col;
|
||||
drift = fp->drift;
|
||||
move_ship(movement, ship, &fp->dir, &fp->row, &fp->col, &drift);
|
||||
if (!*movement)
|
||||
(void) strcpy(movement, "d");
|
||||
|
||||
ran = range(ship, to);
|
||||
total = -50 * ran;
|
||||
if (ran < 4 && gunsbear(ship, to))
|
||||
total += 60;
|
||||
if ((ran = portside(ship, to, 1) - fp->dir) == 4 || ran == -4)
|
||||
total = -30000;
|
||||
|
||||
if (!onlytemp) {
|
||||
fp->row = row;
|
||||
fp->col = col;
|
||||
fp->dir = dir;
|
||||
}
|
||||
return total;
|
||||
}
|
||||
|
||||
void
|
||||
move_ship(p, ship, dir, row, col, drift)
|
||||
char *p;
|
||||
struct ship *ship;
|
||||
unsigned char *dir;
|
||||
short *row, *col;
|
||||
char *drift;
|
||||
{
|
||||
int dist;
|
||||
char moved = 0;
|
||||
|
||||
for (; *p; p++) {
|
||||
switch (*p) {
|
||||
case 'r':
|
||||
if (++*dir == 9)
|
||||
*dir = 1;
|
||||
break;
|
||||
case 'l':
|
||||
if (--*dir == 0)
|
||||
*dir = 8;
|
||||
break;
|
||||
case '1': case '2': case '3': case '4':
|
||||
case '5': case '6': case '7':
|
||||
moved++;
|
||||
if (*dir % 2 == 0)
|
||||
dist = dtab[*p - '0'];
|
||||
else
|
||||
dist = *p - '0';
|
||||
*row -= dr[*dir] * dist;
|
||||
*col -= dc[*dir] * dist;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!moved) {
|
||||
if (windspeed != 0 && ++*drift > 2) {
|
||||
if ((ship->specs->class >= 3 && !snagged(ship))
|
||||
|| (turn & 1) == 0) {
|
||||
*row -= dr[winddir];
|
||||
*col -= dc[winddir];
|
||||
}
|
||||
}
|
||||
} else
|
||||
*drift = 0;
|
||||
}
|
||||
|
||||
void
|
||||
try(command, temp, ma, ta, af, vma, dir, f, t, high, rakeme)
|
||||
struct ship *f, *t;
|
||||
int ma, ta, af, vma, dir, *high, rakeme;
|
||||
char command[], temp[];
|
||||
{
|
||||
int new, n;
|
||||
char st[4];
|
||||
#define rakeyou (gunsbear(f, t) && !gunsbear(t, f))
|
||||
|
||||
if ((n = str_end(temp)) < '1' || n > '9')
|
||||
for (n = 1; vma - n >= 0; n++) {
|
||||
(void) sprintf(st, "%d", n);
|
||||
(void) strcat(temp, st);
|
||||
new = score(temp, f, t, rakeme);
|
||||
if (new > *high && (!rakeme || rakeyou)) {
|
||||
*high = new;
|
||||
(void) strcpy(command, temp);
|
||||
}
|
||||
try(command, temp, ma-n, ta, af, vma-n,
|
||||
dir, f, t, high, rakeme);
|
||||
rmend(temp);
|
||||
}
|
||||
if ((ma > 0 && ta > 0 && (n = str_end(temp)) != 'l' && n != 'r') || !strlen(temp)) {
|
||||
(void) strcat(temp, "r");
|
||||
new = score(temp, f, t, rakeme);
|
||||
if (new > *high && (!rakeme || (gunsbear(f, t) && !gunsbear(t, f)))) {
|
||||
*high = new;
|
||||
(void) strcpy(command, temp);
|
||||
}
|
||||
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);
|
||||
rmend(temp);
|
||||
}
|
||||
if ((ma > 0 && ta > 0 && (n = str_end(temp)) != 'l' && n != 'r') || !strlen(temp)){
|
||||
(void) strcat(temp, "l");
|
||||
new = score(temp, f, t, rakeme);
|
||||
if (new > *high && (!rakeme || (gunsbear(f, t) && !gunsbear(t, f)))){
|
||||
*high = new;
|
||||
(void) strcpy(command, temp);
|
||||
}
|
||||
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);
|
||||
rmend(temp);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
rmend(str)
|
||||
char *str;
|
||||
{
|
||||
char *p;
|
||||
|
||||
for (p = str; *p; p++)
|
||||
;
|
||||
if (p != str)
|
||||
*--p = 0;
|
||||
}
|
||||
360
sail/dr_3.c
Normal file
360
sail/dr_3.c
Normal file
@@ -0,0 +1,360 @@
|
||||
/* $NetBSD: dr_3.c,v 1.5 1997/10/13 21:03:27 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)dr_3.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: dr_3.c,v 1.5 1997/10/13 21:03:27 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "driver.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
void
|
||||
moveall() /* move all comp ships */
|
||||
{
|
||||
struct ship *sp, *sq;
|
||||
int n;
|
||||
int k, l;
|
||||
int row[NSHIP], col[NSHIP], dir[NSHIP], drift[NSHIP];
|
||||
char moved[NSHIP];
|
||||
|
||||
/*
|
||||
* first try to create moves for OUR ships
|
||||
*/
|
||||
foreachship(sp) {
|
||||
struct ship *closest;
|
||||
int ma, ta;
|
||||
char af;
|
||||
|
||||
if (sp->file->captain[0] || sp->file->dir == 0)
|
||||
continue;
|
||||
if (!sp->file->struck && windspeed && !snagged(sp)
|
||||
&& sp->specs->crew3) {
|
||||
ta = maxturns(sp, &af);
|
||||
ma = maxmove(sp, sp->file->dir, 0);
|
||||
closest = closestenemy(sp, 0, 0);
|
||||
if (closest == 0)
|
||||
*sp->file->movebuf = '\0';
|
||||
else
|
||||
closeon(sp, closest, sp->file->movebuf,
|
||||
ta, ma, af);
|
||||
} else
|
||||
*sp->file->movebuf = '\0';
|
||||
}
|
||||
/*
|
||||
* Then execute the moves for ALL ships (dead ones too),
|
||||
* checking for collisions and snags at each step.
|
||||
* The old positions are saved in row[], col[], dir[].
|
||||
* At the end, we compare and write out the changes.
|
||||
*/
|
||||
n = 0;
|
||||
foreachship(sp) {
|
||||
if (snagged(sp))
|
||||
(void) strcpy(sp->file->movebuf, "d");
|
||||
else
|
||||
if (*sp->file->movebuf != 'd')
|
||||
(void) strcat(sp->file->movebuf, "d");
|
||||
row[n] = sp->file->row;
|
||||
col[n] = sp->file->col;
|
||||
dir[n] = sp->file->dir;
|
||||
drift[n] = sp->file->drift;
|
||||
moved[n] = 0;
|
||||
n++;
|
||||
}
|
||||
/*
|
||||
* Now resolve collisions.
|
||||
* This is the tough part.
|
||||
*/
|
||||
for (k = 0; stillmoving(k); k++) {
|
||||
/*
|
||||
* Step once.
|
||||
* And propagate the nulls at the end of sp->file->movebuf.
|
||||
*/
|
||||
n = 0;
|
||||
foreachship(sp) {
|
||||
if (!sp->file->movebuf[k])
|
||||
sp->file->movebuf[k+1] = '\0';
|
||||
else if (sp->file->dir)
|
||||
step(sp->file->movebuf[k], sp, &moved[n]);
|
||||
n++;
|
||||
}
|
||||
/*
|
||||
* The real stuff.
|
||||
*/
|
||||
n = 0;
|
||||
foreachship(sp) {
|
||||
if (sp->file->dir == 0 || is_isolated(sp))
|
||||
goto cont1;
|
||||
l = 0;
|
||||
foreachship(sq) {
|
||||
char snap = 0;
|
||||
|
||||
if (sp == sq)
|
||||
goto cont2;
|
||||
if (sq->file->dir == 0)
|
||||
goto cont2;
|
||||
if (!push(sp, sq))
|
||||
goto cont2;
|
||||
if (snagged2(sp, sq) && range(sp, sq) > 1)
|
||||
snap++;
|
||||
if (!range(sp, sq) && !fouled2(sp, sq)) {
|
||||
makesignal(sp, "collision with $$", sq);
|
||||
if (die() < 4) {
|
||||
makesignal(sp, "fouled with $$",
|
||||
sq);
|
||||
Write(W_FOUL, sp, 0, l, 0, 0, 0);
|
||||
Write(W_FOUL, sq, 0, n, 0, 0, 0);
|
||||
}
|
||||
snap++;
|
||||
}
|
||||
if (snap) {
|
||||
sp->file->movebuf[k + 1] = 0;
|
||||
sq->file->movebuf[k + 1] = 0;
|
||||
sq->file->row = sp->file->row - 1;
|
||||
if (sp->file->dir == 1
|
||||
|| sp->file->dir == 5)
|
||||
sq->file->col =
|
||||
sp->file->col - 1;
|
||||
else
|
||||
sq->file->col = sp->file->col;
|
||||
sq->file->dir = sp->file->dir;
|
||||
}
|
||||
cont2:
|
||||
l++;
|
||||
}
|
||||
cont1:
|
||||
n++;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* Clear old moves. And write out new pos.
|
||||
*/
|
||||
n = 0;
|
||||
foreachship(sp) {
|
||||
if (sp->file->dir != 0) {
|
||||
*sp->file->movebuf = 0;
|
||||
if (row[n] != sp->file->row)
|
||||
Write(W_ROW, sp, 0, sp->file->row, 0, 0, 0);
|
||||
if (col[n] != sp->file->col)
|
||||
Write(W_COL, sp, 0, sp->file->col, 0, 0, 0);
|
||||
if (dir[n] != sp->file->dir)
|
||||
Write(W_DIR, sp, 0, sp->file->dir, 0, 0, 0);
|
||||
if (drift[n] != sp->file->drift)
|
||||
Write(W_DRIFT, sp, 0, sp->file->drift, 0, 0, 0);
|
||||
}
|
||||
n++;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
stillmoving(k)
|
||||
int k;
|
||||
{
|
||||
struct ship *sp;
|
||||
|
||||
foreachship(sp)
|
||||
if (sp->file->movebuf[k])
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
is_isolated(ship)
|
||||
struct ship *ship;
|
||||
{
|
||||
struct ship *sp;
|
||||
|
||||
foreachship(sp) {
|
||||
if (ship != sp && range(ship, sp) <= 10)
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
int
|
||||
push(from, to)
|
||||
struct ship *from, *to;
|
||||
{
|
||||
int bs, sb;
|
||||
|
||||
sb = to->specs->guns;
|
||||
bs = from->specs->guns;
|
||||
if (sb > bs)
|
||||
return 1;
|
||||
if (sb < bs)
|
||||
return 0;
|
||||
return from < to;
|
||||
}
|
||||
|
||||
void
|
||||
step(com, sp, moved)
|
||||
char com;
|
||||
struct ship *sp;
|
||||
char *moved;
|
||||
{
|
||||
int dist;
|
||||
|
||||
switch (com) {
|
||||
case 'r':
|
||||
if (++sp->file->dir == 9)
|
||||
sp->file->dir = 1;
|
||||
break;
|
||||
case 'l':
|
||||
if (--sp->file->dir == 0)
|
||||
sp->file->dir = 8;
|
||||
break;
|
||||
case '0': case '1': case '2': case '3':
|
||||
case '4': case '5': case '6': case '7':
|
||||
if (sp->file->dir % 2 == 0)
|
||||
dist = dtab[com - '0'];
|
||||
else
|
||||
dist = com - '0';
|
||||
sp->file->row -= dr[sp->file->dir] * dist;
|
||||
sp->file->col -= dc[sp->file->dir] * dist;
|
||||
*moved = 1;
|
||||
break;
|
||||
case 'b':
|
||||
break;
|
||||
case 'd':
|
||||
if (!*moved) {
|
||||
if (windspeed != 0 && ++sp->file->drift > 2 &&
|
||||
((sp->specs->class >= 3 && !snagged(sp))
|
||||
|| (turn & 1) == 0)) {
|
||||
sp->file->row -= dr[winddir];
|
||||
sp->file->col -= dc[winddir];
|
||||
}
|
||||
} else
|
||||
sp->file->drift = 0;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
sendbp(from, to, sections, isdefense)
|
||||
struct ship *from, *to;
|
||||
int sections;
|
||||
char isdefense;
|
||||
{
|
||||
int n;
|
||||
struct BP *bp;
|
||||
|
||||
bp = isdefense ? from->file->DBP : from->file->OBP;
|
||||
for (n = 0; n < NBP && bp[n].turnsent; n++)
|
||||
;
|
||||
if (n < NBP && sections) {
|
||||
Write(isdefense ? W_DBP : W_OBP, from, 0,
|
||||
n, turn, to->file->index, sections);
|
||||
if (isdefense)
|
||||
makemsg(from, "repelling boarders");
|
||||
else
|
||||
makesignal(from, "boarding the $$", to);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
is_toughmelee(ship, to, isdefense, count)
|
||||
struct ship *ship, *to;
|
||||
int isdefense, count;
|
||||
{
|
||||
struct BP *bp;
|
||||
int obp = 0;
|
||||
int n, OBP = 0, DBP = 0, dbp = 0;
|
||||
int qual;
|
||||
|
||||
qual = ship->specs->qual;
|
||||
bp = isdefense ? ship->file->DBP : ship->file->OBP;
|
||||
for (n = 0; n < NBP; n++, bp++) {
|
||||
if (bp->turnsent && (to == bp->toship || isdefense)) {
|
||||
obp += bp->mensent / 100
|
||||
? ship->specs->crew1 * qual : 0;
|
||||
obp += (bp->mensent % 100)/10
|
||||
? ship->specs->crew2 * qual : 0;
|
||||
obp += bp->mensent % 10
|
||||
? ship->specs->crew3 * qual : 0;
|
||||
}
|
||||
}
|
||||
if (count || isdefense)
|
||||
return obp;
|
||||
OBP = is_toughmelee(to, ship, 0, count + 1);
|
||||
dbp = is_toughmelee(ship, to, 1, count + 1);
|
||||
DBP = is_toughmelee(to, ship, 1, count + 1);
|
||||
if (OBP > obp + 10 || OBP + DBP >= obp + dbp + 10)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
reload()
|
||||
{
|
||||
struct ship *sp;
|
||||
|
||||
foreachship(sp) {
|
||||
sp->file->loadwith = 0;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
checksails()
|
||||
{
|
||||
struct ship *sp;
|
||||
int rig, full;
|
||||
struct ship *close;
|
||||
|
||||
foreachship(sp) {
|
||||
if (sp->file->captain[0] != 0)
|
||||
continue;
|
||||
rig = sp->specs->rig1;
|
||||
if (windspeed == 6 || (windspeed == 5 && sp->specs->class > 4))
|
||||
rig = 0;
|
||||
if (rig && sp->specs->crew3) {
|
||||
close = closestenemy(sp, 0, 0);
|
||||
if (close != 0) {
|
||||
if (range(sp, close) > 9)
|
||||
full = 1;
|
||||
else
|
||||
full = 0;
|
||||
} else
|
||||
full = 0;
|
||||
} else
|
||||
full = 0;
|
||||
if ((sp->file->FS != 0) != full)
|
||||
Write(W_FS, sp, 0, full, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
75
sail/dr_4.c
Normal file
75
sail/dr_4.c
Normal file
@@ -0,0 +1,75 @@
|
||||
/* $NetBSD: dr_4.c,v 1.6 1997/10/13 21:03:37 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)dr_4.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: dr_4.c,v 1.6 1997/10/13 21:03:37 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
void
|
||||
ungrap(from, to)
|
||||
struct ship *from, *to;
|
||||
{
|
||||
int k;
|
||||
char friend;
|
||||
|
||||
if ((k = grappled2(from, to)) == 0)
|
||||
return;
|
||||
friend = capship(from)->nationality == capship(to)->nationality;
|
||||
while (--k >= 0) {
|
||||
if (friend || die() < 3) {
|
||||
cleangrapple(from, to, 0);
|
||||
makesignal(from, "ungrappling $$", to);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
grap(from, to)
|
||||
struct ship *from, *to;
|
||||
{
|
||||
if (capship(from)->nationality != capship(to)->nationality && die() > 2)
|
||||
return;
|
||||
Write(W_GRAP, from, 0, to->file->index, 0, 0, 0);
|
||||
Write(W_GRAP, to, 0, from->file->index, 0, 0, 0);
|
||||
makesignal(from, "grappled with $$", to);
|
||||
}
|
||||
102
sail/dr_5.c
Normal file
102
sail/dr_5.c
Normal file
@@ -0,0 +1,102 @@
|
||||
/* $NetBSD: dr_5.c,v 1.5 1997/10/13 19:43:47 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)dr_5.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: dr_5.c,v 1.5 1997/10/13 19:43:47 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
void
|
||||
subtract(from, totalfrom, crewfrom, fromcap, pcfrom)
|
||||
struct ship *from, *fromcap;
|
||||
int pcfrom;
|
||||
int totalfrom, crewfrom[3];
|
||||
{
|
||||
int n;
|
||||
|
||||
if (fromcap == from && totalfrom) { /* if not captured */
|
||||
for (n = 0; n < 3; n++) {
|
||||
if (totalfrom > crewfrom[n]) {
|
||||
totalfrom -= crewfrom[n];
|
||||
crewfrom[n] = 0;
|
||||
} else {
|
||||
crewfrom[n] -= totalfrom;
|
||||
totalfrom = 0;
|
||||
}
|
||||
}
|
||||
Write(W_CREW, from, 0, crewfrom[0], crewfrom[1], crewfrom[2], 0);
|
||||
} else if (totalfrom) {
|
||||
pcfrom -= totalfrom;
|
||||
pcfrom = pcfrom < 0 ? 0 : pcfrom;
|
||||
Write(W_PCREW, from, 0, pcfrom, 0, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
mensent(from, to, crew, captured, pc, isdefense)
|
||||
struct ship *from, *to, **captured;
|
||||
int crew[3], *pc;
|
||||
char isdefense;
|
||||
{ /* returns # of crew squares sent */
|
||||
int men = 0;
|
||||
int n;
|
||||
int c1, c2, c3;
|
||||
struct BP *bp;
|
||||
|
||||
*pc = from->file->pcrew;
|
||||
*captured = from->file->captured;
|
||||
crew[0] = from->specs->crew1;
|
||||
crew[1] = from->specs->crew2;
|
||||
crew[2] = from->specs->crew3;
|
||||
bp = isdefense ? from->file->DBP : from->file->OBP;
|
||||
for (n=0; n < NBP; n++, bp++) {
|
||||
if (bp->turnsent && bp->toship == to)
|
||||
men += bp->mensent;
|
||||
}
|
||||
if (men) {
|
||||
c1 = men/100 ? crew[0] : 0;
|
||||
c2 = (men%100)/10 ? crew[1] : 0;
|
||||
c3 = men/10 ? crew[2] : 0;
|
||||
c3 = *captured == 0 ? crew[2] : *pc;
|
||||
} else
|
||||
c1 = c2 = c3 = 0;
|
||||
return(c1 + c2 + c3);
|
||||
}
|
||||
116
sail/dr_main.c
Normal file
116
sail/dr_main.c
Normal file
@@ -0,0 +1,116 @@
|
||||
/* $NetBSD: dr_main.c,v 1.5 1997/10/13 19:43:54 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)dr_main.c 8.2 (Berkeley) 4/16/94";
|
||||
#else
|
||||
__RCSID("$NetBSD: dr_main.c,v 1.5 1997/10/13 19:43:54 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "driver.h"
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
int
|
||||
dr_main()
|
||||
{
|
||||
int n;
|
||||
struct ship *sp;
|
||||
int nat[NNATION];
|
||||
int value = 0;
|
||||
|
||||
(void) signal(SIGINT, SIG_IGN);
|
||||
(void) signal(SIGQUIT, SIG_IGN);
|
||||
(void) signal(SIGTSTP, SIG_IGN);
|
||||
if (game < 0 || game >= NSCENE) {
|
||||
fprintf(stderr, "DRIVER: Bad game number %d\n", game);
|
||||
exit(1);
|
||||
}
|
||||
cc = &scene[game];
|
||||
ls = SHIP(cc->vessels);
|
||||
if (sync_open() < 0) {
|
||||
perror("driver: syncfile");
|
||||
exit(1);
|
||||
}
|
||||
for (n = 0; n < NNATION; n++)
|
||||
nat[n] = 0;
|
||||
foreachship(sp) {
|
||||
if (sp->file == NULL &&
|
||||
(sp->file = (struct File *)calloc(1, sizeof (struct File))) == NULL) {
|
||||
(void) fprintf(stderr, "DRIVER: Out of memory.\n");
|
||||
exit(1);
|
||||
}
|
||||
sp->file->index = sp - SHIP(0);
|
||||
sp->file->loadL = L_ROUND;
|
||||
sp->file->loadR = L_ROUND;
|
||||
sp->file->readyR = R_LOADED|R_INITIAL;
|
||||
sp->file->readyL = R_LOADED|R_INITIAL;
|
||||
sp->file->stern = nat[sp->nationality]++;
|
||||
sp->file->dir = sp->shipdir;
|
||||
sp->file->row = sp->shiprow;
|
||||
sp->file->col = sp->shipcol;
|
||||
}
|
||||
windspeed = cc->windspeed;
|
||||
winddir = cc->winddir;
|
||||
people = 0;
|
||||
for (;;) {
|
||||
sleep(7);
|
||||
if (Sync() < 0) {
|
||||
value = 1;
|
||||
break;
|
||||
}
|
||||
if (next() < 0)
|
||||
break;
|
||||
unfoul();
|
||||
checkup();
|
||||
prizecheck();
|
||||
moveall();
|
||||
thinkofgrapples();
|
||||
boardcomp();
|
||||
compcombat();
|
||||
resolve();
|
||||
reload();
|
||||
checksails();
|
||||
if (Sync() < 0) {
|
||||
value = 1;
|
||||
break;
|
||||
}
|
||||
}
|
||||
sync_close(1);
|
||||
return value;
|
||||
}
|
||||
40
sail/driver.h
Normal file
40
sail/driver.h
Normal file
@@ -0,0 +1,40 @@
|
||||
/* $NetBSD: driver.h,v 1.5 1998/03/29 04:57:19 mrg Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)driver.h 8.2 (Berkeley) 5/3/95
|
||||
*/
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
extern int dtab[];
|
||||
442
sail/extern.h
Normal file
442
sail/extern.h
Normal file
@@ -0,0 +1,442 @@
|
||||
/* $NetBSD: extern.h,v 1.8 1998/09/13 15:27:30 hubertf Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)externs.h 8.1 (Berkeley) 5/31/93
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <signal.h>
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <setjmp.h>
|
||||
#include <sys/types.h>
|
||||
#include "machdep.h"
|
||||
|
||||
/* program mode */
|
||||
int mode;
|
||||
jmp_buf restart;
|
||||
#define MODE_PLAYER 1
|
||||
#define MODE_DRIVER 2
|
||||
#define MODE_LOGGER 3
|
||||
|
||||
/* command line flags */
|
||||
char debug; /* -D */
|
||||
char randomize; /* -x, give first available ship */
|
||||
char longfmt; /* -l, print score in long format */
|
||||
char nobells; /* -b, don't ring bell before Signal */
|
||||
|
||||
/* other initial modes */
|
||||
gid_t gid;
|
||||
gid_t egid;
|
||||
|
||||
#define die() ((rand() >> 3) % 6 + 1)
|
||||
#define sqr(a) ((a) * (a))
|
||||
#define abs(a) ((a) > 0 ? (a) : -(a))
|
||||
#define min(a,b) ((a) < (b) ? (a) : (b))
|
||||
|
||||
#define grappled(a) ((a)->file->ngrap)
|
||||
#define fouled(a) ((a)->file->nfoul)
|
||||
#define snagged(a) (grappled(a) + fouled(a))
|
||||
|
||||
#define grappled2(a, b) ((a)->file->grap[(b)->file->index].sn_count)
|
||||
#define fouled2(a, b) ((a)->file->foul[(b)->file->index].sn_count)
|
||||
#define snagged2(a, b) (grappled2(a, b) + fouled2(a, b))
|
||||
|
||||
#define Xgrappled2(a, b) ((a)->file->grap[(b)->file->index].sn_turn < turn-1 ? grappled2(a, b) : 0)
|
||||
#define Xfouled2(a, b) ((a)->file->foul[(b)->file->index].sn_turn < turn-1 ? fouled2(a, b) : 0)
|
||||
#define Xsnagged2(a, b) (Xgrappled2(a, b) + Xfouled2(a, b))
|
||||
|
||||
#define cleangrapple(a, b, c) Cleansnag(a, b, c, 1)
|
||||
#define cleanfoul(a, b, c) Cleansnag(a, b, c, 2)
|
||||
#define cleansnag(a, b, c) Cleansnag(a, b, c, 3)
|
||||
|
||||
#define sterncolour(sp) ((sp)->file->stern+'0'-((sp)->file->captured?10:0))
|
||||
#define sternrow(sp) ((sp)->file->row + dr[(sp)->file->dir])
|
||||
#define sterncol(sp) ((sp)->file->col + dc[(sp)->file->dir])
|
||||
|
||||
#define capship(sp) ((sp)->file->captured?(sp)->file->captured:(sp))
|
||||
|
||||
#define readyname(r) ((r) & R_LOADING ? '*' : ((r) & R_INITIAL ? '!' : ' '))
|
||||
|
||||
/* loadL and loadR, should match loadname[] */
|
||||
#define L_EMPTY 0 /* should be 0, don't change */
|
||||
#define L_GRAPE 1
|
||||
#define L_CHAIN 2
|
||||
#define L_ROUND 3
|
||||
#define L_DOUBLE 4
|
||||
#define L_EXPLODE 5
|
||||
|
||||
/*
|
||||
* readyL and readyR, these are bits, except R_EMPTY
|
||||
*/
|
||||
#define R_EMPTY 0 /* not loaded and not loading */
|
||||
#define R_LOADING 1 /* loading */
|
||||
#define R_DOUBLE 2 /* loading double */
|
||||
#define R_LOADED 4 /* loaded */
|
||||
#define R_INITIAL 8 /* loaded initial */
|
||||
|
||||
#define HULL 0
|
||||
#define RIGGING 1
|
||||
|
||||
#define W_CAPTAIN 1
|
||||
#define W_CAPTURED 2
|
||||
#define W_CLASS 3
|
||||
#define W_CREW 4
|
||||
#define W_DBP 5
|
||||
#define W_DRIFT 6
|
||||
#define W_EXPLODE 7
|
||||
#define W_FILE 8
|
||||
#define W_FOUL 9
|
||||
#define W_GUNL 10
|
||||
#define W_GUNR 11
|
||||
#define W_HULL 12
|
||||
#define W_MOVE 13
|
||||
#define W_OBP 14
|
||||
#define W_PCREW 15
|
||||
#define W_UNFOUL 16
|
||||
#define W_POINTS 17
|
||||
#define W_QUAL 18
|
||||
#define W_UNGRAP 19
|
||||
#define W_RIGG 20
|
||||
#define W_COL 21
|
||||
#define W_DIR 22
|
||||
#define W_ROW 23
|
||||
#define W_SIGNAL 24
|
||||
#define W_SINK 25
|
||||
#define W_STRUCK 26
|
||||
#define W_TA 27
|
||||
#define W_ALIVE 28
|
||||
#define W_TURN 29
|
||||
#define W_WIND 30
|
||||
#define W_FS 31
|
||||
#define W_GRAP 32
|
||||
#define W_RIG1 33
|
||||
#define W_RIG2 34
|
||||
#define W_RIG3 35
|
||||
#define W_RIG4 36
|
||||
#define W_BEGIN 37
|
||||
#define W_END 38
|
||||
#define W_DDEAD 39
|
||||
|
||||
#define NLOG 10
|
||||
struct logs {
|
||||
char l_name[20];
|
||||
int l_uid;
|
||||
int l_shipnum;
|
||||
int l_gamenum;
|
||||
int l_netpoints;
|
||||
};
|
||||
|
||||
struct BP {
|
||||
short turnsent;
|
||||
struct ship *toship;
|
||||
short mensent;
|
||||
};
|
||||
|
||||
struct snag {
|
||||
short sn_count;
|
||||
short sn_turn;
|
||||
};
|
||||
|
||||
#define NSCENE nscene
|
||||
#define NSHIP 10
|
||||
#define NBP 3
|
||||
|
||||
#define NNATION 8
|
||||
#define N_A 0
|
||||
#define N_B 1
|
||||
#define N_S 2
|
||||
#define N_F 3
|
||||
#define N_J 4
|
||||
#define N_D 5
|
||||
#define N_K 6
|
||||
#define N_O 7
|
||||
|
||||
struct File {
|
||||
int index;
|
||||
char captain[20]; /* 0 */
|
||||
short points; /* 20 */
|
||||
unsigned char loadL; /* 22 */
|
||||
unsigned char loadR; /* 24 */
|
||||
unsigned char readyL; /* 26 */
|
||||
unsigned char readyR; /* 28 */
|
||||
struct BP OBP[NBP]; /* 30 */
|
||||
struct BP DBP[NBP]; /* 48 */
|
||||
char struck; /* 66 */
|
||||
struct ship *captured; /* 68 */
|
||||
short pcrew; /* 70 */
|
||||
char movebuf[10]; /* 72 */
|
||||
char drift; /* 82 */
|
||||
short nfoul;
|
||||
short ngrap;
|
||||
struct snag foul[NSHIP]; /* 84 */
|
||||
struct snag grap[NSHIP]; /* 124 */
|
||||
char RH; /* 224 */
|
||||
char RG; /* 226 */
|
||||
char RR; /* 228 */
|
||||
char FS; /* 230 */
|
||||
char explode; /* 232 */
|
||||
char sink; /* 234 */
|
||||
unsigned char dir;
|
||||
short col;
|
||||
short row;
|
||||
char loadwith;
|
||||
char stern;
|
||||
};
|
||||
|
||||
struct ship {
|
||||
char *shipname; /* 0 */
|
||||
struct shipspecs *specs; /* 2 */
|
||||
unsigned char nationality; /* 4 */
|
||||
short shiprow; /* 6 */
|
||||
short shipcol; /* 8 */
|
||||
char shipdir; /* 10 */
|
||||
struct File *file; /* 12 */
|
||||
};
|
||||
|
||||
struct scenario {
|
||||
char winddir; /* 0 */
|
||||
char windspeed; /* 2 */
|
||||
char windchange; /* 4 */
|
||||
unsigned char vessels; /* 12 */
|
||||
char *name; /* 14 */
|
||||
struct ship ship[NSHIP]; /* 16 */
|
||||
};
|
||||
extern struct scenario scene[];
|
||||
extern int nscene;
|
||||
|
||||
struct shipspecs {
|
||||
char bs;
|
||||
char fs;
|
||||
char ta;
|
||||
short guns;
|
||||
unsigned char class;
|
||||
char hull;
|
||||
unsigned char qual;
|
||||
char crew1;
|
||||
char crew2;
|
||||
char crew3;
|
||||
char gunL;
|
||||
char gunR;
|
||||
char carL;
|
||||
char carR;
|
||||
int rig1;
|
||||
int rig2;
|
||||
int rig3;
|
||||
int rig4;
|
||||
short pts;
|
||||
};
|
||||
extern struct shipspecs specs[];
|
||||
|
||||
struct scenario *cc; /* the current scenario */
|
||||
struct ship *ls; /* &cc->ship[cc->vessels] */
|
||||
|
||||
#define SHIP(s) (&cc->ship[s])
|
||||
#define foreachship(sp) for ((sp) = cc->ship; (sp) < ls; (sp)++)
|
||||
|
||||
struct windeffects {
|
||||
char A, B, C, D;
|
||||
};
|
||||
extern struct windeffects WET[7][6];
|
||||
|
||||
struct Tables {
|
||||
char H, G, C, R;
|
||||
};
|
||||
extern struct Tables RigTable[11][6];
|
||||
extern struct Tables HullTable[11][6];
|
||||
|
||||
extern char AMMO[9][4];
|
||||
extern char HDT[9][10];
|
||||
extern char HDTrake[9][10];
|
||||
extern char QUAL[9][5];
|
||||
extern char MT[9][3];
|
||||
|
||||
extern char *countryname[];
|
||||
extern char *classname[];
|
||||
extern char *directionname[];
|
||||
extern char *qualname[];
|
||||
extern char loadname[];
|
||||
|
||||
extern char rangeofshot[];
|
||||
|
||||
extern char dr[], dc[];
|
||||
|
||||
int winddir;
|
||||
int windspeed;
|
||||
int turn;
|
||||
int game;
|
||||
int alive;
|
||||
int people;
|
||||
char hasdriver;
|
||||
|
||||
/* assorted.c */
|
||||
void table __P((int, int, int, struct ship *, struct ship *, int));
|
||||
void Cleansnag __P((struct ship *, struct ship *, int, int));
|
||||
|
||||
/* dr_1.c */
|
||||
void unfoul __P((void));
|
||||
void boardcomp __P((void));
|
||||
int fightitout __P((struct ship *, struct ship *, int));
|
||||
void resolve __P((void));
|
||||
void compcombat __P((void));
|
||||
int next __P((void));
|
||||
|
||||
/* dr_2.c */
|
||||
void thinkofgrapples __P((void));
|
||||
void checkup __P((void));
|
||||
void prizecheck __P((void));
|
||||
int str_end __P((char *));
|
||||
void closeon __P((struct ship *, struct ship *, char[], int, int, int));
|
||||
int score __P((char[], struct ship *, struct ship *, int));
|
||||
void move_ship __P((char *, struct ship *, unsigned char *, short *, short *, char *));
|
||||
void try __P((char[], char [], int, int, int, int, int, struct ship *,
|
||||
struct ship *, int *, int));
|
||||
void rmend __P((char *));
|
||||
|
||||
/* dr_3.c */
|
||||
void moveall __P((void));
|
||||
int stillmoving __P((int));
|
||||
int is_isolated __P((struct ship *));
|
||||
int push __P((struct ship *, struct ship *));
|
||||
void step __P((int, struct ship *, char *));
|
||||
void sendbp __P((struct ship *, struct ship *, int, int));
|
||||
int is_toughmelee __P((struct ship *, struct ship *, int, int));
|
||||
void reload __P((void));
|
||||
void checksails __P((void));
|
||||
|
||||
/* dr_4.c */
|
||||
void ungrap __P((struct ship *, struct ship *));
|
||||
void grap __P((struct ship *, struct ship *));
|
||||
|
||||
/* dr_5.c */
|
||||
void subtract __P((struct ship *, int, int [3], struct ship *, int));
|
||||
int mensent __P((struct ship *, struct ship *, int[3], struct ship **, int *,
|
||||
int));
|
||||
|
||||
/* dr_main.c */
|
||||
int dr_main __P((void));
|
||||
|
||||
/* game.c */
|
||||
int maxturns __P((struct ship *, char *));
|
||||
int maxmove __P((struct ship *, int, int));
|
||||
|
||||
/* lo_main.c */
|
||||
int lo_main __P((void));
|
||||
|
||||
/* misc.c */
|
||||
int range __P((struct ship *, struct ship *));
|
||||
struct ship *closestenemy __P((struct ship *, int, int));
|
||||
int angle __P((int, int));
|
||||
int gunsbear __P((struct ship *, struct ship *));
|
||||
int portside __P((struct ship *, struct ship *, int));
|
||||
int colours __P((struct ship *));
|
||||
void logger __P((struct ship *));
|
||||
|
||||
/* parties.c */
|
||||
int meleeing __P((struct ship *, struct ship *));
|
||||
int boarding __P((struct ship *, int));
|
||||
void unboard __P((struct ship *, struct ship *, int));
|
||||
|
||||
/* pl_1.c */
|
||||
void leave __P((int)) __attribute__((__noreturn__));
|
||||
void choke __P((int)) __attribute__((__noreturn__));
|
||||
void child __P((int));
|
||||
|
||||
/* pl_2.c */
|
||||
void play __P((void));
|
||||
|
||||
/* pl_3.c */
|
||||
void acceptcombat __P((void));
|
||||
void grapungrap __P((void));
|
||||
void unfoulplayer __P((void));
|
||||
|
||||
/* pl_4.c */
|
||||
void changesail __P((void));
|
||||
void acceptsignal __P((void));
|
||||
void lookout __P((void));
|
||||
char *saywhat __P((struct ship *, int));
|
||||
void eyeball __P((struct ship *));
|
||||
|
||||
/* pl_5.c */
|
||||
void acceptmove __P((void));
|
||||
void acceptboard __P((void));
|
||||
void parties __P((int[3], struct ship *, int, int));
|
||||
|
||||
/* pl_6.c */
|
||||
void repair __P((void));
|
||||
int turned __P((void));
|
||||
void loadplayer __P((void));
|
||||
|
||||
/* pl_7.c */
|
||||
void initscreen __P((void));
|
||||
void cleanupscreen __P((void));
|
||||
void newturn __P((int));
|
||||
void Signal __P((const char *, struct ship *, ...))
|
||||
__attribute__((__format__(__printf__,1,3)));
|
||||
void Msg __P((const char *, ...))
|
||||
__attribute__((__format__(__printf__,1,2)));
|
||||
void Scroll __P((void));
|
||||
void prompt __P((char *, struct ship *));
|
||||
void endprompt __P((int));
|
||||
int sgetch __P((char *, struct ship *, int));
|
||||
void sgetstr __P((char *, char *, int));
|
||||
void draw_screen __P((void));
|
||||
void draw_view __P((void));
|
||||
void draw_turn __P((void));
|
||||
void draw_stat __P((void));
|
||||
void draw_slot __P((void));
|
||||
void draw_board __P((void));
|
||||
void centerview __P((void));
|
||||
void upview __P((void));
|
||||
void downview __P((void));
|
||||
void leftview __P((void));
|
||||
void rightview __P((void));
|
||||
void adjustview __P((void));
|
||||
|
||||
/* pl_main.c */
|
||||
int pl_main __P((void));
|
||||
void initialize __P((void));
|
||||
|
||||
/* sync.c */
|
||||
void fmtship __P((char *, size_t, const char *, struct ship *));
|
||||
void makesignal __P((struct ship *, const char *, struct ship *, ...))
|
||||
__attribute__((__format__(__printf__,2,4)));
|
||||
void makemsg __P((struct ship *, const char *, ...))
|
||||
__attribute__((__format__(__printf__,2,3)));
|
||||
int sync_exists __P((int));
|
||||
int sync_open __P((void));
|
||||
void sync_close __P((int));
|
||||
void Write __P((int, struct ship *, int, long, long, long, long));
|
||||
int Sync __P((void));
|
||||
int sync_update __P((int, struct ship *, long, long, long, long));
|
||||
96
sail/game.c
Normal file
96
sail/game.c
Normal file
@@ -0,0 +1,96 @@
|
||||
/* $NetBSD: game.c,v 1.5 1997/10/13 19:44:09 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)game.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: game.c,v 1.5 1997/10/13 19:44:09 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
int
|
||||
maxturns(ship, af)
|
||||
struct ship *ship;
|
||||
char *af;
|
||||
{
|
||||
int turns;
|
||||
|
||||
turns = ship->specs->ta;
|
||||
if ((*af = (ship->file->drift > 1 && turns)) != 0) {
|
||||
turns--;
|
||||
if (ship->file->FS == 1)
|
||||
turns = 0;
|
||||
}
|
||||
return turns;
|
||||
}
|
||||
|
||||
int
|
||||
maxmove(ship, dir, fs)
|
||||
struct ship *ship;
|
||||
int dir, fs;
|
||||
{
|
||||
int riggone = 0, Move, flank = 0;
|
||||
|
||||
Move = ship->specs->bs;
|
||||
if (!ship->specs->rig1)
|
||||
riggone++;
|
||||
if (!ship->specs->rig2)
|
||||
riggone++;
|
||||
if (!ship->specs->rig3)
|
||||
riggone++;
|
||||
if (!ship->specs->rig4)
|
||||
riggone++;
|
||||
if ((ship->file->FS || fs) && fs != -1) {
|
||||
flank = 1;
|
||||
Move = ship->specs->fs;
|
||||
}
|
||||
if (dir == winddir)
|
||||
Move -= 1 + WET[windspeed][ship->specs->class-1].B;
|
||||
else if (dir == winddir + 2 || dir == winddir - 2 || dir == winddir - 6 || dir == winddir + 6)
|
||||
Move -= 1 + WET[windspeed][ship->specs->class-1].C;
|
||||
else if (dir == winddir + 3 || dir == winddir - 3 || dir == winddir - 5 || dir == winddir + 5)
|
||||
Move = (flank ? 2 : 1) - WET[windspeed][ship->specs->class-1].D;
|
||||
else if (dir == winddir + 4 || dir == winddir - 4)
|
||||
Move = 0;
|
||||
else
|
||||
Move -= WET[windspeed][ship->specs->class-1].A;
|
||||
Move -= riggone;
|
||||
Move = Move < 0 ? 0 : Move;
|
||||
return(Move);
|
||||
}
|
||||
546
sail/globals.c
Normal file
546
sail/globals.c
Normal file
@@ -0,0 +1,546 @@
|
||||
/* $NetBSD: globals.c,v 1.6 1997/10/13 19:44:17 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)globals.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: globals.c,v 1.6 1997/10/13 19:44:17 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
struct scenario scene[] = {
|
||||
/*
|
||||
* int winddir;
|
||||
* int windspeed;
|
||||
* int windchange;
|
||||
* int vessels;
|
||||
* char *name;
|
||||
* struct ship ship[NSHIP];
|
||||
*/
|
||||
{ 5, 3, 5, 2, "Ranger vs. Drake",
|
||||
{
|
||||
{ "Ranger", specs+0, N_A, 7, 20, 4, 0 },
|
||||
{ "Drake", specs+1, N_B, 7, 31, 5, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 3, 6, 2, "The Battle of Flamborough Head",
|
||||
{
|
||||
{ "Bonhomme Rich", specs+2, N_A, 13, 40, 2, 0 },
|
||||
{ "Serapis", specs+3, N_B, 2, 42, 2, 0 }
|
||||
}
|
||||
},
|
||||
{ 5, 5, 5, 10, "Arbuthnot and Des Touches",
|
||||
{
|
||||
{ "America", specs+4, N_B, 7, 37, 4, 0 },
|
||||
{ "Befford", specs+5, N_B, 5, 35, 4, 0 },
|
||||
{ "Adamant", specs+6, N_B, 3, 33, 4, 0 },
|
||||
{ "London", specs+7, N_B, 1, 31, 4, 0 },
|
||||
{ "Royal Oak", specs+8, N_B, -1, 29, 4, 0 },
|
||||
{ "Neptune", specs+9, N_F, 6, 44, 4, 0 },
|
||||
{ "Duc Bougogne", specs+10, N_F, 8, 46, 4, 0 },
|
||||
{ "Conquerant", specs+48, N_F, 10, 48, 4, 0 },
|
||||
{ "Provence", specs+11, N_F, 12, 50, 4, 0 },
|
||||
{ "Romulus", specs+12, N_F, 20, 58, 4, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 3, 5, 10, "Suffren and Hughes",
|
||||
{
|
||||
{ "Monmouth", specs+52, N_B, 9, 45, 2, 0 },
|
||||
{ "Hero", specs+5, N_B, 13, 49, 2, 0 },
|
||||
{ "Isis", specs+6, N_B, 12, 48, 2, 0 },
|
||||
{ "Superb", specs+50, N_B, 10, 46, 2, 0 },
|
||||
{ "Burford", specs+48, N_B, 11, 47, 2, 0 },
|
||||
{ "Flamband", specs+13, N_F, 7, 59, 4, 0 },
|
||||
{ "Annibal", specs+9, N_F, 4, 56, 4, 0 },
|
||||
{ "Severe", specs+11, N_F, 2, 54, 4, 0 },
|
||||
{ "Brilliant", specs+49, N_F, -1, 51, 4, 0 },
|
||||
{ "Sphinx", specs+51, N_F, -5, 47, 4, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 3, 4, 2, "Nymphe vs. Cleopatre",
|
||||
{
|
||||
{ "Nymphe", specs+14, N_B, 13, 30, 2, 0 },
|
||||
{ "Cleopatre", specs+15, N_F, 3, 41, 2, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 3, 5, 2, "Mars vs. Hercule",
|
||||
{
|
||||
{ "Mars", specs+16, N_B, 13, 30, 2, 0 },
|
||||
{ "Hercule", specs+17, N_F, 3, 41, 2, 0 }
|
||||
}
|
||||
},
|
||||
{ 5, 3, 5, 2, "Ambuscade vs. Baionnaise",
|
||||
{
|
||||
{ "Ambuscade", specs+18, N_B, 13, 30, 2, 0 },
|
||||
{ "Baionnaise", specs+19, N_F, 3, 41, 2, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 5, 6, 2, "Constellation vs. Insurgent",
|
||||
{
|
||||
{ "Constellation", specs+20, N_A, 9, 50, 8, 0 },
|
||||
{ "Insurgent", specs+22, N_F, 4, 24, 2, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 3, 5, 2, "Constellation vs. Vengeance",
|
||||
{
|
||||
{ "Constellation", specs+20, N_A, 12, 40, 2, 0 },
|
||||
{ "Vengeance", specs+21, N_F, 1, 43, 2, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 3, 6, 10, "The Battle of Lissa",
|
||||
{
|
||||
{ "Amphion", specs+23, N_B, 8, 50, 4, 0 },
|
||||
{ "Active", specs+24, N_B, 6, 48, 4, 0 },
|
||||
{ "Volage", specs+25, N_B, 4, 46, 4, 0 },
|
||||
{ "Cerberus", specs+26, N_B, 2, 44, 4, 0 },
|
||||
{ "Favorite", specs+27, N_F, 9, 34, 2, 0 },
|
||||
{ "Flore", specs+21, N_F, 13, 39, 2, 0 },
|
||||
{ "Danae", specs+64, N_F, 15, 37, 2, 0 },
|
||||
{ "Bellona", specs+28, N_F, 17, 35, 2, 0 },
|
||||
{ "Corona", specs+29, N_F, 12, 31, 2, 0 },
|
||||
{ "Carolina", specs+30, N_F, 15, 28, 2, 0 }
|
||||
}
|
||||
},
|
||||
{ 2, 5, 6, 2, "Constitution vs. Guerriere",
|
||||
{
|
||||
{ "Constitution", specs+31, N_A, 7, 35, 1, 0 },
|
||||
{ "Guerriere", specs+32, N_B, 7, 47, 4, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 3, 5, 2, "United States vs. Macedonian",
|
||||
{
|
||||
{ "United States", specs+33, N_A, 1, 52, 6, 0 },
|
||||
{ "Macedonian", specs+34, N_B, 14, 40, 1, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 3, 6, 2, "Constitution vs. Java",
|
||||
{
|
||||
{ "Constitution", specs+31, N_A, 1, 40, 2, 0 },
|
||||
{ "Java", specs+35, N_B, 11, 40, 2, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 3, 5, 2, "Chesapeake vs. Shannon",
|
||||
{
|
||||
{ "Chesapeake", specs+36, N_A, 13, 40, 2, 0 },
|
||||
{ "Shannon", specs+37, N_B, 1, 42, 2, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 1, 6, 5, "The Battle of Lake Erie",
|
||||
{
|
||||
{ "Lawrence", specs+38, N_A, 4, 55, 8, 0 },
|
||||
{ "Niagara", specs+42, N_A, 7, 61, 8, 0 },
|
||||
{ "Lady Prevost", specs+39, N_B, 4, 25, 2, 0 },
|
||||
{ "Detroit", specs+40, N_B, 7, 22, 2, 0 },
|
||||
{ "Q. Charlotte", specs+41, N_B, 10, 19, 2, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 1, 5, 2, "Wasp vs. Reindeer",
|
||||
{
|
||||
{ "Wasp", specs+42, N_A, 3, 41, 2, 0 },
|
||||
{ "Reindeer", specs+43, N_B, 10, 48, 2, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 2, 5, 3, "Constitution vs. Cyane and Levant",
|
||||
{
|
||||
{ "Constitution", specs+31, N_A, 10, 45, 2, 0 },
|
||||
{ "Cyane", specs+44, N_B, 3, 37, 2, 0 },
|
||||
{ "Levant", specs+45, N_B, 5, 35, 2, 0 }
|
||||
}
|
||||
},
|
||||
{ 5, 5, 5, 3, "Pellew vs. Droits de L'Homme",
|
||||
{
|
||||
{ "Indefatigable", specs+46, N_B, 12, 45, 6, 0 },
|
||||
{ "Amazon", specs+47, N_B, 9, 48, 6, 0 },
|
||||
{ "Droits L'Hom", specs+48, N_F, 3, 28, 5, 0 }
|
||||
}
|
||||
},
|
||||
{ 2, 2, 3, 10, "Algeciras",
|
||||
{
|
||||
{ "Caesar", specs+49, N_B, 7, 70, 6, 0 },
|
||||
{ "Pompee", specs+50, N_B, 5, 72, 6, 0 },
|
||||
{ "Spencer", specs+5, N_B, 3, 74, 6, 0 },
|
||||
{ "Hannibal", specs+7, N_B, 1, 76, 6, 0 },
|
||||
{ "Real-Carlos", specs+53, N_S, 9, 20, 3, 0 },
|
||||
{ "San Fernando", specs+54, N_S, 11, 16, 3, 0 },
|
||||
{ "Argonauta", specs+55, N_S, 10, 14, 4, 0 },
|
||||
{ "San Augustine", specs+56, N_S, 6, 22, 4, 0 },
|
||||
{ "Indomptable", specs+51, N_F, 7, 23, 5, 0 },
|
||||
{ "Desaix", specs+52, N_F, 7, 27, 7, 0 }
|
||||
}
|
||||
},
|
||||
{ 5, 3, 6, 7, "Lake Champlain",
|
||||
{
|
||||
{ "Saratoga", specs+60, N_A, 8, 10, 1, 0 },
|
||||
{ "Eagle", specs+61, N_A, 9, 13, 2, 0 },
|
||||
{ "Ticonderoga", specs+62, N_A, 12, 17, 3, 0 },
|
||||
{ "Preble", specs+63, N_A, 14, 20, 2, 0 },
|
||||
{ "Confiance", specs+57, N_B, 4, 70, 6, 0 },
|
||||
{ "Linnet", specs+58, N_B, 7, 68, 6, 0 },
|
||||
{ "Chubb", specs+59, N_B, 10, 65, 6, 0 }
|
||||
}
|
||||
},
|
||||
{ 5, 3, 6, 4, "Last Voyage of the USS President",
|
||||
{
|
||||
{ "President", specs+67, N_A, 12, 42, 5, 0 },
|
||||
{ "Endymion", specs+64, N_B, 5, 42, 5, 0 },
|
||||
{ "Pomone", specs+65, N_B, 7, 82, 6, 0 },
|
||||
{ "Tenedos", specs+66, N_B, 7, -1, 4, 0 }
|
||||
}
|
||||
},
|
||||
{ 7, 5, 5, 2, "Hornblower and the Natividad",
|
||||
{
|
||||
{ "Lydia", specs+68, N_B, 12, 40, 2, 0 },
|
||||
{ "Natividad", specs+69, N_S, 2, 40, 4, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 3, 6, 2, "Curse of the Flying Dutchman",
|
||||
{
|
||||
{ "Piece of Cake", specs+19, N_S, 7, 40, 2, 0 },
|
||||
{ "Flying Dutchy", specs+71, N_F, 7, 41, 1, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 4, 1, 4, "The South Pacific",
|
||||
{
|
||||
{ "USS Scurvy", specs+70, N_A, 7, 40, 1, 0 },
|
||||
{ "HMS Tahiti", specs+71, N_B, 12, 60, 1, 0 },
|
||||
{ "Australian", specs+18, N_S, 5, 20, 8, 0 },
|
||||
{ "Bikini Atoll", specs+63, N_F, 2, 60, 4, 0 }
|
||||
}
|
||||
},
|
||||
{ 7, 3, 6, 5, "Hornblower and the battle of Rosas bay",
|
||||
{
|
||||
{ "Sutherland", specs+5, N_B, 13, 30, 2, 0 },
|
||||
{ "Turenne", specs+10, N_F, 9, 35, 6, 0 },
|
||||
{ "Nightmare", specs+9, N_F, 7, 37, 6, 0 },
|
||||
{ "Paris", specs+53, N_F, 3, 45, 4, 0 },
|
||||
{ "Napoleon", specs+56, N_F, 1, 40, 6, 0 }
|
||||
}
|
||||
},
|
||||
{ 6, 4, 7, 5, "Cape Horn",
|
||||
{
|
||||
{ "Concord", specs+51, N_A, 3, 20, 4, 0 },
|
||||
{ "Berkeley", specs+7, N_A, 5, 50, 5, 0 },
|
||||
{ "Thames", specs+71, N_B, 10, 40, 1, 0 },
|
||||
{ "Madrid", specs+53, N_S, 13, 60, 8, 0 },
|
||||
{ "Musket", specs+10, N_F, 10, 60, 7, 0 }
|
||||
}
|
||||
},
|
||||
{ 8, 3, 7, 3, "New Orleans",
|
||||
{
|
||||
{ "Alligator", specs+71, N_A, 13, 5, 1, 0 },
|
||||
{ "Firefly", specs+50, N_B, 10, 20, 8, 0 },
|
||||
{ "Cypress", specs+46, N_B, 5, 10, 6, 0 }
|
||||
}
|
||||
},
|
||||
{ 5, 3, 7, 3, "Botany Bay",
|
||||
{
|
||||
{ "Shark", specs+11, N_B, 6, 15, 4, 0 },
|
||||
{ "Coral Snake", specs+31, N_F, 3, 30, 6, 0 },
|
||||
{ "Sea Lion", specs+33, N_F, 13, 50, 8, 0 }
|
||||
}
|
||||
},
|
||||
{ 4, 3, 6, 4, "Voyage to the Bottom of the Sea",
|
||||
{
|
||||
{ "Seaview", specs+71, N_A, 6, 3, 3, 0 },
|
||||
{ "Flying Sub", specs+64, N_A, 8, 3, 3, 0 },
|
||||
{ "Mermaid", specs+70, N_B, 2, 5, 5, 0 },
|
||||
{ "Giant Squid", specs+53, N_S, 10, 30, 8, 0 }
|
||||
}
|
||||
},
|
||||
{ 7, 3, 6, 3, "Frigate Action",
|
||||
{
|
||||
{ "Killdeer", specs+21, N_A, 7, 20, 8, 0 },
|
||||
{ "Sandpiper", specs+27, N_B, 5, 40, 8, 0 },
|
||||
{ "Curlew", specs+34, N_S, 10, 60, 8, 0 }
|
||||
}
|
||||
},
|
||||
{ 7, 2, 5, 6, "The Battle of Midway",
|
||||
{
|
||||
{ "Enterprise", specs+49, N_A, 10, 70, 8, 0 },
|
||||
{ "Yorktown", specs+51, N_A, 3, 70, 7, 0 },
|
||||
{ "Hornet", specs+52, N_A, 6, 70, 7, 0 },
|
||||
{ "Akagi", specs+53, N_J, 6, 10, 4, 0 },
|
||||
{ "Kaga", specs+54, N_J, 4, 12, 4, 0 },
|
||||
{ "Soryu", specs+55, N_J, 2, 14, 4, 0 }
|
||||
}
|
||||
},
|
||||
{ 1, 3, 4, 8, "Star Trek",
|
||||
{
|
||||
{ "Enterprise", specs+76, N_D,-10, 60, 7, 0 },
|
||||
{ "Yorktown", specs+77, N_D, 0, 70, 7, 0 },
|
||||
{ "Reliant", specs+78, N_D, 10, 70, 7, 0 },
|
||||
{ "Galileo", specs+79, N_D, 20, 60, 7, 0 },
|
||||
{ "Kobayashi Maru", specs+80, N_K, 0,120, 7, 0 },
|
||||
{ "Klingon II", specs+81, N_K, 10,120, 7, 0 },
|
||||
{ "Red Orion", specs+82, N_O, 0, 0, 3, 0 },
|
||||
{ "Blue Orion", specs+83, N_O, 10, 0, 3, 0 }
|
||||
}
|
||||
}
|
||||
};
|
||||
int nscene = sizeof scene / sizeof (struct scenario);
|
||||
|
||||
struct shipspecs specs[] = {
|
||||
/* bs fs ta guns hull crew1 crew3 gunR carR rig2 rig4 pts */
|
||||
/* class qual crew2 gunL carL rig1 rig3 */
|
||||
/*00*/{ 4, 7, 3, 19, 5, 5, 4, 2, 2, 2, 2, 2, 0, 0, 4, 4, 4, 4, 7 },
|
||||
/*01*/{ 4, 7, 3, 17, 5, 5, 4, 2, 2, 2, 0, 0, 4, 4, 3, 3, 3, 3, 6 },
|
||||
/*02*/{ 3, 5, 2, 42, 4, 7, 4, 2, 2, 2, 2, 2, 0, 0, 5, 5, 5, -1, 11 },
|
||||
/*03*/{ 4, 6, 3, 44, 3, 7, 4, 2, 2, 2, 3, 3, 0, 0, 5, 5, 5, 5, 12 },
|
||||
/*04*/{ 3, 5, 2, 64, 2, 17, 4, 8, 6, 6, 12, 12, 2, 2, 7, 7, 7, -1, 20 },
|
||||
/*05*/{ 3, 5, 2, 74, 2, 20, 4, 8, 8, 8, 16, 16, 2, 2, 7, 7, 7, -1, 26 },
|
||||
/*06*/{ 3, 5, 2, 50, 2, 12, 4, 6, 4, 4, 8, 8, 2, 2, 6, 6, 6, -1, 17 },
|
||||
/*07*/{ 3, 5, 1, 98, 1, 23, 4, 10, 10, 10, 18, 18, 2, 2, 8, 8, 8, -1, 28 },
|
||||
/*08*/{ 3, 5, 2, 74, 2, 20, 4, 8, 8, 8, 16, 16, 2, 2, 7, 7, 7, -1, 26 },
|
||||
/*09*/{ 3, 5, 2, 74, 2, 21, 3, 10, 10, 8, 20, 20, 0, 0, 7, 7, 7, -1, 24 },
|
||||
/*10*/{ 3, 5, 1, 80, 1, 23, 3, 12, 12, 10, 22, 22, 0, 0, 7, 7, 7, -1, 27 },
|
||||
/*11*/{ 3, 5, 2, 64, 2, 18, 3, 8, 8, 6, 12, 12, 0, 0, 7, 7, 7, -1, 18 },
|
||||
/*12*/{ 3, 5, 2, 44, 2, 11, 3, 4, 4, 4, 6, 6, 2, 2, 5, 5, 5, -1, 10 },
|
||||
/*13*/{ 3, 5, 2, 50, 2, 14, 3, 6, 6, 4, 8, 8, 0, 0, 6, 6, 6, -1, 14 },
|
||||
/*14*/{ 4, 6, 3, 36, 3, 11, 4, 4, 4, 2, 4, 4, 2, 2, 5, 5, 5, 5, 11 },
|
||||
/*15*/{ 4, 6, 3, 36, 3, 11, 3, 4, 4, 4, 4, 4, 2, 2, 5, 5, 5, 5, 10 },
|
||||
/*16*/{ 3, 5, 2, 74, 2, 21, 4, 10, 8, 8, 18, 18, 2, 2, 7, 7, 7, -1, 26 },
|
||||
/*17*/{ 3, 5, 2, 74, 2, 21, 3, 10, 10, 8, 20, 20, 2, 2, 7, 7, 7, -1, 23 },
|
||||
/*18*/{ 4, 6, 3, 32, 3, 8, 3, 4, 2, 2, 4, 4, 2, 2, 5, 5, 5, 5, 9 },
|
||||
/*19*/{ 4, 6, 3, 24, 4, 6, 3, 4, 4, 4, 2, 2, 0, 0, 4, 4, 4, 4, 9 },
|
||||
/*20*/{ 4, 7, 3, 38, 4, 14, 5, 6, 4, 4, 4, 4, 6, 6, 5, 5, 5, 5, 17 },
|
||||
/*21*/{ 4, 6, 3, 40, 3, 15, 3, 8, 6, 6, 6, 6, 4, 4, 5, 5, 5, 5, 15 },
|
||||
/*22*/{ 4, 7, 3, 36, 4, 11, 3, 6, 6, 4, 4, 4, 2, 2, 5, 5, 5, 5, 11 },
|
||||
/*23*/{ 4, 6, 3, 32, 3, 11, 5, 4, 4, 2, 4, 4, 2, 2, 5, 5, 5, 5, 13 },
|
||||
/*24*/{ 4, 6, 3, 38, 3, 14, 5, 4, 4, 4, 6, 6, 4, 4, 5, 5, 5, 5, 18 },
|
||||
/*25*/{ 4, 6, 3, 22, 3, 6, 5, 2, 2, 2, 0, 0, 8, 8, 4, 4, 4, 4, 11 },
|
||||
/*26*/{ 4, 6, 3, 32, 3, 11, 5, 4, 4, 2, 4, 4, 2, 2, 5, 5, 5, 5, 13 },
|
||||
/*27*/{ 4, 6, 3, 40, 3, 14, 3, 6, 6, 4, 6, 6, 4, 4, 5, 5, 5, 5, 15 },
|
||||
/*28*/{ 4, 6, 3, 32, 3, 11, 2, 4, 4, 4, 4, 4, 0, 0, 5, 5, 5, 5, 9 },
|
||||
/*29*/{ 4, 6, 3, 40, 3, 14, 2, 6, 6, 4, 6, 6, 4, 4, 5, 5, 5, 5, 12 },
|
||||
/*30*/{ 4, 6, 3, 32, 3, 8, 2, 4, 4, 1, 2, 2, 0, 0, 4, 4, 4, 4, 7 },
|
||||
/*31*/{ 4, 7, 3, 44, 4, 18, 5, 6, 6, 6, 8, 8, 6, 6, 6, 6, 6, 6, 24 },
|
||||
/*32*/{ 4, 6, 3, 38, 3, 14, 4, 4, 4, 2, 6, 6, 4, 4, 5, 5, 5, 5, 15 },
|
||||
/*33*/{ 4, 5, 3, 44, 3, 18, 5, 8, 6, 6, 8, 8, 8, 8, 6, 6, 6, 6, 24 },
|
||||
/*34*/{ 4, 6, 3, 38, 3, 14, 4, 4, 4, 4, 6, 6, 4, 4, 5, 5, 5, 5, 16 },
|
||||
/*35*/{ 4, 7, 3, 38, 4, 14, 4, 6, 6, 6, 6, 6, 6, 6, 5, 5, 5, 5, 19 },
|
||||
/*36*/{ 4, 6, 3, 38, 3, 14, 3, 6, 6, 4, 6, 6, 6, 6, 5, 5, 5, 5, 14 },
|
||||
/*37*/{ 4, 6, 3, 38, 3, 14, 5, 6, 4, 4, 6, 6, 6, 6, 5, 5, 5, 5, 17 },
|
||||
/*38*/{ 4, 7, 3, 20, 5, 6, 4, 4, 2, 2, 0, 0, 6, 6, 4, 4, 4, 4, 9 },
|
||||
/*39*/{ 4, 7, 3, 13, 6, 3, 4, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 5 },
|
||||
/*40*/{ 4, 7, 3, 19, 5, 5, 4, 2, 2, 2, 2, 2, 0, 0, 4, 4, 4, 4, 7 },
|
||||
/*41*/{ 4, 7, 3, 17, 5, 5, 4, 2, 2, 2, 2, 2, 0, 0, 3, 3, 3, 3, 6 },
|
||||
/*42*/{ 4, 7, 3, 20, 5, 6, 5, 4, 2, 2, 0, 0, 6, 6, 4, 4, 4, 4, 12 },
|
||||
/*43*/{ 4, 7, 3, 18, 5, 5, 5, 2, 2, 2, 0, 0, 6, 6, 4, 4, 4, 4, 9 },
|
||||
/*44*/{ 4, 7, 3, 24, 5, 6, 4, 4, 2, 2, 0, 0,10,10, 4, 4, 4, 4, 11 },
|
||||
/*45*/{ 4, 7, 3, 20, 5, 6, 4, 2, 2, 2, 0, 0, 8, 8, 4, 4, 4, 4, 10 },
|
||||
/*46*/{ 4, 6, 3, 44, 3, 11, 5, 4, 4, 4, 4, 4, 2, 2, 5, 5, 5, 5, 14 },
|
||||
/*47*/{ 4, 6, 3, 36, 3, 12, 4, 4, 4, 4, 6, 6, 2, 2, 5, 5, 5, 5, 14 },
|
||||
/*48*/{ 3, 5, 2, 74, 2, 21, 3, 10, 8, 8, 20, 20, 2, 2, 4, 4, 7, -1, 24 },
|
||||
/*49*/{ 3, 5, 2, 80, 2, 24, 4, 10, 8, 8, 20, 20, 2, 2, 8, 8, 8, -1, 31 },
|
||||
/*50*/{ 3, 5, 2, 74, 2, 21, 4, 8, 8, 6, 16, 16, 4, 4, 7, 7, 7, -1, 27 },
|
||||
/*51*/{ 3, 5, 2, 80, 2, 24, 3, 12, 12, 10, 22, 22, 2, 2, 7, 7, 7, -1, 27 },
|
||||
/*52*/{ 3, 5, 2, 74, 2, 21, 3, 10, 10, 8, 20, 20, 2, 2, 7, 7, 7, -1, 24 },
|
||||
/*53*/{ 3, 5, 1, 112, 1, 27, 2, 12, 12, 12, 24, 24, 0, 0, 9, 9, 9, -1, 27 },
|
||||
/*54*/{ 3, 5, 1, 96, 1, 24, 2, 12, 12, 10, 20, 20, 0, 0, 8, 8, 8, -1, 24 },
|
||||
/*55*/{ 3, 5, 2, 80, 2, 23, 2, 10, 10, 8, 20, 20, 0, 0, 7, 7, 7, -1, 23 },
|
||||
/*56*/{ 3, 5, 2, 74, 2, 21, 2, 10, 8, 8, 16, 16, 4, 4, 7, 7, 7, -1, 20 },
|
||||
/*57*/{ 4, 6, 3, 37, 3, 12, 4, 4, 4, 2, 6, 6, 4, 4, 5, 5, 5, 5, 14 },
|
||||
/*58*/{ 4, 7, 3, 16, 5, 5, 5, 2, 2, 2, 0, 0, 4, 4, 4, 4, 4, 4, 10 },
|
||||
/*59*/{ 4, 7, 3, 11, 6, 3, 4, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 5 },
|
||||
/*60*/{ 4, 7, 3, 26, 5, 6, 4, 4, 2, 2, 2, 2, 6, 6, 4, 4, 4, 4, 12 },
|
||||
/*61*/{ 4, 7, 3, 20, 5, 6, 4, 4, 2, 2, 0, 0, 6, 6, 4, 4, 4, 4, 11 },
|
||||
/*62*/{ 4, 7, 3, 17, 5, 5, 4, 2, 2, 2, 0, 0, 6, 6, 4, 4, 4, 4, 9 },
|
||||
/*63*/{ 4, 7, 3, 7, 6, 3, 4, 0, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 4 },
|
||||
/*64*/{ 4, 6, 3, 40, 3, 15, 4, 4, 4, 4, 8, 8, 6, 6, 5, 5, 5, 5, 17 },
|
||||
/*65*/{ 4, 6, 3, 44, 3, 15, 4, 8, 8, 6, 10, 10, 2, 2, 6, 6, 6, 6, 20 },
|
||||
/*66*/{ 4, 6, 3, 38, 3, 14, 4, 4, 4, 4, 6, 6, 6, 6, 5, 5, 5, 5, 15 },
|
||||
/*67*/{ 4, 5, 3, 44, 3, 18, 5, 8, 6, 6, 8, 8, 8, 8, 6, 6, 6, 6, 24 },
|
||||
/*68*/{ 4, 6, 3, 36, 3, 9, 5, 4, 4, 2, 4, 4, 2, 2, 5, 5, 5, 5, 13 },
|
||||
/*69*/{ 3, 5, 2, 50, 2, 14, 2, 6, 6, 6, 8, 8, 0, 0, 6, 6, 6, -1, 14 },
|
||||
/*70*/{ 3, 5, 1, 136, 1, 30, 1, 8, 14, 14, 28, 28, 0, 0, 9, 9, 9, -1, 27 },
|
||||
/*71*/{ 3, 5, 1, 120, 1, 27, 5, 16, 14, 14, 28, 28, 2, 2, 9, 9, 9, -1, 43 },
|
||||
/*72*/{ 3, 5, 1, 120, 2, 21, 5, 15, 17, 15, 25, 25, 7, 7, 9, 9, 9, -1, 36 },
|
||||
/*73*/{ 3, 5, 1, 90, 3, 18, 4, 13, 15, 13, 20, 20, 6, 6, 5, 5, 5, 5, 28 },
|
||||
/*74*/{ 4, 7, 3, 6, 6, 3, 4, 2, 2, 2, 20, 20, 6, 6, 2, 2, 3, 3, 5 },
|
||||
/*75*/{ 3, 5, 1, 110, 2, 20, 4, 14, 15, 11, 26, 26, 8, 8, 7, 8, 9, -1, 34 },
|
||||
/*76*/{ 4, 7, 3, 450, 1, 99, 5, 50, 40, 40, 50, 50,25,25, 9, 9, 9, -1, 75 },
|
||||
/*77*/{ 4, 7, 3, 450, 1, 99, 5, 50, 40, 40, 50, 50,25,25, 9, 9, 9, -1, 75 },
|
||||
/*78*/{ 4, 7, 3, 450, 1, 99, 5, 50, 40, 40, 50, 50,25,25, 9, 9, 9, -1, 75 },
|
||||
/*79*/{ 4, 7, 3, 450, 1, 99, 5, 50, 40, 40, 50, 50,25,25, 9, 9, 9, -1, 75 },
|
||||
/*80*/{ 4, 7, 3, 450, 1, 99, 5, 50, 40, 40, 50, 50,25,25, 9, 9, 9, -1, 75 },
|
||||
/*81*/{ 4, 7, 3, 450, 1, 99, 5, 50, 40, 40, 50, 50,25,25, 9, 9, 9, -1, 75 },
|
||||
/*82*/{ 4, 7, 3, 450, 1, 99, 5, 50, 40, 40, 50, 50,25,25, 9, 9, 9, -1, 75 },
|
||||
/*83*/{ 4, 7, 3, 450, 1, 99, 5, 50, 40, 40, 50, 50,25,25, 9, 9, 9, -1, 75 }
|
||||
/* bs fs ta guns hull crew1 crew3 gunR carR rig2 rig4 pts */
|
||||
/* class qual crew2 gunL carL rig1 rig3 */
|
||||
};
|
||||
|
||||
struct windeffects WET[7][6] = {
|
||||
{ {9,9,9,9}, {9,9,9,9}, {9,9,9,9}, {9,9,9,9}, {9,9,9,9}, {9,9,9,9} },
|
||||
{ {3,2,2,0}, {3,2,1,0}, {3,2,1,0}, {3,2,1,0}, {2,1,0,0}, {2,1,0,0} },
|
||||
{ {1,1,1,0}, {1,1,0,0}, {1,0,0,0}, {1,0,0,0}, {1,0,0,0}, {1,0,0,0} },
|
||||
{ {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0} },
|
||||
{ {0,0,0,0}, {1,0,0,0}, {1,1,0,0}, {1,1,0,0}, {2,2,1,0}, {2,2,1,0} },
|
||||
{ {1,0,0,0}, {1,1,0,0}, {1,1,1,0}, {1,1,1,0}, {3,2,2,0}, {3,2,2,0} },
|
||||
{ {2,1,1,0}, {3,2,1,0}, {3,2,1,0}, {3,2,1,0}, {3,3,2,0}, {3,3,2,0} }
|
||||
};
|
||||
|
||||
struct Tables RigTable[11][6] = {
|
||||
{ {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,1}, {0,0,1,0} },
|
||||
{ {0,0,0,0}, {0,0,0,0}, {0,0,0,1}, {0,0,1,0}, {1,0,0,1}, {0,1,1,1} },
|
||||
{ {0,0,0,0}, {0,0,0,1}, {0,0,1,1}, {0,1,0,1}, {0,1,0,1}, {1,0,1,2} },
|
||||
{ {0,0,0,0}, {0,0,1,1}, {0,1,0,1}, {0,0,0,2}, {0,1,0,2}, {1,0,1,2} },
|
||||
{ {0,1,0,1}, {1,0,0,1}, {0,1,1,2}, {0,1,0,2}, {0,0,1,3}, {1,0,1,4} },
|
||||
{ {0,0,1,1}, {0,1,0,2}, {1,0,0,3}, {0,1,1,3}, {1,0,0,4}, {1,1,1,4} },
|
||||
{ {0,0,1,2}, {0,1,1,2}, {1,1,0,3}, {0,1,0,4}, {1,0,0,4}, {1,0,1,5} },
|
||||
{ {0,0,1,2}, {0,1,0,3}, {1,1,0,3}, {1,0,2,4}, {0,2,1,5}, {2,1,0,5} },
|
||||
{ {0,2,1,3}, {1,0,0,3}, {2,1,0,4}, {0,1,1,4}, {0,1,0,5}, {1,0,2,6} },
|
||||
{ {1,1,0,4}, {1,0,1,4}, {2,0,0,5}, {0,2,1,5}, {0,1,2,6}, {0,2,0,7} },
|
||||
{ {1,0,1,5}, {0,2,0,6}, {1,2,0,6}, {1,1,1,6}, {2,0,2,6}, {1,1,2,7} }
|
||||
};
|
||||
struct Tables HullTable[11][6] = {
|
||||
{ {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {0,0,0,0}, {1,0,0,0}, {0,1,0,0} },
|
||||
{ {0,0,0,0}, {0,0,0,0}, {0,1,0,0}, {1,1,0,0}, {1,0,1,0}, {1,0,1,1} },
|
||||
{ {0,1,0,0}, {1,0,0,0}, {1,1,0,0}, {1,0,1,0}, {1,0,1,1}, {2,1,0,0} },
|
||||
{ {0,1,1,0}, {1,0,0,0}, {1,1,1,0}, {2,0,0,1}, {2,0,1,0}, {2,2,0,0} },
|
||||
{ {0,1,1,0}, {1,0,0,1}, {2,1,0,1}, {2,2,1,0}, {3,0,1,0}, {3,1,0,0} },
|
||||
{ {1,1,1,0}, {2,0,2,1}, {2,1,1,0}, {2,2,0,0}, {3,1,0,1}, {3,1,1,0} },
|
||||
{ {1,2,2,0}, {2,0,2,1}, {2,1,0,1}, {2,2,0,0}, {3,1,1,0}, {4,2,1,0} },
|
||||
{ {2,1,1,0}, {2,0,1,1}, {3,2,2,0}, {3,2,0,0}, {4,2,1,0}, {4,2,1,1} },
|
||||
{ {2,1,2,0}, {3,1,1,1}, {3,2,2,0}, {4,2,1,0}, {4,1,0,2}, {4,2,2,0} },
|
||||
{ {2,3,1,0}, {3,2,2,0}, {3,2,2,1}, {4,2,2,0}, {4,1,0,3}, {5,1,2,0} },
|
||||
{ {2,2,4,0}, {3,3,1,1}, {4,2,1,1}, {5,1,0,2}, {5,1,2,1}, {6,2,2,0} },
|
||||
};
|
||||
|
||||
char AMMO[9][4] = {
|
||||
{ -1, 1, 0, 1 },
|
||||
{ -1, 1, 0, 1 },
|
||||
{ -1, 1, 0, 1 },
|
||||
{ -2, 1, 0, 2 },
|
||||
{ -2, 2, 0, 2 },
|
||||
{ -2, 2, 0, 2 },
|
||||
{ -3, 2, 0, 2 },
|
||||
{ -3, 2, 0, 3 },
|
||||
{ -3, 2, 0, 3 }
|
||||
};
|
||||
|
||||
char HDT[9][10] = {
|
||||
{ 1, 0,-1,-2,-3,-3,-4,-4,-4,-4 },
|
||||
{ 1, 1, 0,-1,-2,-2,-3,-3,-3,-3 },
|
||||
{ 2, 1, 0,-1,-2,-2,-3,-3,-3,-3 },
|
||||
{ 2, 2, 1, 0,-1,-1,-2,-2,-2,-2 },
|
||||
{ 3, 2, 1, 0,-1,-1,-2,-2,-2,-2 },
|
||||
{ 3, 3, 2, 1, 0, 0,-1,-1,-1,-1 },
|
||||
{ 4, 3, 2, 1, 0, 0,-1,-1,-1,-1 },
|
||||
{ 4, 4, 3, 2, 1, 1, 0, 0, 0, 0 },
|
||||
{ 5, 4, 3, 2, 1, 1, 0, 0, 0, 0 }
|
||||
};
|
||||
|
||||
char HDTrake[9][10] = {
|
||||
{ 2, 1, 0,-1,-2,-2,-3,-3,-3,-3 },
|
||||
{ 2, 2, 1, 0,-1,-1,-2,-2,-2,-2 },
|
||||
{ 3, 2, 1, 0,-1,-1,-2,-2,-2,-2 },
|
||||
{ 4, 3, 2, 1, 0, 0,-1,-1,-1,-1 },
|
||||
{ 5, 4, 3, 2, 1, 1, 0, 0, 0, 0 },
|
||||
{ 6, 5, 4, 3, 2, 2, 1, 1, 1, 1 },
|
||||
{ 7, 6, 5, 4, 3, 3, 2, 2, 2, 2 },
|
||||
{ 8, 7, 6, 5, 4, 4, 3, 3, 3, 3 },
|
||||
{ 9, 8, 7, 6, 5, 5, 4, 4, 4, 4 }
|
||||
};
|
||||
|
||||
char QUAL[9][5] = {
|
||||
{ -1, 0, 0, 1, 1 },
|
||||
{ -1, 0, 0, 1, 1 },
|
||||
{ -1, 0, 0, 1, 2 },
|
||||
{ -1, 0, 0, 1, 2 },
|
||||
{ -1, 0, 0, 2, 2 },
|
||||
{ -1,-1, 0, 2, 2 },
|
||||
{ -2,-1, 0, 2, 2 },
|
||||
{ -2,-1, 0, 2, 2 },
|
||||
{ -2,-1, 0, 2, 3 }
|
||||
};
|
||||
|
||||
char MT[9][3] = {
|
||||
{ 1, 0, 0 },
|
||||
{ 1, 1, 0 },
|
||||
{ 2, 1, 0 },
|
||||
{ 2, 1, 1 },
|
||||
{ 2, 2, 1 },
|
||||
{ 3, 2, 1 },
|
||||
{ 3, 2, 2 },
|
||||
{ 4, 3, 2 },
|
||||
{ 4, 4, 2 }
|
||||
};
|
||||
|
||||
char rangeofshot[] = {
|
||||
0,
|
||||
1, /* grape */
|
||||
3, /* chain */
|
||||
10, /* round */
|
||||
1 /* double */
|
||||
};
|
||||
|
||||
char *countryname[] = {
|
||||
"American", "British", "Spanish", "French", "Japanese",
|
||||
"Federation", "Klingon", "Orion"
|
||||
};
|
||||
|
||||
char *classname[] = {
|
||||
"Drift wood",
|
||||
"Ship of the Line",
|
||||
"Ship of the Line",
|
||||
"Frigate",
|
||||
"Corvette",
|
||||
"Sloop",
|
||||
"Brig"
|
||||
};
|
||||
|
||||
char *directionname[] = {
|
||||
"dead ahead",
|
||||
"off the starboard bow",
|
||||
"off the starboard beam",
|
||||
"off the starboard quarter",
|
||||
"dead astern",
|
||||
"off the port quarter",
|
||||
"off the port beam",
|
||||
"off the port bow",
|
||||
"dead ahead"
|
||||
};
|
||||
|
||||
char *qualname[] = { "dead", "mutinous", "green", "mundane", "crack", "elite" };
|
||||
|
||||
char loadname[] = { '-', 'G', 'C', 'R', 'D', 'E' };
|
||||
|
||||
char dr[] = { 0, 1, 1, 0, -1, -1, -1, 0, 1 };
|
||||
char dc[] = { 0, 0, -1, -1, -1, 0, 1, 1, 1 };
|
||||
99
sail/lo_main.c
Normal file
99
sail/lo_main.c
Normal file
@@ -0,0 +1,99 @@
|
||||
/* $NetBSD: lo_main.c,v 1.5 1997/10/13 19:44:24 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)lo_main.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: lo_main.c,v 1.5 1997/10/13 19:44:24 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
/*
|
||||
* Print out the top ten SAILors
|
||||
*
|
||||
* -l force a long listing (print out real usernames)
|
||||
*/
|
||||
#include <sys/types.h>
|
||||
#include <pwd.h>
|
||||
#include "extern.h"
|
||||
#include "pathnames.h"
|
||||
|
||||
char *title[] = {
|
||||
"Admiral", "Commodore", "Captain", "Captain",
|
||||
"Captain", "Captain", "Captain", "Commander",
|
||||
"Commander", "Lieutenant"
|
||||
};
|
||||
|
||||
int
|
||||
lo_main()
|
||||
{
|
||||
FILE *fp;
|
||||
char sbuf[32];
|
||||
int n = 0, people;
|
||||
struct passwd *pass;
|
||||
struct logs log;
|
||||
struct ship *ship;
|
||||
|
||||
if ((fp = fopen(_PATH_LOGFILE, "r")) == 0) {
|
||||
perror(_PATH_LOGFILE);
|
||||
exit(1);
|
||||
}
|
||||
switch (fread((char *)&people, sizeof people, 1, fp)) {
|
||||
case 0:
|
||||
printf("Nobody has sailed yet.\n");
|
||||
exit(0);
|
||||
case 1:
|
||||
break;
|
||||
default:
|
||||
perror(_PATH_LOGFILE);
|
||||
exit(1);
|
||||
}
|
||||
while (fread((char *)&log, sizeof log, 1, fp) == 1 &&
|
||||
log.l_name[0] != '\0') {
|
||||
if (longfmt && (pass = getpwuid(log.l_uid)) != NULL)
|
||||
(void) sprintf(sbuf, "%10.10s (%s)",
|
||||
log.l_name, pass->pw_name);
|
||||
else
|
||||
(void) sprintf(sbuf, "%20.20s", log.l_name);
|
||||
ship = &scene[log.l_gamenum].ship[log.l_shipnum];
|
||||
printf("%-10s %21s of the %15s %3d points, %5.2f equiv\n",
|
||||
title[n++], sbuf, ship->shipname, log.l_netpoints,
|
||||
(float) log.l_netpoints / ship->specs->pts);
|
||||
}
|
||||
printf("\n%d people have played.\n", people);
|
||||
return 0;
|
||||
}
|
||||
54
sail/machdep.h
Normal file
54
sail/machdep.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/* $NetBSD: machdep.h,v 1.4 1995/04/28 21:30:16 mycroft Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)machdep.h 8.1 (Berkeley) 5/31/93
|
||||
*/
|
||||
|
||||
#define TIMEOUT 300 /* Sync() timeout in seconds */
|
||||
|
||||
/* for POSIX systems */
|
||||
#define blockalarm() \
|
||||
do { \
|
||||
sigset_t sigset; \
|
||||
sigemptyset(&sigset); \
|
||||
sigaddset(&sigset, SIGALRM); \
|
||||
sigprocmask(SIG_BLOCK, &sigset, (sigset_t *)0); \
|
||||
} while (0)
|
||||
#define unblockalarm() \
|
||||
do { \
|
||||
sigset_t sigset; \
|
||||
sigemptyset(&sigset); \
|
||||
sigaddset(&sigset, SIGALRM); \
|
||||
sigprocmask(SIG_UNBLOCK, &sigset, (sigset_t *)0); \
|
||||
} while (0)
|
||||
123
sail/main.c
Normal file
123
sail/main.c
Normal file
@@ -0,0 +1,123 @@
|
||||
/* $NetBSD: main.c,v 1.6 1997/10/13 21:03:55 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
__COPYRIGHT("@(#) Copyright (c) 1983, 1993\n\
|
||||
The Regents of the University of California. All rights reserved.\n");
|
||||
#endif /* not lint */
|
||||
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)main.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: main.c,v 1.6 1997/10/13 21:03:55 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
int main __P((int, char **));
|
||||
|
||||
/*ARGSUSED*/
|
||||
int
|
||||
main(argc, argv)
|
||||
int argc __attribute__((unused));
|
||||
char **argv;
|
||||
{
|
||||
char *p;
|
||||
int i;
|
||||
|
||||
gid = getgid();
|
||||
egid = getegid();
|
||||
setegid(gid);
|
||||
|
||||
(void) srand(getpid());
|
||||
if ((p = strrchr(*argv, '/')) != NULL)
|
||||
p++;
|
||||
else
|
||||
p = *argv;
|
||||
if (strcmp(p, "driver") == 0 || strcmp(p, "saildriver") == 0)
|
||||
mode = MODE_DRIVER;
|
||||
else if (strcmp(p, "sail.log") == 0)
|
||||
mode = MODE_LOGGER;
|
||||
else
|
||||
mode = MODE_PLAYER;
|
||||
while ((p = *++argv) && *p == '-')
|
||||
switch (p[1]) {
|
||||
case 'd':
|
||||
mode = MODE_DRIVER;
|
||||
break;
|
||||
case 's':
|
||||
mode = MODE_LOGGER;
|
||||
break;
|
||||
case 'D':
|
||||
debug++;
|
||||
break;
|
||||
case 'x':
|
||||
randomize++;
|
||||
break;
|
||||
case 'l':
|
||||
longfmt++;
|
||||
break;
|
||||
case 'b':
|
||||
nobells++;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "SAIL: Unknown flag %s.\n", p);
|
||||
exit(1);
|
||||
}
|
||||
if (*argv)
|
||||
game = atoi(*argv);
|
||||
else
|
||||
game = -1;
|
||||
if ((i = setjmp(restart)) != 0)
|
||||
mode = i;
|
||||
switch (mode) {
|
||||
case MODE_PLAYER:
|
||||
return pl_main();
|
||||
case MODE_DRIVER:
|
||||
return dr_main();
|
||||
case MODE_LOGGER:
|
||||
return lo_main();
|
||||
default:
|
||||
fprintf(stderr, "SAIL: Unknown mode %d.\n", mode);
|
||||
abort();
|
||||
}
|
||||
/*NOTREACHED*/
|
||||
}
|
||||
253
sail/misc.c
Normal file
253
sail/misc.c
Normal file
@@ -0,0 +1,253 @@
|
||||
/* $NetBSD: misc.c,v 1.5 1997/10/13 19:44:38 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)misc.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: misc.c,v 1.5 1997/10/13 19:44:38 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <stdlib.h>
|
||||
#include <sys/file.h>
|
||||
#include <unistd.h>
|
||||
#include "extern.h"
|
||||
#include "pathnames.h"
|
||||
|
||||
#define distance(x,y) (abs(x) >= abs(y) ? abs(x) + abs(y)/2 : abs(y) + abs(x)/2)
|
||||
|
||||
/* XXX */
|
||||
int
|
||||
range(from, to)
|
||||
struct ship *from, *to;
|
||||
{
|
||||
int bow1r, bow1c, bow2r, bow2c;
|
||||
int stern1r, stern1c, stern2c, stern2r;
|
||||
int bb, bs, sb, ss, result;
|
||||
|
||||
if (!to->file->dir)
|
||||
return -1;
|
||||
stern1r = bow1r = from->file->row;
|
||||
stern1c = bow1c = from->file->col;
|
||||
stern2r = bow2r = to->file->row;
|
||||
stern2c = bow2c = to->file->col;
|
||||
result = bb = distance(bow2r - bow1r, bow2c - bow1c);
|
||||
if (bb < 5) {
|
||||
stern2r += dr[to->file->dir];
|
||||
stern2c += dc[to->file->dir];
|
||||
stern1r += dr[from->file->dir];
|
||||
stern1c += dc[from->file->dir];
|
||||
bs = distance((bow2r - stern1r), (bow2c - stern1c));
|
||||
sb = distance((bow1r - stern2r), (bow1c - stern2c));
|
||||
ss = distance((stern2r - stern1r) ,(stern2c - stern1c));
|
||||
result = min(bb, min(bs, min(sb, ss)));
|
||||
}
|
||||
return result;
|
||||
}
|
||||
|
||||
struct ship *
|
||||
closestenemy(from, side, anyship)
|
||||
struct ship *from;
|
||||
char side, anyship;
|
||||
{
|
||||
struct ship *sp;
|
||||
char a;
|
||||
int olddist = 30000, dist;
|
||||
struct ship *closest = 0;
|
||||
|
||||
a = capship(from)->nationality;
|
||||
foreachship(sp) {
|
||||
if (sp == from)
|
||||
continue;
|
||||
if (sp->file->dir == 0)
|
||||
continue;
|
||||
if (a == capship(sp)->nationality && !anyship)
|
||||
continue;
|
||||
if (side && gunsbear(from, sp) != side)
|
||||
continue;
|
||||
dist = range(from, sp);
|
||||
if (dist < olddist) {
|
||||
closest = sp;
|
||||
olddist = dist;
|
||||
}
|
||||
}
|
||||
return closest;
|
||||
}
|
||||
|
||||
int
|
||||
angle(dr, dc)
|
||||
int dr, dc;
|
||||
{
|
||||
int i;
|
||||
|
||||
if (dc >= 0 && dr > 0)
|
||||
i = 0;
|
||||
else if (dr <= 0 && dc > 0)
|
||||
i = 2;
|
||||
else if (dc <= 0 && dr < 0)
|
||||
i = 4;
|
||||
else
|
||||
i = 6;
|
||||
dr = abs(dr);
|
||||
dc = abs(dc);
|
||||
if ((i == 0 || i == 4) && dc * 2.4 > dr) {
|
||||
i++;
|
||||
if (dc > dr * 2.4)
|
||||
i++;
|
||||
} else if ((i == 2 || i == 6) && dr * 2.4 > dc) {
|
||||
i++;
|
||||
if (dr > dc * 2.4)
|
||||
i++;
|
||||
}
|
||||
return i % 8 + 1;
|
||||
}
|
||||
|
||||
int
|
||||
gunsbear(from, to) /* checks for target bow or stern */
|
||||
struct ship *from, *to;
|
||||
{
|
||||
int Dr, Dc, i;
|
||||
int ang;
|
||||
|
||||
Dr = from->file->row - to->file->row;
|
||||
Dc = to->file->col - from->file->col;
|
||||
for (i = 2; i; i--) {
|
||||
if ((ang = angle(Dr, Dc) - from->file->dir + 1) < 1)
|
||||
ang += 8;
|
||||
if (ang >= 2 && ang <= 4)
|
||||
return 'r';
|
||||
if (ang >= 6 && ang <= 7)
|
||||
return 'l';
|
||||
Dr += dr[to->file->dir];
|
||||
Dc += dc[to->file->dir];
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
portside(from, on, quick)
|
||||
struct ship *from, *on;
|
||||
int quick; /* returns true if fromship is */
|
||||
{ /* shooting at onship's starboard side */
|
||||
int ang;
|
||||
int Dr, Dc;
|
||||
|
||||
Dr = from->file->row - on->file->row;
|
||||
Dc = on->file->col - from->file->col;
|
||||
if (quick == -1) {
|
||||
Dr += dr[on->file->dir];
|
||||
Dc += dc[on->file->dir];
|
||||
}
|
||||
ang = angle(Dr, Dc);
|
||||
if (quick != 0)
|
||||
return ang;
|
||||
ang = (ang + 4 - on->file->dir - 1) % 8 + 1;
|
||||
return ang < 5;
|
||||
}
|
||||
|
||||
int
|
||||
colours(sp)
|
||||
struct ship *sp;
|
||||
{
|
||||
char flag = '\0';
|
||||
|
||||
if (sp->file->struck)
|
||||
flag = '!';
|
||||
if (sp->file->explode)
|
||||
flag = '#';
|
||||
if (sp->file->sink)
|
||||
flag = '~';
|
||||
if (sp->file->struck)
|
||||
return flag;
|
||||
flag = *countryname[capship(sp)->nationality];
|
||||
return sp->file->FS ? flag : tolower(flag);
|
||||
}
|
||||
|
||||
void
|
||||
logger(s)
|
||||
struct ship *s;
|
||||
{
|
||||
FILE *fp;
|
||||
int persons;
|
||||
int n;
|
||||
struct logs log[NLOG];
|
||||
float net;
|
||||
struct logs *lp;
|
||||
|
||||
setegid(egid);
|
||||
if ((fp = fopen(_PATH_LOGFILE, "r+")) == NULL) {
|
||||
setegid(gid);
|
||||
return;
|
||||
}
|
||||
setegid(gid);
|
||||
#ifdef LOCK_EX
|
||||
if (flock(fileno(fp), LOCK_EX) < 0)
|
||||
return;
|
||||
#endif
|
||||
net = (float)s->file->points / s->specs->pts;
|
||||
persons = getw(fp);
|
||||
n = fread((char *)log, sizeof(struct logs), NLOG, fp);
|
||||
for (lp = &log[n]; lp < &log[NLOG]; lp++)
|
||||
lp->l_name[0] = lp->l_uid = lp->l_shipnum
|
||||
= lp->l_gamenum = lp->l_netpoints = 0;
|
||||
rewind(fp);
|
||||
if (persons < 0)
|
||||
(void) putw(1, fp);
|
||||
else
|
||||
(void) putw(persons + 1, fp);
|
||||
for (lp = log; lp < &log[NLOG]; lp++)
|
||||
if (net > (float)lp->l_netpoints
|
||||
/ scene[lp->l_gamenum].ship[lp->l_shipnum].specs->pts) {
|
||||
(void) fwrite((char *)log,
|
||||
sizeof (struct logs), lp - log, fp);
|
||||
(void) strcpy(log[NLOG-1].l_name, s->file->captain);
|
||||
log[NLOG-1].l_uid = getuid();
|
||||
log[NLOG-1].l_shipnum = s->file->index;
|
||||
log[NLOG-1].l_gamenum = game;
|
||||
log[NLOG-1].l_netpoints = s->file->points;
|
||||
(void) fwrite((char *)&log[NLOG-1],
|
||||
sizeof (struct logs), 1, fp);
|
||||
(void) fwrite((char *)lp,
|
||||
sizeof (struct logs), &log[NLOG-1] - lp, fp);
|
||||
break;
|
||||
}
|
||||
#ifdef LOCK_EX
|
||||
(void) flock(fileno(fp), LOCK_UN);
|
||||
#endif
|
||||
(void) fclose(fp);
|
||||
}
|
||||
86
sail/parties.c
Normal file
86
sail/parties.c
Normal file
@@ -0,0 +1,86 @@
|
||||
/* $NetBSD: parties.c,v 1.5 1997/10/13 19:44:47 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)parties.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: parties.c,v 1.5 1997/10/13 19:44:47 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "extern.h"
|
||||
|
||||
int
|
||||
meleeing(from, to)
|
||||
struct ship *from;
|
||||
struct ship *to;
|
||||
{
|
||||
struct BP *p = from->file->OBP;
|
||||
struct BP *q = p + NBP;
|
||||
|
||||
for (; p < q; p++)
|
||||
if (p->turnsent && p->toship == to)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
boarding(from, isdefense)
|
||||
struct ship *from;
|
||||
char isdefense;
|
||||
{
|
||||
struct BP *p = isdefense ? from->file->DBP : from->file->OBP;
|
||||
struct BP *q = p + NBP;
|
||||
|
||||
for (; p < q; p++)
|
||||
if (p->turnsent)
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
unboard(ship, to, isdefense)
|
||||
struct ship *ship, *to;
|
||||
char isdefense;
|
||||
{
|
||||
struct BP *p = isdefense ? ship->file->DBP : ship->file->OBP;
|
||||
int n;
|
||||
|
||||
for (n = 0; n < NBP; p++, n++)
|
||||
if (p->turnsent && (p->toship == to || isdefense || ship == to))
|
||||
Write(isdefense ? W_DBP : W_OBP, ship, 0, n, 0, 0, 0);
|
||||
}
|
||||
40
sail/pathnames.h.in
Normal file
40
sail/pathnames.h.in
Normal file
@@ -0,0 +1,40 @@
|
||||
/* $NetBSD: pathnames.h,v 1.3 1995/04/22 10:37:06 cgd Exp $ */
|
||||
|
||||
/*-
|
||||
* Copyright (c) 1990, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)pathnames.h 8.1 (Berkeley) 5/31/93
|
||||
*/
|
||||
|
||||
#define _PATH_LOGFILE "@sail_scorefile@"
|
||||
#define _PATH_SYNC "@sail_dir@/#sailsink.%d"
|
||||
#define _PATH_LOCK "@sail_dir@/#saillock.%d"
|
||||
145
sail/pl_1.c
Normal file
145
sail/pl_1.c
Normal file
@@ -0,0 +1,145 @@
|
||||
/* $NetBSD: pl_1.c,v 1.5 1997/10/13 21:04:02 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)pl_1.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: pl_1.c,v 1.5 1997/10/13 21:04:02 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "player.h"
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/*
|
||||
* If we get here before a ship is chosen, then ms == 0 and
|
||||
* we don't want to update the score file, or do any Write's either.
|
||||
* We can assume the sync file is already created and may need
|
||||
* to be removed.
|
||||
* Of course, we don't do any more Sync()'s if we got here
|
||||
* because of a Sync() failure.
|
||||
*/
|
||||
void
|
||||
leave(conditions)
|
||||
int conditions;
|
||||
{
|
||||
(void) signal(SIGHUP, SIG_IGN);
|
||||
(void) signal(SIGINT, SIG_IGN);
|
||||
(void) signal(SIGQUIT, SIG_IGN);
|
||||
(void) signal(SIGALRM, SIG_IGN);
|
||||
(void) signal(SIGCHLD, SIG_IGN);
|
||||
|
||||
if (done_curses) {
|
||||
Msg("It looks like you've had it!");
|
||||
switch (conditions) {
|
||||
case LEAVE_QUIT:
|
||||
break;
|
||||
case LEAVE_CAPTURED:
|
||||
Msg("Your ship was captured.");
|
||||
break;
|
||||
case LEAVE_HURRICAN:
|
||||
Msg("Hurricane! All ships destroyed.");
|
||||
break;
|
||||
case LEAVE_DRIVER:
|
||||
Msg("The driver died.");
|
||||
break;
|
||||
case LEAVE_SYNC:
|
||||
Msg("Synchronization error.");
|
||||
break;
|
||||
default:
|
||||
Msg("A funny thing happened (%d).", conditions);
|
||||
}
|
||||
} else {
|
||||
switch (conditions) {
|
||||
case LEAVE_QUIT:
|
||||
break;
|
||||
case LEAVE_DRIVER:
|
||||
printf("The driver died.\n");
|
||||
break;
|
||||
case LEAVE_FORK:
|
||||
perror("fork");
|
||||
break;
|
||||
case LEAVE_SYNC:
|
||||
printf("Synchronization error\n.");
|
||||
break;
|
||||
default:
|
||||
printf("A funny thing happened (%d).\n",
|
||||
conditions);
|
||||
}
|
||||
}
|
||||
|
||||
if (ms != 0) {
|
||||
logger(ms);
|
||||
if (conditions != LEAVE_SYNC) {
|
||||
makemsg(ms, "Captain %s relinquishing.",
|
||||
mf->captain);
|
||||
Write(W_END, ms, 0, 0, 0, 0, 0);
|
||||
(void) Sync();
|
||||
}
|
||||
}
|
||||
sync_close(!hasdriver);
|
||||
sleep(5);
|
||||
cleanupscreen();
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/*ARGSUSED*/
|
||||
void
|
||||
choke(n)
|
||||
int n __attribute__((unused));
|
||||
{
|
||||
leave(LEAVE_QUIT);
|
||||
}
|
||||
|
||||
/*ARGSUSED*/
|
||||
void
|
||||
child(n)
|
||||
int n __attribute__((unused));
|
||||
{
|
||||
union wait status;
|
||||
int pid;
|
||||
|
||||
(void) signal(SIGCHLD, SIG_IGN);
|
||||
do {
|
||||
pid = wait3((int *)&status, WNOHANG, (struct rusage *)0);
|
||||
if (pid < 0 || (pid > 0 && !WIFSTOPPED(status)))
|
||||
hasdriver = 0;
|
||||
} while (pid > 0);
|
||||
(void) signal(SIGCHLD, child);
|
||||
}
|
||||
162
sail/pl_2.c
Normal file
162
sail/pl_2.c
Normal file
@@ -0,0 +1,162 @@
|
||||
/* $NetBSD: pl_2.c,v 1.4 1997/10/13 19:45:01 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)pl_2.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: pl_2.c,v 1.4 1997/10/13 19:45:01 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "player.h"
|
||||
|
||||
void
|
||||
play()
|
||||
{
|
||||
struct ship *sp;
|
||||
|
||||
for (;;) {
|
||||
switch (sgetch("~\b", (struct ship *)0, 0)) {
|
||||
case 'm':
|
||||
acceptmove();
|
||||
break;
|
||||
case 's':
|
||||
acceptsignal();
|
||||
break;
|
||||
case 'g':
|
||||
grapungrap();
|
||||
break;
|
||||
case 'u':
|
||||
unfoulplayer();
|
||||
break;
|
||||
case 'v':
|
||||
Msg("%s", version);
|
||||
break;
|
||||
case 'b':
|
||||
acceptboard();
|
||||
break;
|
||||
case 'f':
|
||||
acceptcombat();
|
||||
break;
|
||||
case 'l':
|
||||
loadplayer();
|
||||
break;
|
||||
case 'c':
|
||||
changesail();
|
||||
break;
|
||||
case 'r':
|
||||
repair();
|
||||
break;
|
||||
case 'B':
|
||||
Msg("'Hands to stations!'");
|
||||
unboard(ms, ms, 1); /* cancel DBP's */
|
||||
unboard(ms, ms, 0); /* cancel offense */
|
||||
break;
|
||||
case '\f':
|
||||
centerview();
|
||||
blockalarm();
|
||||
draw_board();
|
||||
draw_screen();
|
||||
unblockalarm();
|
||||
break;
|
||||
case 'L':
|
||||
mf->loadL = L_EMPTY;
|
||||
mf->loadR = L_EMPTY;
|
||||
mf->readyL = R_EMPTY;
|
||||
mf->readyR = R_EMPTY;
|
||||
Msg("Broadsides unloaded");
|
||||
break;
|
||||
case 'q':
|
||||
Msg("Type 'Q' to quit");
|
||||
break;
|
||||
case 'Q':
|
||||
leave(LEAVE_QUIT);
|
||||
break;
|
||||
case 'I':
|
||||
foreachship(sp)
|
||||
if (sp != ms)
|
||||
eyeball(sp);
|
||||
break;
|
||||
case 'i':
|
||||
if ((sp = closestenemy(ms, 0, 1)) == 0)
|
||||
Msg("No more ships left.");
|
||||
else
|
||||
eyeball(sp);
|
||||
break;
|
||||
case 'C':
|
||||
centerview();
|
||||
blockalarm();
|
||||
draw_view();
|
||||
unblockalarm();
|
||||
break;
|
||||
case 'U':
|
||||
upview();
|
||||
blockalarm();
|
||||
draw_view();
|
||||
unblockalarm();
|
||||
break;
|
||||
case 'D':
|
||||
case 'N':
|
||||
downview();
|
||||
blockalarm();
|
||||
draw_view();
|
||||
unblockalarm();
|
||||
break;
|
||||
case 'H':
|
||||
leftview();
|
||||
blockalarm();
|
||||
draw_view();
|
||||
unblockalarm();
|
||||
break;
|
||||
case 'J':
|
||||
rightview();
|
||||
blockalarm();
|
||||
draw_view();
|
||||
unblockalarm();
|
||||
break;
|
||||
case 'F':
|
||||
lookout();
|
||||
break;
|
||||
case 'S':
|
||||
dont_adjust = !dont_adjust;
|
||||
blockalarm();
|
||||
draw_turn();
|
||||
unblockalarm();
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
281
sail/pl_3.c
Normal file
281
sail/pl_3.c
Normal file
@@ -0,0 +1,281 @@
|
||||
/* $NetBSD: pl_3.c,v 1.6 1998/08/30 09:19:40 veego Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)pl_3.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: pl_3.c,v 1.6 1998/08/30 09:19:40 veego Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "player.h"
|
||||
#include <stdlib.h>
|
||||
|
||||
void
|
||||
acceptcombat()
|
||||
{
|
||||
int men = 0;
|
||||
int target, temp;
|
||||
int n, r;
|
||||
int index, rakehim, sternrake;
|
||||
int hhits = 0, ghits = 0, rhits = 0, chits = 0;
|
||||
int crew[3];
|
||||
int load;
|
||||
int guns, car, ready, shootat, hit;
|
||||
int roll;
|
||||
struct ship *closest;
|
||||
|
||||
crew[0] = mc->crew1;
|
||||
crew[1] = mc->crew2;
|
||||
crew[2] = mc->crew3;
|
||||
for (n = 0; n < 3; n++) {
|
||||
if (mf->OBP[n].turnsent)
|
||||
men += mf->OBP[n].mensent;
|
||||
}
|
||||
for (n = 0; n < 3; n++) {
|
||||
if (mf->DBP[n].turnsent)
|
||||
men += mf->DBP[n].mensent;
|
||||
}
|
||||
if (men) {
|
||||
crew[0] = men/100 ? 0 : crew[0] != 0;
|
||||
crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
|
||||
crew[2] = men%10 ? 0 : crew[2] != 0;
|
||||
}
|
||||
for (r = 0; r < 2; r++) {
|
||||
if (r) {
|
||||
ready = mf->readyR;
|
||||
load = mf->loadR;
|
||||
guns = mc->gunR;
|
||||
car = mc->carR;
|
||||
} else {
|
||||
ready = mf->readyL;
|
||||
load = mf->loadL;
|
||||
guns = mc->gunL;
|
||||
car = mc->carL;
|
||||
}
|
||||
if ((!guns && !car) || load == L_EMPTY || (ready & R_LOADED) == 0)
|
||||
goto cant;
|
||||
if (mf->struck || !crew[2])
|
||||
goto cant;
|
||||
closest = closestenemy(ms, (r ? 'r' : 'l'), 1);
|
||||
if (closest == 0)
|
||||
goto cant;
|
||||
if (closest->file->struck)
|
||||
goto cant;
|
||||
target = range(ms, closest);
|
||||
if (target > rangeofshot[load] || (!guns && target >= 3))
|
||||
goto cant;
|
||||
Signal("$$ within range of %s broadside.",
|
||||
closest, r ? "right" : "left");
|
||||
if (load > L_CHAIN && target < 6) {
|
||||
switch (sgetch("Aim for hull or rigging? ",
|
||||
(struct ship *)0, 1)) {
|
||||
case 'r':
|
||||
shootat = RIGGING;
|
||||
break;
|
||||
case 'h':
|
||||
shootat = HULL;
|
||||
break;
|
||||
default:
|
||||
shootat = -1;
|
||||
Msg("'Avast there! Hold your fire.'");
|
||||
}
|
||||
} else {
|
||||
if (sgetch("Fire? ", (struct ship *)0, 1) == 'n') {
|
||||
shootat = -1;
|
||||
Msg("Belay that! Hold your fire.");
|
||||
} else
|
||||
shootat = RIGGING;
|
||||
}
|
||||
if (shootat == -1)
|
||||
continue;
|
||||
fired = 1;
|
||||
rakehim = gunsbear(ms, closest) && !gunsbear(closest, ms);
|
||||
temp = portside(closest, ms, 1) - closest->file->dir + 1;
|
||||
if (temp < 1)
|
||||
temp += 8;
|
||||
else if (temp > 8)
|
||||
temp -= 8;
|
||||
sternrake = temp > 4 && temp < 6;
|
||||
if (rakehim) {
|
||||
if (!sternrake)
|
||||
Msg("Raking the %s!", closest->shipname);
|
||||
else
|
||||
Msg("Stern Rake! %s splintering!",
|
||||
closest->shipname);
|
||||
}
|
||||
index = guns;
|
||||
if (target < 3)
|
||||
index += car;
|
||||
index = (index - 1)/3;
|
||||
index = index > 8 ? 8 : index;
|
||||
if (!rakehim)
|
||||
hit = HDT[index][target-1];
|
||||
else
|
||||
hit = HDTrake[index][target-1];
|
||||
if (rakehim && sternrake)
|
||||
hit++;
|
||||
hit += QUAL[index][mc->qual-1];
|
||||
for (n = 0; n < 3 && mf->captured == 0; n++)
|
||||
if (!crew[n]) {
|
||||
if (index <= 5)
|
||||
hit--;
|
||||
else
|
||||
hit -= 2;
|
||||
}
|
||||
if (ready & R_INITIAL) {
|
||||
if (index <= 3)
|
||||
hit++;
|
||||
else
|
||||
hit += 2;
|
||||
}
|
||||
if (mf->captured != 0) {
|
||||
if (index <= 1)
|
||||
hit--;
|
||||
else
|
||||
hit -= 2;
|
||||
}
|
||||
hit += AMMO[index][load - 1];
|
||||
if (((temp = mc->class) >= 5 || temp == 1) && windspeed == 5)
|
||||
hit--;
|
||||
if (windspeed == 6 && temp == 4)
|
||||
hit -= 2;
|
||||
if (windspeed == 6 && temp <= 3)
|
||||
hit--;
|
||||
if (hit >= 0) {
|
||||
roll = die();
|
||||
if (load == L_GRAPE)
|
||||
chits = hit;
|
||||
else {
|
||||
struct Tables *t;
|
||||
if (hit > 10)
|
||||
hit = 10;
|
||||
t = &(shootat == RIGGING ? RigTable : HullTable)
|
||||
[hit][roll-1];
|
||||
chits = t->C;
|
||||
rhits = t->R;
|
||||
hhits = t->H;
|
||||
ghits = t->G;
|
||||
if (closest->file->FS)
|
||||
rhits *= 2;
|
||||
if (load == L_CHAIN) {
|
||||
ghits = 0;
|
||||
hhits = 0;
|
||||
}
|
||||
}
|
||||
table(shootat, load, hit, closest, ms, roll);
|
||||
}
|
||||
Msg("Damage inflicted on the %s:", closest->shipname);
|
||||
Msg("\t%d HULL, %d GUNS, %d CREW, %d RIGGING",
|
||||
hhits, ghits, chits, rhits);
|
||||
if (!r) {
|
||||
mf->loadL = L_EMPTY;
|
||||
mf->readyL = R_EMPTY;
|
||||
} else {
|
||||
mf->loadR = L_EMPTY;
|
||||
mf->readyR = R_EMPTY;
|
||||
}
|
||||
continue;
|
||||
cant:
|
||||
Msg("Unable to fire %s broadside", r ? "right" : "left");
|
||||
}
|
||||
blockalarm();
|
||||
draw_stat();
|
||||
unblockalarm();
|
||||
}
|
||||
|
||||
void
|
||||
grapungrap()
|
||||
{
|
||||
struct ship *sp;
|
||||
int i;
|
||||
|
||||
foreachship(sp) {
|
||||
if (sp == ms || sp->file->dir == 0)
|
||||
continue;
|
||||
if (range(ms, sp) > 1 && !grappled2(ms, sp))
|
||||
continue;
|
||||
switch (sgetch("Attempt to grapple or ungrapple $$: ",
|
||||
sp, 1)) {
|
||||
case 'g':
|
||||
if (die() < 3
|
||||
|| ms->nationality == capship(sp)->nationality) {
|
||||
Write(W_GRAP, ms, 0, sp->file->index, 0, 0, 0);
|
||||
Write(W_GRAP, sp, 0, player, 0, 0, 0);
|
||||
Msg("Attempt succeeds!");
|
||||
makesignal(ms, "grappled with $$", sp);
|
||||
} else
|
||||
Msg("Attempt fails.");
|
||||
break;
|
||||
case 'u':
|
||||
for (i = grappled2(ms, sp); --i >= 0;) {
|
||||
if (ms->nationality
|
||||
== capship(sp)->nationality
|
||||
|| die() < 3) {
|
||||
cleangrapple(ms, sp, 0);
|
||||
Msg("Attempt succeeds!");
|
||||
makesignal(ms, "ungrappling with $$",
|
||||
sp);
|
||||
} else
|
||||
Msg("Attempt fails.");
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
unfoulplayer()
|
||||
{
|
||||
struct ship *to;
|
||||
int i;
|
||||
|
||||
foreachship(to) {
|
||||
if (fouled2(ms, to) == 0)
|
||||
continue;
|
||||
if (sgetch("Attempt to unfoul with the $$? ", to, 1) != 'y')
|
||||
continue;
|
||||
for (i = fouled2(ms, to); --i >= 0;) {
|
||||
if (die() <= 2) {
|
||||
cleanfoul(ms, to, 0);
|
||||
Msg("Attempt succeeds!");
|
||||
makesignal(ms, "Unfouling $$", to);
|
||||
} else
|
||||
Msg("Attempt fails.");
|
||||
}
|
||||
}
|
||||
}
|
||||
140
sail/pl_4.c
Normal file
140
sail/pl_4.c
Normal file
@@ -0,0 +1,140 @@
|
||||
/* $NetBSD: pl_4.c,v 1.6 1997/10/13 21:04:17 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)pl_4.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: pl_4.c,v 1.6 1997/10/13 21:04:17 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "player.h"
|
||||
|
||||
void
|
||||
changesail()
|
||||
{
|
||||
int rig, full;
|
||||
|
||||
rig = mc->rig1;
|
||||
full = mf->FS;
|
||||
if (windspeed == 6 || (windspeed == 5 && mc->class > 4))
|
||||
rig = 0;
|
||||
if (mc->crew3 && rig) {
|
||||
if (!full) {
|
||||
if (sgetch("Increase to Full sails? ",
|
||||
(struct ship *)0, 1) == 'y') {
|
||||
changed = 1;
|
||||
Write(W_FS, ms, 0, 1, 0, 0, 0);
|
||||
}
|
||||
} else {
|
||||
if (sgetch("Reduce to Battle sails? ",
|
||||
(struct ship *)0, 1) == 'y') {
|
||||
Write(W_FS, ms, 0, 0, 0, 0, 0);
|
||||
changed = 1;
|
||||
}
|
||||
}
|
||||
} else if (!rig)
|
||||
Msg("Sails rent to pieces");
|
||||
}
|
||||
|
||||
void
|
||||
acceptsignal()
|
||||
{
|
||||
char buf[60];
|
||||
char *p = buf;
|
||||
|
||||
*p++ = '"';
|
||||
sgetstr("Message? ", p, sizeof buf - 2);
|
||||
while (*p++)
|
||||
;
|
||||
p[-1] = '"';
|
||||
*p = 0;
|
||||
Write(W_SIGNAL, ms, 1, (long)buf, 0, 0, 0);
|
||||
}
|
||||
|
||||
void
|
||||
lookout()
|
||||
{
|
||||
struct ship *sp;
|
||||
char buf[3];
|
||||
char c;
|
||||
|
||||
sgetstr("What ship? ", buf, sizeof buf);
|
||||
foreachship(sp) {
|
||||
c = *countryname[sp->nationality];
|
||||
if ((c == *buf || tolower(c) == *buf || colours(sp) == *buf)
|
||||
&& (sp->file->stern == buf[1] || sterncolour(sp) == buf[1]
|
||||
|| buf[1] == '?')) {
|
||||
eyeball(sp);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
char *
|
||||
saywhat(sp, flag)
|
||||
struct ship *sp;
|
||||
char flag;
|
||||
{
|
||||
if (sp->file->captain[0])
|
||||
return sp->file->captain;
|
||||
else if (sp->file->struck)
|
||||
return "(struck)";
|
||||
else if (sp->file->captured != 0)
|
||||
return "(captured)";
|
||||
else if (flag)
|
||||
return "(available)";
|
||||
else
|
||||
return "(computer)";
|
||||
}
|
||||
|
||||
void
|
||||
eyeball(ship)
|
||||
struct ship *ship;
|
||||
{
|
||||
int i;
|
||||
|
||||
if (ship->file->dir != 0) {
|
||||
Msg("Sail ho! (range %d, %s)",
|
||||
range(ms, ship), saywhat(ship, 0));
|
||||
i = portside(ms, ship, 1) - mf->dir;
|
||||
if (i <= 0)
|
||||
i += 8;
|
||||
Signal("$$ %s %s %s.",
|
||||
ship, countryname[ship->nationality],
|
||||
classname[ship->specs->class], directionname[i]);
|
||||
}
|
||||
}
|
||||
258
sail/pl_5.c
Normal file
258
sail/pl_5.c
Normal file
@@ -0,0 +1,258 @@
|
||||
/* $NetBSD: pl_5.c,v 1.6 1997/10/13 21:04:24 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)pl_5.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: pl_5.c,v 1.6 1997/10/13 21:04:24 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "player.h"
|
||||
|
||||
#define turnfirst(x) (*x == 'r' || *x == 'l')
|
||||
|
||||
void
|
||||
acceptmove()
|
||||
{
|
||||
int ta;
|
||||
int ma;
|
||||
char af;
|
||||
int moved = 0;
|
||||
int vma, dir;
|
||||
char prompt[60];
|
||||
char buf[60], last = '\0';
|
||||
char *p;
|
||||
|
||||
if (!mc->crew3 || snagged(ms) || !windspeed) {
|
||||
Msg("Unable to move");
|
||||
return;
|
||||
}
|
||||
|
||||
ta = maxturns(ms, &af);
|
||||
ma = maxmove(ms, mf->dir, 0);
|
||||
(void) sprintf(prompt, "move (%d,%c%d): ", ma, af ? '\'' : ' ', ta);
|
||||
sgetstr(prompt, buf, sizeof buf);
|
||||
dir = mf->dir;
|
||||
vma = ma;
|
||||
for (p = buf; *p; p++)
|
||||
switch (*p) {
|
||||
case 'l':
|
||||
dir -= 2;
|
||||
case 'r':
|
||||
if (++dir == 0)
|
||||
dir = 8;
|
||||
else if (dir == 9)
|
||||
dir = 1;
|
||||
if (last == 't') {
|
||||
Msg("Ship can't turn that fast.");
|
||||
*p-- = '\0';
|
||||
}
|
||||
last = 't';
|
||||
ma--;
|
||||
ta--;
|
||||
vma = min(ma, maxmove(ms, dir, 0));
|
||||
if ((ta < 0 && moved) || (vma < 0 && moved))
|
||||
*p-- = '\0';
|
||||
break;
|
||||
case 'b':
|
||||
ma--;
|
||||
vma--;
|
||||
last = 'b';
|
||||
if ((ta < 0 && moved) || (vma < 0 && moved))
|
||||
*p-- = '\0';
|
||||
break;
|
||||
case '0':
|
||||
case 'd':
|
||||
*p-- = '\0';
|
||||
break;
|
||||
case '\n':
|
||||
*p-- = '\0';
|
||||
break;
|
||||
case '1': case '2': case '3': case '4':
|
||||
case '5': case '6': case '7':
|
||||
if (last == '0') {
|
||||
Msg("Can't move that fast.");
|
||||
*p-- = '\0';
|
||||
}
|
||||
last = '0';
|
||||
moved = 1;
|
||||
ma -= *p - '0';
|
||||
vma -= *p - '0';
|
||||
if ((ta < 0 && moved) || (vma < 0 && moved))
|
||||
*p-- = '\0';
|
||||
break;
|
||||
default:
|
||||
if (!isspace(*p)) {
|
||||
Msg("Input error.");
|
||||
*p-- = '\0';
|
||||
}
|
||||
}
|
||||
if ((ta < 0 && moved) || (vma < 0 && moved)
|
||||
|| (af && turnfirst(buf) && moved)) {
|
||||
Msg("Movement error.");
|
||||
if (ta < 0 && moved) {
|
||||
if (mf->FS == 1) {
|
||||
Write(W_FS, ms, 0, 0, 0, 0, 0);
|
||||
Msg("No hands to set full sails.");
|
||||
}
|
||||
} else if (ma >= 0)
|
||||
buf[1] = '\0';
|
||||
}
|
||||
if (af && !moved) {
|
||||
if (mf->FS == 1) {
|
||||
Write(W_FS, ms, 0, 0, 0, 0, 0);
|
||||
Msg("No hands to set full sails.");
|
||||
}
|
||||
}
|
||||
if (*buf)
|
||||
(void) strcpy(movebuf, buf);
|
||||
else
|
||||
(void) strcpy(movebuf, "d");
|
||||
Write(W_MOVE, ms, 1, (long)movebuf, 0, 0, 0);
|
||||
Msg("Helm: %s.", movebuf);
|
||||
}
|
||||
|
||||
void
|
||||
acceptboard()
|
||||
{
|
||||
struct ship *sp;
|
||||
int n;
|
||||
int crew[3];
|
||||
int men = 0;
|
||||
char c;
|
||||
|
||||
crew[0] = mc->crew1;
|
||||
crew[1] = mc->crew2;
|
||||
crew[2] = mc->crew3;
|
||||
for (n = 0; n < NBP; n++) {
|
||||
if (mf->OBP[n].turnsent)
|
||||
men += mf->OBP[n].mensent;
|
||||
}
|
||||
for (n = 0; n < NBP; n++) {
|
||||
if (mf->DBP[n].turnsent)
|
||||
men += mf->DBP[n].mensent;
|
||||
}
|
||||
if (men) {
|
||||
crew[0] = men/100 ? 0 : crew[0] != 0;
|
||||
crew[1] = (men%100)/10 ? 0 : crew[1] != 0;
|
||||
crew[2] = men%10 ? 0 : crew[2] != 0;
|
||||
} else {
|
||||
crew[0] = crew[0] != 0;
|
||||
crew[1] = crew[1] != 0;
|
||||
crew[2] = crew[2] != 0;
|
||||
}
|
||||
foreachship(sp) {
|
||||
if (sp == ms || sp->file->dir == 0 || range(ms, sp) > 1)
|
||||
continue;
|
||||
if (ms->nationality == capship(sp)->nationality)
|
||||
continue;
|
||||
if (meleeing(ms, sp) && crew[2]) {
|
||||
c = sgetch("How many more to board the $$? ",
|
||||
sp, 1);
|
||||
parties(crew, sp, 0, c);
|
||||
} else if ((fouled2(ms, sp) || grappled2(ms, sp)) && crew[2]) {
|
||||
c = sgetch("Crew sections to board the $$ (3 max) ?", sp, 1);
|
||||
parties(crew, sp, 0, c);
|
||||
}
|
||||
}
|
||||
if (crew[2]) {
|
||||
c = sgetch("How many sections to repel boarders? ",
|
||||
(struct ship *)0, 1);
|
||||
parties(crew, ms, 1, c);
|
||||
}
|
||||
blockalarm();
|
||||
draw_slot();
|
||||
unblockalarm();
|
||||
}
|
||||
|
||||
void
|
||||
parties(crew, to, isdefense, buf)
|
||||
struct ship *to;
|
||||
int crew[3];
|
||||
char isdefense;
|
||||
char buf;
|
||||
{
|
||||
int k, j, men;
|
||||
struct BP *ptr;
|
||||
int temp[3];
|
||||
|
||||
for (k = 0; k < 3; k++)
|
||||
temp[k] = crew[k];
|
||||
if (isdigit(buf)) {
|
||||
ptr = isdefense ? to->file->DBP : to->file->OBP;
|
||||
for (j = 0; j < NBP && ptr[j].turnsent; j++)
|
||||
;
|
||||
if (!ptr[j].turnsent && buf > '0') {
|
||||
men = 0;
|
||||
for (k = 0; k < 3 && buf > '0'; k++) {
|
||||
men += crew[k]
|
||||
* (k == 0 ? 100 : (k == 1 ? 10 : 1));
|
||||
crew[k] = 0;
|
||||
if (men)
|
||||
buf--;
|
||||
}
|
||||
if (buf > '0')
|
||||
Msg("Sending all crew sections.");
|
||||
Write(isdefense ? W_DBP : W_OBP, ms, 0,
|
||||
j, turn, to->file->index, men);
|
||||
if (isdefense) {
|
||||
(void) wmove(slot_w, 2, 0);
|
||||
for (k=0; k < NBP; k++)
|
||||
if (temp[k] && !crew[k])
|
||||
(void) waddch(slot_w, k + '1');
|
||||
else
|
||||
(void) wmove(slot_w, 2, 1 + k);
|
||||
(void) mvwaddstr(slot_w, 3, 0, "DBP");
|
||||
makemsg(ms, "repelling boarders");
|
||||
} else {
|
||||
(void) wmove(slot_w, 0, 0);
|
||||
for (k=0; k < NBP; k++)
|
||||
if (temp[k] && !crew[k])
|
||||
(void) waddch(slot_w, k + '1');
|
||||
else
|
||||
(void) wmove(slot_w, 0, 1 + k);
|
||||
(void) mvwaddstr(slot_w, 1, 0, "OBP");
|
||||
makesignal(ms, "boarding the $$", to);
|
||||
}
|
||||
blockalarm();
|
||||
(void) wrefresh(slot_w);
|
||||
unblockalarm();
|
||||
} else
|
||||
Msg("Sending no crew sections.");
|
||||
}
|
||||
}
|
||||
205
sail/pl_6.c
Normal file
205
sail/pl_6.c
Normal file
@@ -0,0 +1,205 @@
|
||||
/* $NetBSD: pl_6.c,v 1.4 1997/10/13 19:45:33 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)pl_6.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: pl_6.c,v 1.4 1997/10/13 19:45:33 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "player.h"
|
||||
|
||||
void
|
||||
repair()
|
||||
{
|
||||
char c;
|
||||
char *repairs;
|
||||
struct shipspecs *ptr = mc;
|
||||
int count;
|
||||
|
||||
#define FIX(x, m) (m - ptr->x > count \
|
||||
? (ptr->x += count, count = 0) : (count -= m - ptr->x, ptr->x = m))
|
||||
|
||||
if (repaired || loaded || fired || changed || turned()) {
|
||||
Msg("No hands free to repair");
|
||||
return;
|
||||
}
|
||||
c = sgetch("Repair (hull, guns, rigging)? ", (struct ship *)0, 1);
|
||||
switch (c) {
|
||||
case 'h':
|
||||
repairs = &mf->RH;
|
||||
break;
|
||||
case 'g':
|
||||
repairs = &mf->RG;
|
||||
break;
|
||||
case 'r':
|
||||
repairs = &mf->RR;
|
||||
break;
|
||||
default:
|
||||
Msg("Avast heaving!");
|
||||
return;
|
||||
}
|
||||
if (++*repairs >= 3) {
|
||||
count = 2;
|
||||
switch (c) {
|
||||
case 'h': {
|
||||
int max = ptr->guns/4;
|
||||
if (ptr->hull < max) {
|
||||
FIX(hull, max);
|
||||
Write(W_HULL, ms, 0, ptr->hull, 0, 0, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 'g':
|
||||
if (ptr->gunL < ptr->gunR) {
|
||||
int max = ptr->guns/5 - ptr->carL;
|
||||
if (ptr->gunL < max) {
|
||||
FIX(gunL, max);
|
||||
Write(W_GUNL, ms, 0, ptr->gunL,
|
||||
ptr->carL, 0, 0);
|
||||
}
|
||||
} else {
|
||||
int max = ptr->guns/5 - ptr->carR;
|
||||
if (ptr->gunR < max) {
|
||||
FIX(gunR, max);
|
||||
Write(W_GUNR, ms, 0, ptr->gunR,
|
||||
ptr->carR, 0, 0);
|
||||
}
|
||||
}
|
||||
break;
|
||||
case 'r':
|
||||
#define X 2
|
||||
if (ptr->rig4 >= 0 && ptr->rig4 < X) {
|
||||
FIX(rig4, X);
|
||||
Write(W_RIG4, ms, 0, ptr->rig4, 0, 0, 0);
|
||||
}
|
||||
if (count && ptr->rig3 < X) {
|
||||
FIX(rig3, X);
|
||||
Write(W_RIG3, ms, 0, ptr->rig3, 0, 0, 0);
|
||||
}
|
||||
if (count && ptr->rig2 < X) {
|
||||
FIX(rig2, X);
|
||||
Write(W_RIG2, ms, 0, ptr->rig2, 0, 0, 0);
|
||||
}
|
||||
if (count && ptr->rig1 < X) {
|
||||
FIX(rig1, X);
|
||||
Write(W_RIG1, ms, 0, ptr->rig1, 0, 0, 0);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (count == 2) {
|
||||
Msg("Repairs completed.");
|
||||
*repairs = 2;
|
||||
} else {
|
||||
*repairs = 0;
|
||||
blockalarm();
|
||||
draw_stat();
|
||||
unblockalarm();
|
||||
}
|
||||
}
|
||||
blockalarm();
|
||||
draw_slot();
|
||||
unblockalarm();
|
||||
repaired = 1;
|
||||
}
|
||||
|
||||
int
|
||||
turned()
|
||||
{
|
||||
char *p;
|
||||
|
||||
for (p = movebuf; *p; p++)
|
||||
if (*p == 'r' || *p == 'l')
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
loadplayer()
|
||||
{
|
||||
char c;
|
||||
int loadL, loadR, ready, load;
|
||||
|
||||
if (!mc->crew3) {
|
||||
Msg("Out of crew");
|
||||
return;
|
||||
}
|
||||
loadL = mf->loadL;
|
||||
loadR = mf->loadR;
|
||||
if (!loadL && !loadR) {
|
||||
c = sgetch("Load which broadside (left or right)? ",
|
||||
(struct ship *)0, 1);
|
||||
if (c == 'r')
|
||||
loadL = 1;
|
||||
else
|
||||
loadR = 1;
|
||||
}
|
||||
if ((!loadL && loadR) || (loadL && !loadR)) {
|
||||
c = sgetch("Reload with (round, double, chain, grape)? ",
|
||||
(struct ship *)0, 1);
|
||||
switch (c) {
|
||||
case 'r':
|
||||
load = L_ROUND;
|
||||
ready = 0;
|
||||
break;
|
||||
case 'd':
|
||||
load = L_DOUBLE;
|
||||
ready = R_DOUBLE;
|
||||
break;
|
||||
case 'c':
|
||||
load = L_CHAIN;
|
||||
ready = 0;
|
||||
break;
|
||||
case 'g':
|
||||
load = L_GRAPE;
|
||||
ready = 0;
|
||||
break;
|
||||
default:
|
||||
Msg("Broadside not loaded.");
|
||||
return;
|
||||
}
|
||||
if (!loadR) {
|
||||
mf->loadR = load;
|
||||
mf->readyR = ready|R_LOADING;
|
||||
} else {
|
||||
mf->loadL = load;
|
||||
mf->readyL = ready|R_LOADING;
|
||||
}
|
||||
loaded = 1;
|
||||
}
|
||||
}
|
||||
542
sail/pl_7.c
Normal file
542
sail/pl_7.c
Normal file
@@ -0,0 +1,542 @@
|
||||
/* $NetBSD: pl_7.c,v 1.9 1998/08/30 09:19:40 veego Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)pl_7.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: pl_7.c,v 1.9 1998/08/30 09:19:40 veego Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include <sys/ttydefaults.h>
|
||||
#include "player.h"
|
||||
#ifdef __STDC__
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
#include <varargs.h>
|
||||
#endif
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
/*
|
||||
* Display interface
|
||||
*/
|
||||
|
||||
static char sc_hasprompt;
|
||||
static char *sc_prompt;
|
||||
static char *sc_buf;
|
||||
static int sc_line;
|
||||
|
||||
void
|
||||
initscreen()
|
||||
{
|
||||
if (!SCREENTEST()) {
|
||||
printf("Can't sail on this terminal.\n");
|
||||
exit(1);
|
||||
}
|
||||
/* initscr() already done in SCREENTEST() */
|
||||
view_w = newwin(VIEW_Y, VIEW_X, VIEW_T, VIEW_L);
|
||||
slot_w = newwin(SLOT_Y, SLOT_X, SLOT_T, SLOT_L);
|
||||
scroll_w = newwin(SCROLL_Y, SCROLL_X, SCROLL_T, SCROLL_L);
|
||||
stat_w = newwin(STAT_Y, STAT_X, STAT_T, STAT_L);
|
||||
turn_w = newwin(TURN_Y, TURN_X, TURN_T, TURN_L);
|
||||
done_curses++;
|
||||
(void) leaveok(view_w, 1);
|
||||
(void) leaveok(slot_w, 1);
|
||||
(void) leaveok(stat_w, 1);
|
||||
(void) leaveok(turn_w, 1);
|
||||
noecho();
|
||||
crmode();
|
||||
}
|
||||
|
||||
void
|
||||
cleanupscreen()
|
||||
{
|
||||
/* alarm already turned off */
|
||||
if (done_curses) {
|
||||
(void) wmove(scroll_w, SCROLL_Y - 1, 0);
|
||||
(void) wclrtoeol(scroll_w);
|
||||
draw_screen();
|
||||
endwin();
|
||||
}
|
||||
}
|
||||
|
||||
/*ARGSUSED*/
|
||||
void
|
||||
newturn(n)
|
||||
int n __attribute__((unused));
|
||||
{
|
||||
repaired = loaded = fired = changed = 0;
|
||||
movebuf[0] = '\0';
|
||||
|
||||
(void) alarm(0);
|
||||
if (mf->readyL & R_LOADING) {
|
||||
if (mf->readyL & R_DOUBLE)
|
||||
mf->readyL = R_LOADING;
|
||||
else
|
||||
mf->readyL = R_LOADED;
|
||||
}
|
||||
if (mf->readyR & R_LOADING) {
|
||||
if (mf->readyR & R_DOUBLE)
|
||||
mf->readyR = R_LOADING;
|
||||
else
|
||||
mf->readyR = R_LOADED;
|
||||
}
|
||||
if (!hasdriver)
|
||||
Write(W_DDEAD, SHIP(0), 0, 0, 0, 0, 0);
|
||||
|
||||
if (sc_hasprompt) {
|
||||
(void) wmove(scroll_w, sc_line, 0);
|
||||
(void) wclrtoeol(scroll_w);
|
||||
}
|
||||
if (Sync() < 0)
|
||||
leave(LEAVE_SYNC);
|
||||
if (!hasdriver)
|
||||
leave(LEAVE_DRIVER);
|
||||
if (sc_hasprompt)
|
||||
(void) wprintw(scroll_w, "%s%s", sc_prompt, sc_buf);
|
||||
|
||||
if (turn % 50 == 0)
|
||||
Write(W_ALIVE, SHIP(0), 0, 0, 0, 0, 0);
|
||||
if (mf->FS && (!mc->rig1 || windspeed == 6))
|
||||
Write(W_FS, ms, 0, 0, 0, 0, 0);
|
||||
if (mf->FS == 1)
|
||||
Write(W_FS, ms, 0, 2, 0, 0, 0);
|
||||
|
||||
if (mf->struck)
|
||||
leave(LEAVE_QUIT);
|
||||
if (mf->captured != 0)
|
||||
leave(LEAVE_CAPTURED);
|
||||
if (windspeed == 7)
|
||||
leave(LEAVE_HURRICAN);
|
||||
|
||||
adjustview();
|
||||
draw_screen();
|
||||
|
||||
(void) signal(SIGALRM, newturn);
|
||||
(void) alarm(7);
|
||||
}
|
||||
|
||||
/*VARARGS2*/
|
||||
void
|
||||
#ifdef __STDC__
|
||||
Signal(const char *fmt, struct ship *ship, ...)
|
||||
#else
|
||||
Signal(va_alist)
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list ap;
|
||||
char format[BUFSIZ];
|
||||
#ifndef __STDC__
|
||||
const char *fmt;
|
||||
struct ship *ship;
|
||||
|
||||
va_start(ap);
|
||||
fmt = va_arg(ap, const char *);
|
||||
ship = va_arg(ap, struct ship *);
|
||||
#else
|
||||
va_start(ap, ship);
|
||||
#endif
|
||||
if (!done_curses)
|
||||
return;
|
||||
if (*fmt == '\7')
|
||||
putchar(*fmt++);
|
||||
fmtship(format, sizeof(format), fmt, ship);
|
||||
(void) vwprintw(scroll_w, format, ap);
|
||||
va_end(ap);
|
||||
Scroll();
|
||||
}
|
||||
|
||||
/*VARARGS2*/
|
||||
void
|
||||
#ifdef __STDC__
|
||||
Msg(const char *fmt, ...)
|
||||
#else
|
||||
Msg(va_alist)
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
va_list ap;
|
||||
#ifndef __STDC__
|
||||
const char *fmt;
|
||||
|
||||
va_start(ap);
|
||||
fmt = va_arg(ap, const char *);
|
||||
#else
|
||||
va_start(ap, fmt);
|
||||
#endif
|
||||
|
||||
if (!done_curses)
|
||||
return;
|
||||
if (*fmt == '\7')
|
||||
putchar(*fmt++);
|
||||
(void) vwprintw(scroll_w, fmt, ap);
|
||||
va_end(ap);
|
||||
Scroll();
|
||||
}
|
||||
|
||||
void
|
||||
Scroll()
|
||||
{
|
||||
if (++sc_line >= SCROLL_Y)
|
||||
sc_line = 0;
|
||||
(void) wmove(scroll_w, sc_line, 0);
|
||||
(void) wclrtoeol(scroll_w);
|
||||
}
|
||||
|
||||
void
|
||||
prompt(p, ship)
|
||||
char *p;
|
||||
struct ship *ship;
|
||||
{
|
||||
static char buf[BUFSIZ];
|
||||
|
||||
fmtship(buf, sizeof(buf), p, ship);
|
||||
sc_prompt = buf;
|
||||
sc_buf = "";
|
||||
sc_hasprompt = 1;
|
||||
(void) waddstr(scroll_w, buf);
|
||||
}
|
||||
|
||||
void
|
||||
endprompt(flag)
|
||||
char flag;
|
||||
{
|
||||
sc_hasprompt = 0;
|
||||
if (flag)
|
||||
Scroll();
|
||||
}
|
||||
|
||||
int
|
||||
sgetch(p, ship, flag)
|
||||
char *p;
|
||||
struct ship *ship;
|
||||
char flag;
|
||||
{
|
||||
int c;
|
||||
prompt(p, ship);
|
||||
blockalarm();
|
||||
(void) wrefresh(scroll_w);
|
||||
unblockalarm();
|
||||
while ((c = wgetch(scroll_w)) == EOF)
|
||||
;
|
||||
if (flag && c >= ' ' && c < 0x7f)
|
||||
(void) waddch(scroll_w, c);
|
||||
endprompt(flag);
|
||||
return c;
|
||||
}
|
||||
|
||||
void
|
||||
sgetstr(pr, buf, n)
|
||||
char *pr;
|
||||
char *buf;
|
||||
int n;
|
||||
{
|
||||
int c;
|
||||
char *p = buf;
|
||||
|
||||
prompt(pr, (struct ship *)0);
|
||||
sc_buf = buf;
|
||||
for (;;) {
|
||||
*p = 0;
|
||||
blockalarm();
|
||||
(void) wrefresh(scroll_w);
|
||||
unblockalarm();
|
||||
while ((c = wgetch(scroll_w)) == EOF)
|
||||
;
|
||||
switch (c) {
|
||||
case '\n':
|
||||
case '\r':
|
||||
endprompt(1);
|
||||
return;
|
||||
case '\b':
|
||||
if (p > buf) {
|
||||
(void) waddstr(scroll_w, "\b \b");
|
||||
p--;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
if (c >= ' ' && c < 0x7f && p < buf + n - 1) {
|
||||
*p++ = c;
|
||||
(void) waddch(scroll_w, c);
|
||||
} else
|
||||
(void) putchar('\a');
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
draw_screen()
|
||||
{
|
||||
draw_view();
|
||||
draw_turn();
|
||||
draw_stat();
|
||||
draw_slot();
|
||||
(void) wrefresh(scroll_w); /* move the cursor */
|
||||
}
|
||||
|
||||
void
|
||||
draw_view()
|
||||
{
|
||||
struct ship *sp;
|
||||
|
||||
(void) werase(view_w);
|
||||
foreachship(sp) {
|
||||
if (sp->file->dir
|
||||
&& sp->file->row > viewrow
|
||||
&& sp->file->row < viewrow + VIEW_Y
|
||||
&& sp->file->col > viewcol
|
||||
&& sp->file->col < viewcol + VIEW_X) {
|
||||
(void) wmove(view_w, sp->file->row - viewrow,
|
||||
sp->file->col - viewcol);
|
||||
(void) waddch(view_w, colours(sp));
|
||||
(void) wmove(view_w,
|
||||
sternrow(sp) - viewrow,
|
||||
sterncol(sp) - viewcol);
|
||||
(void) waddch(view_w, sterncolour(sp));
|
||||
}
|
||||
}
|
||||
(void) wrefresh(view_w);
|
||||
}
|
||||
|
||||
void
|
||||
draw_turn()
|
||||
{
|
||||
(void) wmove(turn_w, 0, 0);
|
||||
(void) wprintw(turn_w, "%cTurn %d", dont_adjust?'*':'-', turn);
|
||||
(void) wrefresh(turn_w);
|
||||
}
|
||||
|
||||
void
|
||||
draw_stat()
|
||||
{
|
||||
(void) wmove(stat_w, STAT_1, 0);
|
||||
(void) wprintw(stat_w, "Points %3d\n", mf->points);
|
||||
(void) wprintw(stat_w, "Fouls %2d\n", fouled(ms));
|
||||
(void) wprintw(stat_w, "Grapples %2d\n", grappled(ms));
|
||||
|
||||
(void) wmove(stat_w, STAT_2, 0);
|
||||
(void) wprintw(stat_w, " 0 %c(%c)\n",
|
||||
maxmove(ms, winddir + 3, -1) + '0',
|
||||
maxmove(ms, winddir + 3, 1) + '0');
|
||||
(void) waddstr(stat_w, " \\|/\n");
|
||||
(void) wprintw(stat_w, " -^-%c(%c)\n",
|
||||
maxmove(ms, winddir + 2, -1) + '0',
|
||||
maxmove(ms, winddir + 2, 1) + '0');
|
||||
(void) waddstr(stat_w, " /|\\\n");
|
||||
(void) wprintw(stat_w, " | %c(%c)\n",
|
||||
maxmove(ms, winddir + 1, -1) + '0',
|
||||
maxmove(ms, winddir + 1, 1) + '0');
|
||||
(void) wprintw(stat_w, " %c(%c)\n",
|
||||
maxmove(ms, winddir, -1) + '0',
|
||||
maxmove(ms, winddir, 1) + '0');
|
||||
|
||||
(void) wmove(stat_w, STAT_3, 0);
|
||||
(void) wprintw(stat_w, "Load %c%c %c%c\n",
|
||||
loadname[mf->loadL], readyname(mf->readyL),
|
||||
loadname[mf->loadR], readyname(mf->readyR));
|
||||
(void) wprintw(stat_w, "Hull %2d\n", mc->hull);
|
||||
(void) wprintw(stat_w, "Crew %2d %2d %2d\n",
|
||||
mc->crew1, mc->crew2, mc->crew3);
|
||||
(void) wprintw(stat_w, "Guns %2d %2d\n", mc->gunL, mc->gunR);
|
||||
(void) wprintw(stat_w, "Carr %2d %2d\n", mc->carL, mc->carR);
|
||||
(void) wprintw(stat_w, "Rigg %d %d %d ", mc->rig1, mc->rig2, mc->rig3);
|
||||
if (mc->rig4 < 0)
|
||||
(void) waddch(stat_w, '-');
|
||||
else
|
||||
(void) wprintw(stat_w, "%d", mc->rig4);
|
||||
(void) wrefresh(stat_w);
|
||||
}
|
||||
|
||||
void
|
||||
draw_slot()
|
||||
{
|
||||
if (!boarding(ms, 0)) {
|
||||
(void) mvwaddstr(slot_w, 0, 0, " ");
|
||||
(void) mvwaddstr(slot_w, 1, 0, " ");
|
||||
} else
|
||||
(void) mvwaddstr(slot_w, 1, 0, "OBP");
|
||||
if (!boarding(ms, 1)) {
|
||||
(void) mvwaddstr(slot_w, 2, 0, " ");
|
||||
(void) mvwaddstr(slot_w, 3, 0, " ");
|
||||
} else
|
||||
(void) mvwaddstr(slot_w, 3, 0, "DBP");
|
||||
|
||||
(void) wmove(slot_w, SLOT_Y-4, 0);
|
||||
if (mf->RH)
|
||||
(void) wprintw(slot_w, "%dRH", mf->RH);
|
||||
else
|
||||
(void) waddstr(slot_w, " ");
|
||||
(void) wmove(slot_w, SLOT_Y-3, 0);
|
||||
if (mf->RG)
|
||||
(void) wprintw(slot_w, "%dRG", mf->RG);
|
||||
else
|
||||
(void) waddstr(slot_w, " ");
|
||||
(void) wmove(slot_w, SLOT_Y-2, 0);
|
||||
if (mf->RR)
|
||||
(void) wprintw(slot_w, "%dRR", mf->RR);
|
||||
else
|
||||
(void) waddstr(slot_w, " ");
|
||||
|
||||
#define Y (SLOT_Y/2)
|
||||
(void) wmove(slot_w, 7, 1);
|
||||
(void) wprintw(slot_w,"%d", windspeed);
|
||||
(void) mvwaddch(slot_w, Y, 0, ' ');
|
||||
(void) mvwaddch(slot_w, Y, 2, ' ');
|
||||
(void) mvwaddch(slot_w, Y-1, 0, ' ');
|
||||
(void) mvwaddch(slot_w, Y-1, 1, ' ');
|
||||
(void) mvwaddch(slot_w, Y-1, 2, ' ');
|
||||
(void) mvwaddch(slot_w, Y+1, 0, ' ');
|
||||
(void) mvwaddch(slot_w, Y+1, 1, ' ');
|
||||
(void) mvwaddch(slot_w, Y+1, 2, ' ');
|
||||
(void) wmove(slot_w, Y - dr[winddir], 1 - dc[winddir]);
|
||||
switch (winddir) {
|
||||
case 1:
|
||||
case 5:
|
||||
(void) waddch(slot_w, '|');
|
||||
break;
|
||||
case 2:
|
||||
case 6:
|
||||
(void) waddch(slot_w, '/');
|
||||
break;
|
||||
case 3:
|
||||
case 7:
|
||||
(void) waddch(slot_w, '-');
|
||||
break;
|
||||
case 4:
|
||||
case 8:
|
||||
(void) waddch(slot_w, '\\');
|
||||
break;
|
||||
}
|
||||
(void) mvwaddch(slot_w, Y + dr[winddir], 1 + dc[winddir], '+');
|
||||
(void) wrefresh(slot_w);
|
||||
}
|
||||
|
||||
void
|
||||
draw_board()
|
||||
{
|
||||
int n;
|
||||
|
||||
(void) clear();
|
||||
(void) werase(view_w);
|
||||
(void) werase(slot_w);
|
||||
(void) werase(scroll_w);
|
||||
(void) werase(stat_w);
|
||||
(void) werase(turn_w);
|
||||
|
||||
sc_line = 0;
|
||||
|
||||
(void) move(BOX_T, BOX_L);
|
||||
for (n = 0; n < BOX_X; n++)
|
||||
(void) addch('-');
|
||||
(void) move(BOX_B, BOX_L);
|
||||
for (n = 0; n < BOX_X; n++)
|
||||
(void) addch('-');
|
||||
for (n = BOX_T+1; n < BOX_B; n++) {
|
||||
(void) mvaddch(n, BOX_L, '|');
|
||||
(void) mvaddch(n, BOX_R, '|');
|
||||
}
|
||||
(void) mvaddch(BOX_T, BOX_L, '+');
|
||||
(void) mvaddch(BOX_T, BOX_R, '+');
|
||||
(void) mvaddch(BOX_B, BOX_L, '+');
|
||||
(void) mvaddch(BOX_B, BOX_R, '+');
|
||||
(void) refresh();
|
||||
|
||||
#define WSaIM "Wooden Ships & Iron Men"
|
||||
(void) wmove(view_w, 2, (VIEW_X - sizeof WSaIM - 1) / 2);
|
||||
(void) waddstr(view_w, WSaIM);
|
||||
(void) wmove(view_w, 4, (VIEW_X - strlen(cc->name)) / 2);
|
||||
(void) waddstr(view_w, cc->name);
|
||||
(void) wrefresh(view_w);
|
||||
|
||||
(void) move(LINE_T, LINE_L);
|
||||
(void) printw("Class %d %s (%d guns) '%s' (%c%c)",
|
||||
mc->class,
|
||||
classname[mc->class],
|
||||
mc->guns,
|
||||
ms->shipname,
|
||||
colours(ms),
|
||||
sterncolour(ms));
|
||||
(void) refresh();
|
||||
}
|
||||
|
||||
void
|
||||
centerview()
|
||||
{
|
||||
viewrow = mf->row - VIEW_Y / 2;
|
||||
viewcol = mf->col - VIEW_X / 2;
|
||||
}
|
||||
|
||||
void
|
||||
upview()
|
||||
{
|
||||
viewrow -= VIEW_Y / 3;
|
||||
}
|
||||
|
||||
void
|
||||
downview()
|
||||
{
|
||||
viewrow += VIEW_Y / 3;
|
||||
}
|
||||
|
||||
void
|
||||
leftview()
|
||||
{
|
||||
viewcol -= VIEW_X / 5;
|
||||
}
|
||||
|
||||
void
|
||||
rightview()
|
||||
{
|
||||
viewcol += VIEW_X / 5;
|
||||
}
|
||||
|
||||
void
|
||||
adjustview()
|
||||
{
|
||||
if (dont_adjust)
|
||||
return;
|
||||
if (mf->row < viewrow + VIEW_Y/4)
|
||||
viewrow = mf->row - (VIEW_Y - VIEW_Y/4);
|
||||
else if (mf->row > viewrow + (VIEW_Y - VIEW_Y/4))
|
||||
viewrow = mf->row - VIEW_Y/4;
|
||||
if (mf->col < viewcol + VIEW_X/8)
|
||||
viewcol = mf->col - (VIEW_X - VIEW_X/8);
|
||||
else if (mf->col > viewcol + (VIEW_X - VIEW_X/8))
|
||||
viewcol = mf->col - VIEW_X/8;
|
||||
}
|
||||
251
sail/pl_main.c
Normal file
251
sail/pl_main.c
Normal file
@@ -0,0 +1,251 @@
|
||||
/* $NetBSD: pl_main.c,v 1.6 1997/10/13 19:45:48 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)pl_main.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: pl_main.c,v 1.6 1997/10/13 19:45:48 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include "player.h"
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/*ARGSUSED*/
|
||||
int
|
||||
pl_main()
|
||||
{
|
||||
|
||||
initialize();
|
||||
Msg("Aye aye, Sir");
|
||||
play();
|
||||
return 0; /* for lint, play() never returns */
|
||||
}
|
||||
|
||||
void
|
||||
initialize()
|
||||
{
|
||||
register struct File *fp;
|
||||
register struct ship *sp;
|
||||
char captain[80];
|
||||
char message[60];
|
||||
int load;
|
||||
register int n;
|
||||
char *nameptr;
|
||||
int nat[NNATION];
|
||||
|
||||
if (game < 0) {
|
||||
(void) puts("Choose a scenario:\n");
|
||||
(void) puts("\n\tNUMBER\tSHIPS\tIN PLAY\tTITLE");
|
||||
for (n = 0; n < NSCENE; n++) {
|
||||
/* ( */
|
||||
printf("\t%d):\t%d\t%s\t%s\n", n, scene[n].vessels,
|
||||
sync_exists(n) ? "YES" : "no",
|
||||
scene[n].name);
|
||||
}
|
||||
reprint:
|
||||
printf("\nScenario number? ");
|
||||
(void) fflush(stdout);
|
||||
(void) scanf("%d", &game);
|
||||
while (getchar() != '\n')
|
||||
;
|
||||
}
|
||||
if (game < 0 || game >= NSCENE) {
|
||||
(void) puts("Very funny.");
|
||||
exit(1);
|
||||
}
|
||||
cc = &scene[game];
|
||||
ls = SHIP(cc->vessels);
|
||||
|
||||
for (n = 0; n < NNATION; n++)
|
||||
nat[n] = 0;
|
||||
foreachship(sp) {
|
||||
if (sp->file == NULL &&
|
||||
(sp->file = (struct File *)calloc(1, sizeof (struct File))) == NULL) {
|
||||
(void) puts("OUT OF MEMORY");
|
||||
exit(1);
|
||||
}
|
||||
sp->file->index = sp - SHIP(0);
|
||||
sp->file->stern = nat[sp->nationality]++;
|
||||
sp->file->dir = sp->shipdir;
|
||||
sp->file->row = sp->shiprow;
|
||||
sp->file->col = sp->shipcol;
|
||||
}
|
||||
windspeed = cc->windspeed;
|
||||
winddir = cc->winddir;
|
||||
|
||||
(void) signal(SIGHUP, choke);
|
||||
(void) signal(SIGINT, choke);
|
||||
|
||||
hasdriver = sync_exists(game);
|
||||
if (sync_open() < 0) {
|
||||
perror("sail: syncfile");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
if (hasdriver) {
|
||||
(void) puts("Synchronizing with the other players...");
|
||||
(void) fflush(stdout);
|
||||
if (Sync() < 0)
|
||||
leave(LEAVE_SYNC);
|
||||
}
|
||||
for (;;) {
|
||||
foreachship(sp)
|
||||
if (sp->file->captain[0] == 0 && !sp->file->struck
|
||||
&& sp->file->captured == 0)
|
||||
break;
|
||||
if (sp >= ls) {
|
||||
(void) puts("All ships taken in that scenario.");
|
||||
foreachship(sp)
|
||||
free((char *)sp->file);
|
||||
sync_close(0);
|
||||
people = 0;
|
||||
goto reprint;
|
||||
}
|
||||
if (randomize) {
|
||||
player = sp - SHIP(0);
|
||||
} else {
|
||||
printf("%s\n\n", cc->name);
|
||||
foreachship(sp)
|
||||
printf(" %2d: %-10s %-15s (%-2d pts) %s\n",
|
||||
sp->file->index,
|
||||
countryname[sp->nationality],
|
||||
sp->shipname,
|
||||
sp->specs->pts,
|
||||
saywhat(sp, 1));
|
||||
printf("\nWhich ship (0-%d)? ", cc->vessels-1);
|
||||
(void) fflush(stdout);
|
||||
if (scanf("%d", &player) != 1 || player < 0
|
||||
|| player >= cc->vessels) {
|
||||
while (getchar() != '\n')
|
||||
;
|
||||
(void) puts("Say what?");
|
||||
player = -1;
|
||||
} else
|
||||
while (getchar() != '\n')
|
||||
;
|
||||
}
|
||||
if (player < 0)
|
||||
continue;
|
||||
if (Sync() < 0)
|
||||
leave(LEAVE_SYNC);
|
||||
fp = SHIP(player)->file;
|
||||
if (fp->captain[0] || fp->struck || fp->captured != 0)
|
||||
(void) puts("That ship is taken.");
|
||||
else
|
||||
break;
|
||||
}
|
||||
|
||||
ms = SHIP(player);
|
||||
mf = ms->file;
|
||||
mc = ms->specs;
|
||||
|
||||
Write(W_BEGIN, ms, 0, 0, 0, 0, 0);
|
||||
if (Sync() < 0)
|
||||
leave(LEAVE_SYNC);
|
||||
|
||||
(void) signal(SIGCHLD, child);
|
||||
if (!hasdriver)
|
||||
switch (fork()) {
|
||||
case 0:
|
||||
longjmp(restart, MODE_DRIVER);
|
||||
/*NOTREACHED*/
|
||||
case -1:
|
||||
perror("fork");
|
||||
leave(LEAVE_FORK);
|
||||
break;
|
||||
default:
|
||||
hasdriver++;
|
||||
}
|
||||
|
||||
printf("Your ship is the %s, a %d gun %s (%s crew).\n",
|
||||
ms->shipname, mc->guns, classname[mc->class],
|
||||
qualname[mc->qual]);
|
||||
if ((nameptr = (char *) getenv("SAILNAME")) && *nameptr)
|
||||
(void) strncpy(captain, nameptr, sizeof captain);
|
||||
else {
|
||||
(void) printf("Your name, Captain? ");
|
||||
(void) fflush(stdout);
|
||||
(void) fgets(captain, sizeof captain, stdin);
|
||||
if (!*captain)
|
||||
(void) strcpy(captain, "no name");
|
||||
else
|
||||
captain[strlen(captain) - 1] = '\0';
|
||||
}
|
||||
captain[sizeof captain - 1] = '\0';
|
||||
Write(W_CAPTAIN, ms, 1, (long)captain, 0, 0, 0);
|
||||
for (n = 0; n < 2; n++) {
|
||||
char buf[10];
|
||||
|
||||
printf("\nInitial broadside %s (grape, chain, round, double): ",
|
||||
n ? "right" : "left");
|
||||
(void) fflush(stdout);
|
||||
(void) scanf("%s", buf);
|
||||
switch (*buf) {
|
||||
case 'g':
|
||||
load = L_GRAPE;
|
||||
break;
|
||||
case 'c':
|
||||
load = L_CHAIN;
|
||||
break;
|
||||
case 'r':
|
||||
load = L_ROUND;
|
||||
break;
|
||||
case 'd':
|
||||
load = L_DOUBLE;
|
||||
break;
|
||||
default:
|
||||
load = L_ROUND;
|
||||
}
|
||||
if (n) {
|
||||
mf->loadR = load;
|
||||
mf->readyR = R_LOADED|R_INITIAL;
|
||||
} else {
|
||||
mf->loadL = load;
|
||||
mf->readyL = R_LOADED|R_INITIAL;
|
||||
}
|
||||
}
|
||||
|
||||
initscreen();
|
||||
draw_board();
|
||||
(void) sprintf(message, "Captain %s assuming command", captain);
|
||||
Write(W_SIGNAL, ms, 1, (long)message, 0, 0, 0);
|
||||
newturn(0);
|
||||
}
|
||||
124
sail/player.h
Normal file
124
sail/player.h
Normal file
@@ -0,0 +1,124 @@
|
||||
/* $NetBSD: player.h,v 1.6 1998/03/29 04:57:20 mrg Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)player.h 8.2 (Berkeley) 5/3/95
|
||||
*/
|
||||
|
||||
#include <curses.h>
|
||||
#include "extern.h"
|
||||
|
||||
/* sizes and coordinates for the screen */
|
||||
|
||||
#define LINE_T 0
|
||||
#define LINE_L 0
|
||||
#define LINE_X COLS
|
||||
#define LINE_Y 1
|
||||
#define LINE_B (LINE_T+LINE_Y-1)
|
||||
#define LINE_R (LINE_L+LINE_X-1)
|
||||
|
||||
#define BOX_T 1
|
||||
#define BOX_L 0
|
||||
#define BOX_X 65
|
||||
#define BOX_Y 16
|
||||
#define BOX_B (BOX_T+BOX_Y-1)
|
||||
#define BOX_R (BOX_L+BOX_X-1)
|
||||
|
||||
#define TURN_T BOX_B
|
||||
#define TURN_Y 1
|
||||
#define TURN_L ((BOX_L+BOX_R-TURN_X)/2)
|
||||
#define TURN_X 9
|
||||
#define TURN_B (TURN_T+TURN_Y+1)
|
||||
#define TURN_R (TURN_L+TURN_X+1)
|
||||
|
||||
#define STAT_T 0
|
||||
#define STAT_B BOX_B
|
||||
#define STAT_L (BOX_R+2)
|
||||
#define STAT_X 14
|
||||
#define STAT_Y (STAT_B-STAT_T+1)
|
||||
#define STAT_R (STAT_L+STAT_X-1)
|
||||
#define STAT_1 0
|
||||
#define STAT_2 (STAT_1+4)
|
||||
#define STAT_3 (STAT_2+7)
|
||||
|
||||
#define SCROLL_T (BOX_B+1)
|
||||
#define SCROLL_L 0
|
||||
#define SCROLL_B (LINES-1)
|
||||
#define SCROLL_R (COLS-1)
|
||||
#define SCROLL_X (SCROLL_R-SCROLL_L+1)
|
||||
#define SCROLL_Y (SCROLL_B-SCROLL_T+1)
|
||||
|
||||
#define VIEW_T (BOX_T+1)
|
||||
#define VIEW_L (BOX_L+1)
|
||||
#define VIEW_X (BOX_X-5)
|
||||
#define VIEW_Y (BOX_Y-2)
|
||||
#define VIEW_B (VIEW_T+VIEW_Y-1)
|
||||
#define VIEW_R (VIEW_L+VIEW_X-1)
|
||||
|
||||
#define SLOT_T VIEW_T
|
||||
#define SLOT_L (VIEW_R+1)
|
||||
#define SLOT_X 3
|
||||
#define SLOT_Y VIEW_Y
|
||||
#define SLOT_B VIEW_B
|
||||
#define SLOT_R (SLOT_L+SLOT_X-1)
|
||||
|
||||
#ifdef SIGTSTP
|
||||
#define SCREENTEST() (initscr() != NULL && signal(SIGTSTP, SIG_DFL) != SIG_ERR && STAT_R < COLS && SCROLL_Y > 0)
|
||||
#else
|
||||
#define SCREENTEST() (initscr() != NULL && STAT_R < COLS && SCROLL_Y > 0)
|
||||
#endif
|
||||
|
||||
WINDOW *view_w;
|
||||
WINDOW *slot_w;
|
||||
WINDOW *scroll_w;
|
||||
WINDOW *stat_w;
|
||||
WINDOW *turn_w;
|
||||
|
||||
char done_curses;
|
||||
char loaded, fired, changed, repaired;
|
||||
char dont_adjust;
|
||||
int viewrow, viewcol;
|
||||
char movebuf[sizeof SHIP(0)->file->movebuf];
|
||||
extern char version[];
|
||||
int player;
|
||||
struct ship *ms; /* memorial structure, &cc->ship[player] */
|
||||
struct File *mf; /* ms->file */
|
||||
struct shipspecs *mc; /* ms->specs */
|
||||
|
||||
/* condition codes for leave() */
|
||||
#define LEAVE_QUIT 0
|
||||
#define LEAVE_CAPTURED 1
|
||||
#define LEAVE_HURRICAN 2
|
||||
#define LEAVE_DRIVER 3
|
||||
#define LEAVE_FORK 4
|
||||
#define LEAVE_SYNC 5
|
||||
900
sail/sail.6
Normal file
900
sail/sail.6
Normal file
@@ -0,0 +1,900 @@
|
||||
.\" $NetBSD: sail.6,v 1.6 1997/01/07 12:42:25 tls Exp $
|
||||
.\"
|
||||
.\" Copyright (c) 1988, 1993
|
||||
.\" The Regents of the University of California. All rights reserved.
|
||||
.\"
|
||||
.\" Redistribution and use in source and binary forms, with or without
|
||||
.\" modification, are permitted provided that the following conditions
|
||||
.\" are met:
|
||||
.\" 1. Redistributions of source code must retain the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer.
|
||||
.\" 2. Redistributions in binary form must reproduce the above copyright
|
||||
.\" notice, this list of conditions and the following disclaimer in the
|
||||
.\" documentation and/or other materials provided with the distribution.
|
||||
.\" 3. All advertising materials mentioning features or use of this software
|
||||
.\" must display the following acknowledgement:
|
||||
.\" This product includes software developed by the University of
|
||||
.\" California, Berkeley and its contributors.
|
||||
.\" 4. Neither the name of the University nor the names of its contributors
|
||||
.\" may be used to endorse or promote products derived from this software
|
||||
.\" without specific prior written permission.
|
||||
.\"
|
||||
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
.\" ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
.\" SUCH DAMAGE.
|
||||
.\"
|
||||
.\" @(#)sail.6 8.3 (Berkeley) 6/1/94
|
||||
.\"
|
||||
.TH SAIL 6 "June 1, 1994"
|
||||
.UC 4
|
||||
.SH NAME
|
||||
sail \- multi-user wooden ships and iron men
|
||||
.SH SYNOPSIS
|
||||
.B sail
|
||||
[
|
||||
.B \-s
|
||||
[
|
||||
.B \-l
|
||||
] ] [
|
||||
.B \-x
|
||||
] [
|
||||
.B \-b
|
||||
] [
|
||||
.B num
|
||||
]
|
||||
.br
|
||||
.fi
|
||||
.SH DESCRIPTION
|
||||
.I Sail
|
||||
is a computer version of Avalon Hill's game of fighting sail
|
||||
originally developed by S. Craig Taylor.
|
||||
.PP
|
||||
Players of
|
||||
.I Sail
|
||||
take command of an old fashioned Man of War and fight other
|
||||
players or the computer. They may re-enact one of the many
|
||||
historical sea battles recorded in the game, or they can choose
|
||||
a fictional battle.
|
||||
.PP
|
||||
As a sea captain in the
|
||||
.I Sail
|
||||
Navy, the player has complete control over the workings of his ship.
|
||||
He must order every maneuver, change the set of his sails, and judge the
|
||||
right moment to let loose the terrible destruction of his broadsides.
|
||||
In addition to fighting the enemy, he must harness the powers of the wind
|
||||
and sea to make them work for him. The outcome of many battles during the
|
||||
age of sail was decided by the ability of one captain to hold the `weather
|
||||
gage.'
|
||||
.PP
|
||||
The flags are:
|
||||
.TP
|
||||
.B \-s
|
||||
Print the names and ships of the top ten sailors.
|
||||
.TP
|
||||
.B \-l
|
||||
Show the login name. Only effective with \fB-s\fP.
|
||||
.TP
|
||||
.B \-x
|
||||
Play the first available ship instead of prompting for a choice.
|
||||
.TP
|
||||
.B \-b
|
||||
No bells.
|
||||
.SH IMPLEMENTATION
|
||||
.I Sail
|
||||
is really two programs in one. Each player starts up a process which
|
||||
runs his own ship. In addition, a
|
||||
.I driver
|
||||
process is forked (by the first player) to run the computer ships
|
||||
and take care of global bookkeeping.
|
||||
.PP
|
||||
Because the
|
||||
.I driver
|
||||
must calculate moves for each ship it controls, the
|
||||
more ships the computer is playing, the slower the game will appear.
|
||||
.PP
|
||||
If a player joins a game in progress, he will synchronize
|
||||
with the other players (a rather slow process for everyone), and
|
||||
then he may play along with the rest.
|
||||
.PP
|
||||
To implement a multi-user game in Version 7 UNIX, which was the operating
|
||||
system
|
||||
.I Sail
|
||||
was first written under, the communicating processes must use a common
|
||||
temporary file as a place to read and write messages. In addition, a
|
||||
locking mechanism must be provided to ensure exclusive access to the
|
||||
shared file. For example,
|
||||
.I Sail
|
||||
uses a temporary file named /tmp/#sailsink.21 for scenario 21, and
|
||||
corresponding file names for the other scenarios. To provide exclusive
|
||||
access to the temporary file,
|
||||
.I Sail
|
||||
uses a technique stolen from an old game called "pubcaves" by Jeff Cohen.
|
||||
Processes do a busy wait in the loop
|
||||
.br
|
||||
.sp
|
||||
.ce 2
|
||||
for (n = 0; link(sync_file, sync_lock) < 0 && n < 30; n++)
|
||||
sleep(2);
|
||||
.br
|
||||
.sp
|
||||
until they are able to create a link to a file named "/tmp/#saillock.??".
|
||||
The "??" correspond to the scenario number of the game. Since UNIX
|
||||
guarantees that a link will point to only one file, the process that succeeds
|
||||
in linking will have exclusive access to the temporary file.
|
||||
.PP
|
||||
Whether or not this really works is open to speculation. When ucbmiro
|
||||
was rebooted after a crash, the file system check program found 3 links
|
||||
between the
|
||||
.I Sail
|
||||
temporary file and its link file.
|
||||
.SH CONSEQUENCES OF SEPARATE PLAYER AND DRIVER PROCESSES
|
||||
When players do something of global interest, such as moving or firing,
|
||||
the driver must coordinate the action with the other ships in the game.
|
||||
For example, if a player wants to move in a certain direction, he writes a
|
||||
message into the temporary file requesting the driver to move his ship.
|
||||
Each ``turn,'' the driver reads all the messages sent from the players and
|
||||
decides what happened. It then writes back into the temporary file new
|
||||
values of variables, etc.
|
||||
.PP
|
||||
The most noticeable effect this communication has on the game is the
|
||||
delay in moving. Suppose a player types a move for his ship and hits
|
||||
return. What happens then? The player process saves up messages to
|
||||
be written to the temporary file in a buffer. Every 7 seconds or so, the
|
||||
player process gets exclusive access to the temporary file and writes
|
||||
out its buffer to the file. The driver, running asynchronously, must
|
||||
read in the movement command, process it, and write out the results. This
|
||||
takes two exclusive accesses to the temporary file. Finally, when the player
|
||||
process gets around to doing another 7 second update, the results of the
|
||||
move are displayed on the screen. Hence, every movement requires four
|
||||
exclusive accesses to the temporary file (anywhere from 7 to 21 seconds
|
||||
depending upon asynchrony) before the player sees the results of his moves.
|
||||
.PP
|
||||
In practice, the delays are not as annoying as they would appear. There
|
||||
is room for "pipelining" in the movement. After the player writes out
|
||||
a first movement message, a second movement command can then be issued.
|
||||
The first message will be in the temporary file waiting for the driver, and
|
||||
the second will be in the file buffer waiting to be written to the file.
|
||||
Thus, by always typing moves a turn ahead of the time, the player can
|
||||
sail around quite quickly.
|
||||
.PP
|
||||
If the player types several movement commands between two 7 second updates,
|
||||
only the last movement command typed will be seen by the driver. Movement
|
||||
commands within the same update "overwrite" each other, in a sense.
|
||||
.SH THE HISTORY OF SAIL
|
||||
I wrote the first version of
|
||||
.I Sail
|
||||
on a PDP 11/70 in the fall of 1980. Needless to say, the code was horrendous,
|
||||
not portable in any sense of the word, and didn't work. The program was not
|
||||
very modular and had fseeks() and fwrites() every few lines. After a
|
||||
tremendous rewrite from the top down, I got the first working version up by
|
||||
1981. There were several annoying bugs concerning firing broadsides and
|
||||
finding angles.
|
||||
.I Sail
|
||||
uses no floating point, by the way, so the direction routines are rather
|
||||
tricky.
|
||||
Ed Wang rewrote my angle() routine in 1981 to be more correct (although
|
||||
it still doesn't work perfectly), and he added code to let a player select
|
||||
which ship he wanted at the start of the game (instead of the first one
|
||||
available).
|
||||
.PP
|
||||
Captain Happy (Craig Leres) is responsible for making
|
||||
.I Sail
|
||||
portable for the first time. This was no easy task, by the way. Constants
|
||||
like 2 and 10 were very frequent in the code. I also became famous for
|
||||
using "Riggle Memorial Structures" in
|
||||
.I Sail.
|
||||
Many of my structure references are so long that they run off the line
|
||||
printer page. Here is an example, if you promise not to laugh.
|
||||
.br
|
||||
.sp
|
||||
.ce
|
||||
specs[scene[flog.fgamenum].ship[flog.fshipnum].shipnum].pts
|
||||
.br
|
||||
.sp
|
||||
.PP
|
||||
.I Sail
|
||||
received its fourth and most thorough rewrite in the summer and fall
|
||||
of 1983. Ed Wang rewrote and modularized the code (a monumental feat)
|
||||
almost from scratch. Although he introduced many new bugs, the final
|
||||
result was very much cleaner and (?) faster. He added window movement
|
||||
commands and find ship commands.
|
||||
.SH HISTORICAL INFO
|
||||
Old Square Riggers were very maneuverable ships capable of intricate
|
||||
sailing. Their only disadvantage was an inability to sail very
|
||||
close to the wind. The design of a wooden ship allowed only for the
|
||||
guns to bear to the left and right sides. A few guns of small
|
||||
aspect (usually 6 or 9 pounders) could point forward, but their
|
||||
effect was small compared to a 68 gun broadside of 24 or 32 pounders.
|
||||
The guns bear approximately like so:
|
||||
.ne 1i
|
||||
.nf
|
||||
|
||||
\\
|
||||
b----------------
|
||||
---0
|
||||
\\
|
||||
\\
|
||||
\\ up to a range of ten (for round shot)
|
||||
\\
|
||||
\\
|
||||
\\
|
||||
|
||||
.fi
|
||||
An interesting phenomenon occurred when a broadside was fired
|
||||
down the length of an enemy ship. The shot tended to bounce along
|
||||
the deck and did several times more damage. This phenomenon was called
|
||||
a rake. Because the bows of a ship are very strong and present a smaller
|
||||
target than the stern, a stern rake (firing from the stern to the bow) causes
|
||||
more damage than a bow rake.
|
||||
.nf
|
||||
|
||||
b
|
||||
00 ---- Stern rake!
|
||||
a
|
||||
|
||||
.fi
|
||||
Most ships were equipped with carronades, which were very large, close
|
||||
range cannons. American ships from the revolution until the War of 1812
|
||||
were almost entirely armed with carronades.
|
||||
.PP
|
||||
The period of history covered in
|
||||
.I Sail
|
||||
is approximately from the 1770's until the end of Napoleonic France in 1815.
|
||||
There are many excellent books about the age of sail. My favorite author
|
||||
is Captain Frederick Marryat. More contemporary authors include C.S. Forester
|
||||
and Alexander Kent.
|
||||
.PP
|
||||
Fighting ships came in several sizes classed by armament. The mainstays of
|
||||
any fleet were its "Ships of the Line", or "Line of Battle Ships". They
|
||||
were so named because these ships fought together in great lines. They were
|
||||
close enough for mutual support, yet every ship could fire both its broadsides.
|
||||
We get the modern words "ocean liner," or "liner," and "battleship" from
|
||||
"ship of the line." The most common size was the 74 gun two decked
|
||||
ship of the line. The two gun decks usually mounted 18 and 24 pounder guns.
|
||||
.PP
|
||||
The pride of the fleet were the first rates. These were huge three decked
|
||||
ships of the line mounting 80 to 136 guns. The guns in the three tiers
|
||||
were usually 18, 24, and 32 pounders in that order from top to bottom.
|
||||
.PP
|
||||
Various other ships came next. They were almost all "razees," or ships
|
||||
of the line with one deck sawed off. They mounted 40-64 guns and were
|
||||
a poor cross between a frigate and a line of battle ship. They neither
|
||||
had the speed of the former nor the firepower of the latter.
|
||||
.PP
|
||||
Next came the "eyes of the fleet." Frigates came in many sizes mounting
|
||||
anywhere from 32 to 44 guns. They were very handy vessels. They could
|
||||
outsail anything bigger and outshoot anything smaller. Frigates didn't
|
||||
fight in lines of battle as the much bigger 74's did. Instead, they
|
||||
harassed the enemy's rear or captured crippled ships. They were much
|
||||
more useful in missions away from the fleet, such as cutting out expeditions
|
||||
or boat actions. They could hit hard and get away fast.
|
||||
.PP
|
||||
Lastly, there were the corvettes, sloops, and brigs. These were smaller
|
||||
ships mounting typically fewer than 20 guns. A corvette was only slightly
|
||||
smaller than a frigate, so one might have up to 30 guns. Sloops were used
|
||||
for carrying dispatches or passengers. Brigs were something you built for
|
||||
land-locked lakes.
|
||||
.SH SAIL PARTICULARS
|
||||
Ships in
|
||||
.I Sail
|
||||
are represented by two characters. One character represents the bow of
|
||||
the ship, and the other represents the stern. Ships have nationalities
|
||||
and numbers. The first ship of a nationality is number 0, the second
|
||||
number 1, etc. Therefore, the first British ship in a game would be
|
||||
printed as "b0". The second Brit would be "b1", and the fifth Don
|
||||
would be "s4".
|
||||
.PP
|
||||
Ships can set normal sails, called Battle Sails, or bend on extra canvas
|
||||
called Full Sails. A ship under full sail is a beautiful sight indeed,
|
||||
and it can move much faster than a ship under Battle Sails. The only
|
||||
trouble is, with full sails set, there is so much tension on sail and
|
||||
rigging that a well aimed round shot can burst a sail into ribbons where
|
||||
it would only cause a little hole in a loose sail. For this reason,
|
||||
rigging damage is doubled on a ship with full sails set. Don't let
|
||||
that discourage you from using full sails. I like to keep them up
|
||||
right into the heat of battle. A ship
|
||||
with full sails set has a capital letter for its nationality. E.g.,
|
||||
a Frog, "f0", with full sails set would be printed as "F0".
|
||||
.PP
|
||||
When a ship is battered into a listing hulk, the last man aboard "strikes
|
||||
the colors." This ceremony is the ship's formal surrender. The nationality
|
||||
character
|
||||
of a surrendered ship is printed as "!". E.g., the Frog of our last example
|
||||
would soon be "!0".
|
||||
.PP
|
||||
A ship has a random chance of catching fire or sinking when it reaches the
|
||||
stage of listing hulk. A sinking ship has a "~" printed for its nationality,
|
||||
and a ship on fire and about to explode has a "#" printed.
|
||||
.PP
|
||||
Captured ships become the nationality of the prize crew. Therefore, if
|
||||
an American ship captures a British ship, the British ship will have an
|
||||
"a" printed for its nationality. In addition, the ship number is changed
|
||||
to "&","'", "(", ,")", "*", or "+" depending upon the original number,
|
||||
be it 0,1,2,3,4, or 5. E.g., the "b0" captured by an American becomes the
|
||||
"a&". The "s4" captured by a Frog becomes the "f*".
|
||||
.PP
|
||||
The ultimate example is, of course, an exploding Brit captured by an
|
||||
American: "#&".
|
||||
.SH MOVEMENT
|
||||
Movement is the most confusing part of
|
||||
.I Sail
|
||||
to many. Ships can head in 8 directions:
|
||||
.nf
|
||||
|
||||
0 0 0
|
||||
b b b0 b b b 0b b
|
||||
0 0 0
|
||||
|
||||
.fi
|
||||
The stern of a ship moves when it turns. The bow remains stationary.
|
||||
Ships can always turn, regardless of the wind (unless they are becalmed).
|
||||
All ships drift when they lose headway. If a ship doesn't move forward
|
||||
at all for two turns, it will begin to drift. If a ship has begun to
|
||||
drift, then it must move forward before it turns, if it plans to do
|
||||
more than make a right or left turn, which is always possible.
|
||||
.PP
|
||||
Movement commands to
|
||||
.I Sail
|
||||
are a string of forward moves and turns. An example is "l3". It will
|
||||
turn a ship left and then move it ahead 3 spaces. In the drawing above,
|
||||
the "b0" made 7 successive left turns. When
|
||||
.I Sail
|
||||
prompts you for a move, it prints three characters of import. E.g.,
|
||||
.nf
|
||||
move (7, 4):
|
||||
.fi
|
||||
The first number is the maximum number of moves you can make,
|
||||
including turns. The second number is the maximum number of turns
|
||||
you can make. Between the numbers is sometimes printed a quote "'".
|
||||
If the quote is present, it means that your ship has been drifting, and
|
||||
you must move ahead to regain headway before you turn (see note above).
|
||||
Some of the possible moves for the example above are as follows:
|
||||
.nf
|
||||
|
||||
move (7, 4): 7
|
||||
move (7, 4): 1
|
||||
move (7, 4): d /* drift, or do nothing */
|
||||
move (7, 4): 6r
|
||||
move (7, 4): 5r1
|
||||
move (7, 4): 4r1r
|
||||
move (7, 4): l1r1r2
|
||||
move (7, 4): 1r1r1r1
|
||||
|
||||
.fi
|
||||
Because square riggers performed so poorly sailing into the wind, if at
|
||||
any point in a movement command you turn into the wind, the movement stops
|
||||
there. E.g.,
|
||||
.ne 1i
|
||||
.nf
|
||||
|
||||
move (7, 4): l1l4
|
||||
Movement Error;
|
||||
Helm: l1l
|
||||
|
||||
.fi
|
||||
Moreover, whenever you make a turn, your movement allowance drops to
|
||||
min(what's left, what you would have at the new attitude). In short,
|
||||
if you turn closer to the wind, you most likely won't be able to sail the
|
||||
full allowance printed in the "move" prompt.
|
||||
.PP
|
||||
Old sailing captains had to keep an eye constantly on the wind. Captains
|
||||
in
|
||||
.I Sail
|
||||
are no different. A ship's ability to move depends on its attitude to the
|
||||
wind. The best angle possible is to have the wind off your quarter, that is,
|
||||
just off the stern. The direction rose on the side of the screen gives the
|
||||
possible movements for your ship at all positions to the wind. Battle
|
||||
sail speeds are given first, and full sail speeds are given in parenthesis.
|
||||
.nf
|
||||
|
||||
0 1(2)
|
||||
\\|/
|
||||
-^-3(6)
|
||||
/|\\
|
||||
| 4(7)
|
||||
3(6)
|
||||
|
||||
.fi
|
||||
Pretend the bow of your ship (the "^") is pointing upward and the wind is
|
||||
blowing from the bottom to the top of the page. The
|
||||
numbers at the bottom "3(6)" will be your speed under battle or full
|
||||
sails in such a situation. If the wind is off your quarter, then you
|
||||
can move "4(7)". If the wind is off your beam, "3(6)". If the wind is
|
||||
off your bow, then you can only move "1(2)". Facing into the wind, you
|
||||
can't move at all. Ships facing into the wind were said to be "in irons".
|
||||
.SH WINDSPEED AND DIRECTION
|
||||
The windspeed and direction is displayed as a little weather vane on the
|
||||
side of the screen. The number in the middle of the vane indicates the wind
|
||||
speed, and the + to - indicates the wind direction. The wind blows from
|
||||
the + sign (high pressure) to the - sign (low pressure). E.g.,
|
||||
.nf
|
||||
|
||||
|
|
||||
3
|
||||
+
|
||||
.fi
|
||||
.PP
|
||||
The wind speeds are 0 = becalmed, 1 = light breeze, 2 = moderate breeze,
|
||||
3 = fresh breeze, 4 = strong breeze, 5 = gale, 6 = full gale, 7 = hurricane.
|
||||
If a hurricane shows up, all ships are destroyed.
|
||||
.SH GRAPPLING AND FOULING
|
||||
If two ships collide, they run the risk of becoming tangled together. This
|
||||
is called "fouling." Fouled ships are stuck together, and neither can move.
|
||||
They can unfoul each other if they want to. Boarding parties can only be
|
||||
sent across to ships when the antagonists are either fouled or grappled.
|
||||
.PP
|
||||
Ships can grapple each other by throwing grapnels into the rigging of
|
||||
the other.
|
||||
.PP
|
||||
The number of fouls and grapples you have are displayed on the upper
|
||||
right of the screen.
|
||||
.SH BOARDING
|
||||
Boarding was a very costly venture in terms of human life. Boarding parties
|
||||
may be formed in
|
||||
.I Sail
|
||||
to either board an enemy ship or to defend your own ship against attack.
|
||||
Men organized as Defensive Boarding Parties fight twice as hard to save
|
||||
their ship as men left unorganized.
|
||||
.PP
|
||||
The boarding strength of a crew depends upon its quality and upon the
|
||||
number of men sent.
|
||||
.SH CREW QUALITY
|
||||
The British seaman was world renowned for his sailing abilities. American
|
||||
sailors, however, were actually the best seamen in the world. Because the
|
||||
American Navy offered twice the wages of the Royal Navy, British seamen
|
||||
who liked the sea defected to America by the thousands.
|
||||
.PP
|
||||
In
|
||||
.I Sail,
|
||||
crew quality is quantized into 5 energy levels. "Elite" crews can outshoot
|
||||
and outfight all other sailors. "Crack" crews are next. "Mundane" crews
|
||||
are average, and "Green" and "Mutinous" crews are below average. A good
|
||||
rule of thumb is that "Crack" or "Elite" crews get one extra hit
|
||||
per broadside compared to "Mundane" crews. Don't expect too much from
|
||||
"Green" crews.
|
||||
.pl -1
|
||||
.SH BROADSIDES
|
||||
Your two broadsides may be loaded with four kinds of shot: grape, chain,
|
||||
round, and double. You have guns and carronades in both the port and starboard
|
||||
batteries. Carronades only have a range of two, so you have to get in
|
||||
close to be able to fire them. You have the choice of firing at the hull
|
||||
or rigging of another ship. If the range of the ship is greater than 6,
|
||||
then you may only shoot at the rigging.
|
||||
.PP
|
||||
The types of shot and their advantages are:
|
||||
.SH ROUND
|
||||
Range of 10. Good for hull or rigging hits.
|
||||
.SH DOUBLE
|
||||
Range of 1. Extra good for hull or rigging hits.
|
||||
Double takes two turns to load.
|
||||
.SH CHAIN
|
||||
Range of 3. Excellent for tearing down rigging.
|
||||
Cannot damage hull or guns, though.
|
||||
.SH GRAPE
|
||||
Range of 1. Sometimes devastating against enemy crews.
|
||||
.PP
|
||||
On the side of the screen is displayed some vital information about your
|
||||
ship:
|
||||
.nf
|
||||
|
||||
Load D! R!
|
||||
Hull 9
|
||||
Crew 4 4 2
|
||||
Guns 4 4
|
||||
Carr 2 2
|
||||
Rigg 5 5 5 5
|
||||
|
||||
.fi
|
||||
"Load" shows what your port (left) and starboard (right) broadsides are
|
||||
loaded with. A "!" after the type of shot indicates that it is an initial
|
||||
broadside. Initial broadside were loaded with care before battle and before
|
||||
the decks ran red with blood. As a consequence, initial broadsides are a
|
||||
little more effective than broadsides loaded later. A "*" after the type of
|
||||
shot indicates that the gun
|
||||
crews are still loading it, and you cannot fire yet. "Hull" shows how much
|
||||
hull you have left. "Crew" shows your three sections of crew. As your
|
||||
crew dies off, your ability to fire decreases. "Guns" and "Carr" show
|
||||
your port and starboard guns. As you lose guns, your ability to fire
|
||||
decreases. "Rigg" shows how much rigging you have on your 3 or 4 masts.
|
||||
As rigging is shot away, you lose mobility.
|
||||
.SH EFFECTIVENESS OF FIRE
|
||||
It is very dramatic when a ship fires its thunderous broadsides, but the
|
||||
mere opportunity to fire them does not guarantee any hits. Many factors
|
||||
influence the destructive force of a broadside. First of all, and the chief
|
||||
factor, is distance. It is harder to hit a ship at range ten than it is
|
||||
to hit one sloshing alongside. Next is raking. Raking fire, as
|
||||
mentioned before,
|
||||
can sometimes dismast a ship at range ten. Next, crew size and quality affects
|
||||
the damage done by a broadside. The number of guns firing also bears on the
|
||||
point,
|
||||
so to speak. Lastly, weather affects the accuracy of a broadside. If the
|
||||
seas are high (5 or 6), then the lower gunports of ships of the line can't
|
||||
even be opened to run out the guns. This gives frigates and other flush
|
||||
decked vessels an advantage in a storm. The scenario
|
||||
.I Pellew vs. The Droits de L'Homme
|
||||
takes advantage of this peculiar circumstance.
|
||||
.SH REPAIRS
|
||||
Repairs may be made to your Hull, Guns, and Rigging at the slow rate of
|
||||
two points per three turns. The message "Repairs Completed" will be
|
||||
printed if no more repairs can be made.
|
||||
.SH PECULIARITIES OF COMPUTER SHIPS
|
||||
Computer ships in
|
||||
.I Sail
|
||||
follow all the rules above with a few exceptions. Computer ships never
|
||||
repair damage. If they did, the players could never beat them. They
|
||||
play well enough as it is. As a consolation, the computer ships can fire double
|
||||
shot every turn. That fluke is a good reason to keep your distance. The
|
||||
.I
|
||||
Driver
|
||||
figures out the moves of the computer ships. It computes them with a typical
|
||||
A.I. distance function and a depth first search to find the maximum "score."
|
||||
It seems to work fairly well, although I'll be the first to admit it isn't
|
||||
perfect.
|
||||
.SH HOW TO PLAY
|
||||
Commands are given to
|
||||
.I Sail
|
||||
by typing a single character. You will then be prompted for further
|
||||
input. A brief summary of the commands follows.
|
||||
.br
|
||||
.SH COMMAND SUMMARY
|
||||
.nf
|
||||
|
||||
'f' Fire broadsides if they bear
|
||||
'l' Reload
|
||||
'L' Unload broadsides (to change ammo)
|
||||
'm' Move
|
||||
'i' Print the closest ship
|
||||
'I' Print all ships
|
||||
'F' Find a particular ship or ships (e.g. "a?" for all Americans)
|
||||
's' Send a message around the fleet
|
||||
'b' Attempt to board an enemy ship
|
||||
'B' Recall boarding parties
|
||||
'c' Change set of sail
|
||||
'r' Repair
|
||||
'u' Attempt to unfoul
|
||||
'g' Grapple/ungrapple
|
||||
'v' Print version number of game
|
||||
'^L' Redraw screen
|
||||
'Q' Quit
|
||||
|
||||
'C' Center your ship in the window
|
||||
'U' Move window up
|
||||
'D','N' Move window down
|
||||
'H' Move window left
|
||||
'J' Move window right
|
||||
'S' Toggle window to follow your ship or stay where it is
|
||||
|
||||
.fi
|
||||
.bg
|
||||
.SH SCENARIOS
|
||||
Here is a summary of the scenarios in
|
||||
.I Sail:
|
||||
|
||||
.br
|
||||
.SH Ranger vs. Drake:
|
||||
.nf
|
||||
Wind from the N, blowing a fresh breeze.
|
||||
|
||||
(a) Ranger 19 gun Sloop (crack crew) (7 pts)
|
||||
(b) Drake 17 gun Sloop (crack crew) (6 pts)
|
||||
.SH The Battle of Flamborough Head:
|
||||
.nf
|
||||
Wind from the S, blowing a fresh breeze.
|
||||
|
||||
.fi
|
||||
This is John Paul Jones' first famous battle. Aboard the Bonhomme
|
||||
Richard, he was able to overcome the Serapis's greater firepower
|
||||
by quickly boarding her.
|
||||
.nf
|
||||
|
||||
(a) Bonhomme Rich 42 gun Corvette (crack crew) (11 pts)
|
||||
(b) Serapis 44 gun Frigate (crack crew) (12 pts)
|
||||
.SH Arbuthnot and Des Touches:
|
||||
.nf
|
||||
Wind from the N, blowing a gale.
|
||||
|
||||
(b) America 64 gun Ship of the Line (crack crew) (20 pts)
|
||||
(b) Befford 74 gun Ship of the Line (crack crew) (26 pts)
|
||||
(b) Adamant 50 gun Ship of the Line (crack crew) (17 pts)
|
||||
(b) London 98 gun 3 Decker SOL (crack crew) (28 pts)
|
||||
(b) Royal Oak 74 gun Ship of the Line (crack crew) (26 pts)
|
||||
(f) Neptune 74 gun Ship of the Line (average crew) (24 pts)
|
||||
(f) Duc de Bourgogne 80 gun 3 Decker SOL (average crew) (27 pts)
|
||||
(f) Conquerant 74 gun Ship of the Line (average crew) (24 pts)
|
||||
(f) Provence 64 gun Ship of the Line (average crew) (18 pts)
|
||||
(f) Romulus 44 gun Ship of the Line (average crew) (10 pts)
|
||||
.SH Suffren and Hughes:
|
||||
.nf
|
||||
|
||||
Wind from the S, blowing a fresh breeze.
|
||||
|
||||
(b) Monmouth 74 gun Ship of the Line (average crew) (24 pts)
|
||||
(b) Hero 74 gun Ship of the Line (crack crew) (26 pts)
|
||||
(b) Isis 50 gun Ship of the Line (crack crew) (17 pts)
|
||||
(b) Superb 74 gun Ship of the Line (crack crew) (27 pts)
|
||||
(b) Burford 74 gun Ship of the Line (average crew) (24 pts)
|
||||
(f) Flamband 50 gun Ship of the Line (average crew) (14 pts)
|
||||
(f) Annibal 74 gun Ship of the Line (average crew) (24 pts)
|
||||
(f) Severe 64 gun Ship of the Line (average crew) (18 pts)
|
||||
(f) Brilliant 80 gun Ship of the Line (crack crew) (31 pts)
|
||||
(f) Sphinx 80 gun Ship of the Line (average crew) (27 pts)
|
||||
.SH Nymphe vs. Cleopatre:
|
||||
.nf
|
||||
Wind from the S, blowing a fresh breeze.
|
||||
|
||||
(b) Nymphe 36 gun Frigate (crack crew) (11 pts)
|
||||
(f) Cleopatre 36 gun Frigate (average crew) (10 pts)
|
||||
.SH Mars vs. Hercule:
|
||||
Wind from the S, blowing a fresh breeze.
|
||||
.nf
|
||||
(b) Mars 74 gun Ship of the Line (crack crew) (26 pts)
|
||||
(f) Hercule 74 gun Ship of the Line (average crew) (23 pts)
|
||||
.SH Ambuscade vs. Baionnaise:
|
||||
.nf
|
||||
Wind from the N, blowing a fresh breeze.
|
||||
|
||||
(b) Ambuscade 32 gun Frigate (average crew) (9 pts)
|
||||
(f) Baionnaise 24 gun Corvette (average crew) (9 pts)
|
||||
.SH Constellation vs. Insurgent:
|
||||
.nf
|
||||
Wind from the S, blowing a gale.
|
||||
|
||||
(a) Constellation 38 gun Corvette (elite crew) (17 pts)
|
||||
(f) Insurgent 36 gun Corvette (average crew) (11 pts)
|
||||
.SH Constellation vs. Vengeance:
|
||||
.nf
|
||||
Wind from the S, blowing a fresh breeze.
|
||||
|
||||
(a) Constellation 38 gun Corvette (elite crew) (17 pts)
|
||||
(f) Vengeance 40 gun Frigate (average crew) (15 pts)
|
||||
.SH The Battle of Lissa:
|
||||
.nf
|
||||
Wind from the S, blowing a fresh breeze.
|
||||
|
||||
(b) Amphion 32 gun Frigate (elite crew) (13 pts)
|
||||
(b) Active 38 gun Frigate (elite crew) (18 pts)
|
||||
(b) Volage 22 gun Frigate (elite crew) (11 pts)
|
||||
(b) Cerberus 32 gun Frigate (elite crew) (13 pts)
|
||||
(f) Favorite 40 gun Frigate (average crew) (15 pts)
|
||||
(f) Flore 40 gun Frigate (average crew) (15 pts)
|
||||
(f) Danae 40 gun Frigate (crack crew) (17 pts)
|
||||
(f) Bellona 32 gun Frigate (green crew) (9 pts)
|
||||
(f) Corona 40 gun Frigate (green crew) (12 pts)
|
||||
(f) Carolina 32 gun Frigate (green crew) (7 pts)
|
||||
.SH Constitution vs. Guerriere:
|
||||
.nf
|
||||
Wind from the SW, blowing a gale.
|
||||
|
||||
(a) Constitution 44 gun Corvette (elite crew) (24 pts)
|
||||
(b) Guerriere 38 gun Frigate (crack crew) (15 pts)
|
||||
.SH United States vs. Macedonian:
|
||||
.nf
|
||||
Wind from the S, blowing a fresh breeze.
|
||||
|
||||
(a) United States 44 gun Frigate (elite crew) (24 pts)
|
||||
(b) Macedonian 38 gun Frigate (crack crew) (16 pts)
|
||||
.SH Constitution vs. Java:
|
||||
.nf
|
||||
Wind from the S, blowing a fresh breeze.
|
||||
|
||||
(a) Constitution 44 gun Corvette (elite crew) (24 pts)
|
||||
(b) Java 38 gun Corvette (crack crew) (19 pts)
|
||||
.SH Chesapeake vs. Shannon:
|
||||
.nf
|
||||
Wind from the S, blowing a fresh breeze.
|
||||
|
||||
(a) Chesapeake 38 gun Frigate (average crew) (14 pts)
|
||||
(b) Shannon 38 gun Frigate (elite crew) (17 pts)
|
||||
.SH The Battle of Lake Erie:
|
||||
.nf
|
||||
Wind from the S, blowing a light breeze.
|
||||
|
||||
(a) Lawrence 20 gun Sloop (crack crew) (9 pts)
|
||||
(a) Niagara 20 gun Sloop (elite crew) (12 pts)
|
||||
(b) Lady Prevost 13 gun Brig (crack crew) (5 pts)
|
||||
(b) Detroit 19 gun Sloop (crack crew) (7 pts)
|
||||
(b) Q. Charlotte 17 gun Sloop (crack crew) (6 pts)
|
||||
.SH Wasp vs. Reindeer:
|
||||
.nf
|
||||
Wind from the S, blowing a light breeze.
|
||||
|
||||
(a) Wasp 20 gun Sloop (elite crew) (12 pts)
|
||||
(b) Reindeer 18 gun Sloop (elite crew) (9 pts)
|
||||
.SH Constitution vs. Cyane and Levant:
|
||||
.br
|
||||
Wind from the S, blowing a moderate breeze.
|
||||
|
||||
(a) Constitution 44 gun Corvette (elite crew) (24 pts)
|
||||
(b) Cyane 24 gun Sloop (crack crew) (11 pts)
|
||||
(b) Levant 20 gun Sloop (crack crew) (10 pts)
|
||||
.br
|
||||
.SH Pellew vs. Droits de L'Homme:
|
||||
.nf
|
||||
Wind from the N, blowing a gale.
|
||||
|
||||
(b) Indefatigable 44 gun Frigate (elite crew) (14 pts)
|
||||
(b) Amazon 36 gun Frigate (crack crew) (14 pts)
|
||||
(f) Droits L'Hom 74 gun Ship of the Line (average crew) (24 pts)
|
||||
.SH Algeciras:
|
||||
.nf
|
||||
Wind from the SW, blowing a moderate breeze.
|
||||
|
||||
(b) Caesar 80 gun Ship of the Line (crack crew) (31 pts)
|
||||
(b) Pompee 74 gun Ship of the Line (crack crew) (27 pts)
|
||||
(b) Spencer 74 gun Ship of the Line (crack crew) (26 pts)
|
||||
(b) Hannibal 98 gun 3 Decker SOL (crack crew) (28 pts)
|
||||
(s) Real-Carlos 112 gun 3 Decker SOL (green crew) (27 pts)
|
||||
(s) San Fernando 96 gun 3 Decker SOL (green crew) (24 pts)
|
||||
(s) Argonauta 80 gun Ship of the Line (green crew) (23 pts)
|
||||
(s) San Augustine 74 gun Ship of the Line (green crew) (20 pts)
|
||||
(f) Indomptable 80 gun Ship of the Line (average crew) (27 pts)
|
||||
(f) Desaix 74 gun Ship of the Line (average crew) (24 pts)
|
||||
.SH Lake Champlain:
|
||||
.nf
|
||||
Wind from the N, blowing a fresh breeze.
|
||||
|
||||
(a) Saratoga 26 gun Sloop (crack crew) (12 pts)
|
||||
(a) Eagle 20 gun Sloop (crack crew) (11 pts)
|
||||
(a) Ticonderoga 17 gun Sloop (crack crew) (9 pts)
|
||||
(a) Preble 7 gun Brig (crack crew) (4 pts)
|
||||
(b) Confiance 37 gun Frigate (crack crew) (14 pts)
|
||||
(b) Linnet 16 gun Sloop (elite crew) (10 pts)
|
||||
(b) Chubb 11 gun Brig (crack crew) (5 pts)
|
||||
.SH Last Voyage of the USS President:
|
||||
.nf
|
||||
Wind from the N, blowing a fresh breeze.
|
||||
|
||||
(a) President 44 gun Frigate (elite crew) (24 pts)
|
||||
(b) Endymion 40 gun Frigate (crack crew) (17 pts)
|
||||
(b) Pomone 44 gun Frigate (crack crew) (20 pts)
|
||||
(b) Tenedos 38 gun Frigate (crack crew) (15 pts)
|
||||
.SH Hornblower and the Natividad:
|
||||
.nf
|
||||
Wind from the E, blowing a gale.
|
||||
|
||||
.fi
|
||||
A scenario for you Horny fans. Remember, he sank the Natividad
|
||||
against heavy odds and winds. Hint: don't try to board the Natividad,
|
||||
her crew is much bigger, albeit green.
|
||||
.nf
|
||||
|
||||
(b) Lydia 36 gun Frigate (elite crew) (13 pts)
|
||||
(s) Natividad 50 gun Ship of the Line (green crew) (14 pts)
|
||||
.SH Curse of the Flying Dutchman:
|
||||
.nf
|
||||
Wind from the S, blowing a fresh breeze.
|
||||
|
||||
Just for fun, take the Piece of cake.
|
||||
|
||||
(s) Piece of Cake 24 gun Corvette (average crew) (9 pts)
|
||||
(f) Flying Dutchy 120 gun 3 Decker SOL (elite crew) (43 pts)
|
||||
.SH The South Pacific:
|
||||
.nf
|
||||
Wind from the S, blowing a strong breeze.
|
||||
|
||||
(a) USS Scurvy 136 gun 3 Decker SOL (mutinous crew) (27 pts)
|
||||
(b) HMS Tahiti 120 gun 3 Decker SOL (elite crew) (43 pts)
|
||||
(s) Australian 32 gun Frigate (average crew) (9 pts)
|
||||
(f) Bikini Atoll 7 gun Brig (crack crew) (4 pts)
|
||||
.SH Hornblower and the battle of Rosas bay:
|
||||
.nf
|
||||
Wind from the E, blowing a fresh breeze.
|
||||
|
||||
The only battle Hornblower ever lost. He was able to dismast one
|
||||
ship and stern rake the others though. See if you can do as well.
|
||||
.nf
|
||||
|
||||
(b) Sutherland 74 gun Ship of the Line (crack crew) (26 pts)
|
||||
(f) Turenne 80 gun 3 Decker SOL (average crew) (27 pts)
|
||||
(f) Nightmare 74 gun Ship of the Line (average crew) (24 pts)
|
||||
(f) Paris 112 gun 3 Decker SOL (green crew) (27 pts)
|
||||
(f) Napoleon 74 gun Ship of the Line (green crew) (20 pts)
|
||||
.SH Cape Horn:
|
||||
.nf
|
||||
Wind from the NE, blowing a strong breeze.
|
||||
|
||||
(a) Concord 80 gun Ship of the Line (average crew) (27 pts)
|
||||
(a) Berkeley 98 gun 3 Decker SOL (crack crew) (28 pts)
|
||||
(b) Thames 120 gun 3 Decker SOL (elite crew) (43 pts)
|
||||
(s) Madrid 112 gun 3 Decker SOL (green crew) (27 pts)
|
||||
(f) Musket 80 gun 3 Decker SOL (average crew) (27 pts)
|
||||
.SH New Orleans:
|
||||
.nf
|
||||
Wind from the SE, blowing a fresh breeze.
|
||||
|
||||
Watch that little Cypress go!
|
||||
|
||||
(a) Alligator 120 gun 3 Decker SOL (elite crew) (43 pts)
|
||||
(b) Firefly 74 gun Ship of the Line (crack crew) (27 pts)
|
||||
(b) Cypress 44 gun Frigate (elite crew) (14 pts)
|
||||
.SH Botany Bay:
|
||||
.nf
|
||||
Wind from the N, blowing a fresh breeze.
|
||||
|
||||
(b) Shark 64 gun Ship of the Line (average crew) (18 pts)
|
||||
(f) Coral Snake 44 gun Corvette (elite crew) (24 pts)
|
||||
(f) Sea Lion 44 gun Frigate (elite crew) (24 pts)
|
||||
.SH Voyage to the Bottom of the Sea:
|
||||
.nf
|
||||
Wind from the NW, blowing a fresh breeze.
|
||||
|
||||
This one is dedicated to Richard Basehart and David Hedison.
|
||||
|
||||
(a) Seaview 120 gun 3 Decker SOL (elite crew) (43 pts)
|
||||
(a) Flying Sub 40 gun Frigate (crack crew) (17 pts)
|
||||
(b) Mermaid 136 gun 3 Decker SOL (mutinous crew) (27 pts)
|
||||
(s) Giant Squid 112 gun 3 Decker SOL (green crew) (27 pts)
|
||||
.SH Frigate Action:
|
||||
.nf
|
||||
Wind from the E, blowing a fresh breeze.
|
||||
|
||||
(a) Killdeer 40 gun Frigate (average crew) (15 pts)
|
||||
(b) Sandpiper 40 gun Frigate (average crew) (15 pts)
|
||||
(s) Curlew 38 gun Frigate (crack crew) (16 pts)
|
||||
.SH The Battle of Midway:
|
||||
.nf
|
||||
Wind from the E, blowing a moderate breeze.
|
||||
|
||||
(a) Enterprise 80 gun Ship of the Line (crack crew) (31 pts)
|
||||
(a) Yorktown 80 gun Ship of the Line (average crew) (27 pts)
|
||||
(a) Hornet 74 gun Ship of the Line (average crew) (24 pts)
|
||||
(j) Akagi 112 gun 3 Decker SOL (green crew) (27 pts)
|
||||
(j) Kaga 96 gun 3 Decker SOL (green crew) (24 pts)
|
||||
(j) Soryu 80 gun Ship of the Line (green crew) (23 pts)
|
||||
|
||||
.SH Star Trek:
|
||||
.nf
|
||||
Wind from the S, blowing a fresh breeze.
|
||||
|
||||
(a) Enterprise 450 gun Ship of the Line (elite crew) (75 pts)
|
||||
(a) Yorktown 450 gun Ship of the Line (elite crew) (75 pts)
|
||||
(a) Reliant 450 gun Ship of the Line (elite crew) (75 pts)
|
||||
(a) Galileo 450 gun Ship of the Line (elite crew) (75 pts)
|
||||
(k) Kobayashi Maru 450 gun Ship of the Line (elite crew) (75 pts)
|
||||
(k) Klingon II 450 gun Ship of the Line (elite crew) (75 pts)
|
||||
(o) Red Orion 450 gun Ship of the Line (elite crew) (75 pts)
|
||||
(o) Blue Orion 450 gun Ship of the Line (elite crew) (75 pts)
|
||||
|
||||
.SH CONCLUSION
|
||||
|
||||
.I Sail
|
||||
has been a group effort.
|
||||
|
||||
.SH AUTHOR
|
||||
Dave Riggle
|
||||
.SH CO-AUTHOR
|
||||
Ed Wang
|
||||
.SH REFITTING
|
||||
Craig Leres
|
||||
.SH CONSULTANTS
|
||||
.nf
|
||||
Chris Guthrie
|
||||
Captain Happy
|
||||
Horatio Nelson
|
||||
and many valiant others...
|
||||
.fi
|
||||
.SH "REFERENCES"
|
||||
.nf
|
||||
Wooden Ships & Iron Men, by Avalon Hill
|
||||
Captain Horatio Hornblower Novels, (13 of them) by C.S. Forester
|
||||
Captain Richard Bolitho Novels, (12 of them) by Alexander Kent
|
||||
The Complete Works of Captain Frederick Marryat, (about 20) especially
|
||||
.in +6n
|
||||
Mr. Midshipman Easy
|
||||
Peter Simple
|
||||
Jacob Faithful
|
||||
Japhet in Search of a Father
|
||||
Snarleyyow, or The Dog Fiend
|
||||
Frank Mildmay, or The Naval Officer
|
||||
.in -6n
|
||||
.SH BUGS
|
||||
Probably a few, and please report them to "riggle@ernie.berkeley.edu" and
|
||||
"edward@ucbarpa.berkeley.edu"
|
||||
531
sail/sync.c
Normal file
531
sail/sync.c
Normal file
@@ -0,0 +1,531 @@
|
||||
/* $NetBSD: sync.c,v 1.10 1998/09/11 14:15:46 hubertf Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)sync.c 8.2 (Berkeley) 4/28/95";
|
||||
#else
|
||||
__RCSID("$NetBSD: sync.c,v 1.10 1998/09/11 14:15:46 hubertf Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
#include <fcntl.h>
|
||||
#include <errno.h>
|
||||
#ifdef __STDC__
|
||||
#include <stdarg.h>
|
||||
#else
|
||||
#include <varargs.h>
|
||||
#endif
|
||||
#include <stdlib.h>
|
||||
#include <unistd.h>
|
||||
#include <sys/file.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/stat.h>
|
||||
#include <time.h>
|
||||
#include "extern.h"
|
||||
#include "pathnames.h"
|
||||
|
||||
#define BUFSIZE 4096
|
||||
|
||||
static char sync_buf[BUFSIZE];
|
||||
static char *sync_bp = sync_buf;
|
||||
static char sync_lock[25];
|
||||
static char sync_file[25];
|
||||
static long sync_seek;
|
||||
static FILE *sync_fp;
|
||||
|
||||
void
|
||||
fmtship(buf, len, fmt, ship)
|
||||
char *buf;
|
||||
size_t len;
|
||||
const char *fmt;
|
||||
struct ship *ship;
|
||||
{
|
||||
while (*fmt) {
|
||||
if (len-- == 0) {
|
||||
*buf = '\0';
|
||||
return;
|
||||
}
|
||||
if (*fmt == '$' && fmt[1] == '$') {
|
||||
size_t l = snprintf(buf, len, "%s (%c%c)",
|
||||
ship->shipname, colours(ship), sterncolour(ship));
|
||||
buf += l;
|
||||
len -= l - 1;
|
||||
fmt += 2;
|
||||
}
|
||||
else
|
||||
*buf++ = *fmt++;
|
||||
}
|
||||
|
||||
if (len > 0)
|
||||
*buf = '\0';
|
||||
}
|
||||
|
||||
|
||||
/*VARARGS3*/
|
||||
void
|
||||
#ifdef __STDC__
|
||||
makesignal(struct ship *from, const char *fmt, struct ship *ship, ...)
|
||||
#else
|
||||
makesignal(va_alias)
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
char message[BUFSIZ];
|
||||
char format[BUFSIZ];
|
||||
va_list ap;
|
||||
#ifndef __STDC__
|
||||
struct ship *from;
|
||||
const char *fmt;
|
||||
struct ship *ship;
|
||||
|
||||
va_start(ap);
|
||||
from = va_arg(ap, struct ship *);
|
||||
fmt = va_arg(ap, const char *);
|
||||
ship = va_arg(ap, struct ship *);
|
||||
#else
|
||||
va_start(ap, ship);
|
||||
#endif
|
||||
fmtship(format, sizeof(format), fmt, ship);
|
||||
(void) vsprintf(message, format, ap);
|
||||
va_end(ap);
|
||||
Write(W_SIGNAL, from, 1, (long)message, 0, 0, 0);
|
||||
}
|
||||
|
||||
void
|
||||
#ifdef __STDC__
|
||||
makemsg(struct ship *from, const char *fmt, ...)
|
||||
#else
|
||||
makemsg(va_alias)
|
||||
va_dcl
|
||||
#endif
|
||||
{
|
||||
char message[BUFSIZ];
|
||||
va_list ap;
|
||||
#ifndef __STDC__
|
||||
struct ship *from;
|
||||
const char *fmt;
|
||||
|
||||
va_start(ap);
|
||||
from = va_arg(ap, struct ship *);
|
||||
fmt = va_arg(ap, const char *);
|
||||
#else
|
||||
va_start(ap, fmt);
|
||||
#endif
|
||||
(void) vsprintf(message, fmt, ap);
|
||||
va_end(ap);
|
||||
Write(W_SIGNAL, from, 1, (long)message, 0, 0, 0);
|
||||
}
|
||||
|
||||
int
|
||||
sync_exists(game)
|
||||
int game;
|
||||
{
|
||||
char buf[sizeof sync_file];
|
||||
struct stat s;
|
||||
time_t t;
|
||||
|
||||
(void) sprintf(buf, _PATH_SYNC, game);
|
||||
(void) time(&t);
|
||||
setegid(egid);
|
||||
if (stat(buf, &s) < 0) {
|
||||
setegid(gid);
|
||||
return 0;
|
||||
}
|
||||
if (s.st_mtime < t - 60*60*2) { /* 2 hours */
|
||||
(void) unlink(buf);
|
||||
(void) sprintf(buf, _PATH_LOCK, game);
|
||||
(void) unlink(buf);
|
||||
setegid(gid);
|
||||
return 0;
|
||||
} else {
|
||||
setegid(gid);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
|
||||
int
|
||||
sync_open()
|
||||
{
|
||||
struct stat tmp;
|
||||
if (sync_fp != NULL)
|
||||
(void) fclose(sync_fp);
|
||||
(void) sprintf(sync_lock, _PATH_LOCK, game);
|
||||
(void) sprintf(sync_file, _PATH_SYNC, game);
|
||||
setegid(egid);
|
||||
if (stat(sync_file, &tmp) < 0) {
|
||||
mode_t omask = umask(002);
|
||||
sync_fp = fopen(sync_file, "w+");
|
||||
(void) umask(omask);
|
||||
} else
|
||||
sync_fp = fopen(sync_file, "r+");
|
||||
setegid(gid);
|
||||
if (sync_fp == NULL)
|
||||
return -1;
|
||||
sync_seek = 0;
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
sync_close(remove)
|
||||
char remove;
|
||||
{
|
||||
if (sync_fp != 0)
|
||||
(void) fclose(sync_fp);
|
||||
if (remove) {
|
||||
setegid(egid);
|
||||
(void) unlink(sync_file);
|
||||
setegid(gid);
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
Write(type, ship, isstr, a, b, c, d)
|
||||
int type;
|
||||
struct ship *ship;
|
||||
int isstr;
|
||||
long a, b, c, d;
|
||||
{
|
||||
|
||||
if (isstr)
|
||||
(void) sprintf(sync_bp, "%d %d %d %s\n",
|
||||
type, ship->file->index, isstr, (char *) a);
|
||||
else
|
||||
(void) sprintf(sync_bp, "%d %d %d %ld %ld %ld %ld\n",
|
||||
type, ship->file->index, isstr, a, b, c, d);
|
||||
while (*sync_bp++)
|
||||
;
|
||||
sync_bp--;
|
||||
if (sync_bp >= &sync_buf[sizeof sync_buf])
|
||||
abort();
|
||||
(void) sync_update(type, ship, a, b, c, d);
|
||||
}
|
||||
|
||||
int
|
||||
Sync()
|
||||
{
|
||||
sig_t sighup, sigint;
|
||||
int n;
|
||||
int type, shipnum, isstr;
|
||||
long a, b, c, d;
|
||||
char buf[80];
|
||||
char erred = 0;
|
||||
|
||||
sighup = signal(SIGHUP, SIG_IGN);
|
||||
sigint = signal(SIGINT, SIG_IGN);
|
||||
for (n = TIMEOUT; --n >= 0;) {
|
||||
#ifdef LOCK_EX
|
||||
if (flock(fileno(sync_fp), LOCK_EX|LOCK_NB) >= 0)
|
||||
break;
|
||||
if (errno != EWOULDBLOCK)
|
||||
return -1;
|
||||
#else
|
||||
setegid(egid);
|
||||
if (link(sync_file, sync_lock) >= 0) {
|
||||
setegid(gid);
|
||||
break;
|
||||
}
|
||||
setegid(gid);
|
||||
if (errno != EEXIST)
|
||||
return -1;
|
||||
#endif
|
||||
sleep(1);
|
||||
}
|
||||
if (n <= 0)
|
||||
return -1;
|
||||
(void) fseek(sync_fp, sync_seek, 0);
|
||||
for (;;) {
|
||||
switch (fscanf(sync_fp, "%d%d%d", &type, &shipnum, &isstr)) {
|
||||
case 3:
|
||||
break;
|
||||
case EOF:
|
||||
goto out;
|
||||
default:
|
||||
goto bad;
|
||||
}
|
||||
if (shipnum < 0 || shipnum >= cc->vessels)
|
||||
goto bad;
|
||||
if (isstr != 0 && isstr != 1)
|
||||
goto bad;
|
||||
if (isstr) {
|
||||
char *p;
|
||||
for (p = buf;;) {
|
||||
switch (*p++ = getc(sync_fp)) {
|
||||
case '\n':
|
||||
p--;
|
||||
case EOF:
|
||||
break;
|
||||
default:
|
||||
if (p >= buf + sizeof buf)
|
||||
p--;
|
||||
continue;
|
||||
}
|
||||
break;
|
||||
}
|
||||
*p = 0;
|
||||
for (p = buf; *p == ' '; p++)
|
||||
;
|
||||
a = (long)p;
|
||||
b = c = d = 0;
|
||||
} else
|
||||
if (fscanf(sync_fp, "%ld%ld%ld%ld", &a, &b, &c, &d) != 4)
|
||||
goto bad;
|
||||
if (sync_update(type, SHIP(shipnum), a, b, c, d) < 0)
|
||||
goto bad;
|
||||
}
|
||||
bad:
|
||||
erred++;
|
||||
out:
|
||||
if (!erred && sync_bp != sync_buf) {
|
||||
(void) fseek(sync_fp, 0L, 2);
|
||||
(void) fwrite(sync_buf, sizeof *sync_buf, sync_bp - sync_buf,
|
||||
sync_fp);
|
||||
(void) fflush(sync_fp);
|
||||
sync_bp = sync_buf;
|
||||
}
|
||||
sync_seek = ftell(sync_fp);
|
||||
#ifdef LOCK_EX
|
||||
(void) flock(fileno(sync_fp), LOCK_UN);
|
||||
#else
|
||||
setegid(egid);
|
||||
(void) unlink(sync_lock);
|
||||
setegid(gid);
|
||||
#endif
|
||||
(void) signal(SIGHUP, sighup);
|
||||
(void) signal(SIGINT, sigint);
|
||||
return erred ? -1 : 0;
|
||||
}
|
||||
|
||||
int
|
||||
sync_update(type, ship, a, b, c, d)
|
||||
int type;
|
||||
struct ship *ship;
|
||||
long a, b, c, d;
|
||||
{
|
||||
switch (type) {
|
||||
case W_DBP: {
|
||||
struct BP *p = &ship->file->DBP[a];
|
||||
p->turnsent = b;
|
||||
p->toship = SHIP(c);
|
||||
p->mensent = d;
|
||||
break;
|
||||
}
|
||||
case W_OBP: {
|
||||
struct BP *p = &ship->file->OBP[a];
|
||||
p->turnsent = b;
|
||||
p->toship = SHIP(c);
|
||||
p->mensent = d;
|
||||
break;
|
||||
}
|
||||
case W_FOUL: {
|
||||
struct snag *p = &ship->file->foul[a];
|
||||
if (SHIP(a)->file->dir == 0)
|
||||
break;
|
||||
if (p->sn_count++ == 0)
|
||||
p->sn_turn = turn;
|
||||
ship->file->nfoul++;
|
||||
break;
|
||||
}
|
||||
case W_GRAP: {
|
||||
struct snag *p = &ship->file->grap[a];
|
||||
if (SHIP(a)->file->dir == 0)
|
||||
break;
|
||||
if (p->sn_count++ == 0)
|
||||
p->sn_turn = turn;
|
||||
ship->file->ngrap++;
|
||||
break;
|
||||
}
|
||||
case W_UNFOUL: {
|
||||
struct snag *p = &ship->file->foul[a];
|
||||
if (p->sn_count > 0) {
|
||||
if (b) {
|
||||
ship->file->nfoul -= p->sn_count;
|
||||
p->sn_count = 0;
|
||||
} else {
|
||||
ship->file->nfoul--;
|
||||
p->sn_count--;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case W_UNGRAP: {
|
||||
struct snag *p = &ship->file->grap[a];
|
||||
if (p->sn_count > 0) {
|
||||
if (b) {
|
||||
ship->file->ngrap -= p->sn_count;
|
||||
p->sn_count = 0;
|
||||
} else {
|
||||
ship->file->ngrap--;
|
||||
p->sn_count--;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
case W_SIGNAL:
|
||||
if (mode == MODE_PLAYER) {
|
||||
if (nobells)
|
||||
Signal("$$: %s", ship, (char *) a);
|
||||
else
|
||||
Signal("\7$$: %s", ship, (char *) a);
|
||||
}
|
||||
break;
|
||||
case W_CREW: {
|
||||
struct shipspecs *s = ship->specs;
|
||||
s->crew1 = a;
|
||||
s->crew2 = b;
|
||||
s->crew3 = c;
|
||||
break;
|
||||
}
|
||||
case W_CAPTAIN:
|
||||
(void) strncpy(ship->file->captain, (char *)a,
|
||||
sizeof ship->file->captain - 1);
|
||||
ship->file->captain[sizeof ship->file->captain - 1] = 0;
|
||||
break;
|
||||
case W_CAPTURED:
|
||||
if (a < 0)
|
||||
ship->file->captured = 0;
|
||||
else
|
||||
ship->file->captured = SHIP(a);
|
||||
break;
|
||||
case W_CLASS:
|
||||
ship->specs->class = a;
|
||||
break;
|
||||
case W_DRIFT:
|
||||
ship->file->drift = a;
|
||||
break;
|
||||
case W_EXPLODE:
|
||||
if ((ship->file->explode = a) == 2)
|
||||
ship->file->dir = 0;
|
||||
break;
|
||||
case W_FS:
|
||||
ship->file->FS = a;
|
||||
break;
|
||||
case W_GUNL: {
|
||||
struct shipspecs *s = ship->specs;
|
||||
s->gunL = a;
|
||||
s->carL = b;
|
||||
break;
|
||||
}
|
||||
case W_GUNR: {
|
||||
struct shipspecs *s = ship->specs;
|
||||
s->gunR = a;
|
||||
s->carR = b;
|
||||
break;
|
||||
}
|
||||
case W_HULL:
|
||||
ship->specs->hull = a;
|
||||
break;
|
||||
case W_MOVE:
|
||||
(void) strncpy(ship->file->movebuf, (char *)a,
|
||||
sizeof ship->file->movebuf - 1);
|
||||
ship->file->movebuf[sizeof ship->file->movebuf - 1] = 0;
|
||||
break;
|
||||
case W_PCREW:
|
||||
ship->file->pcrew = a;
|
||||
break;
|
||||
case W_POINTS:
|
||||
ship->file->points = a;
|
||||
break;
|
||||
case W_QUAL:
|
||||
ship->specs->qual = a;
|
||||
break;
|
||||
case W_RIGG: {
|
||||
struct shipspecs *s = ship->specs;
|
||||
s->rig1 = a;
|
||||
s->rig2 = b;
|
||||
s->rig3 = c;
|
||||
s->rig4 = d;
|
||||
break;
|
||||
}
|
||||
case W_RIG1:
|
||||
ship->specs->rig1 = a;
|
||||
break;
|
||||
case W_RIG2:
|
||||
ship->specs->rig2 = a;
|
||||
break;
|
||||
case W_RIG3:
|
||||
ship->specs->rig3 = a;
|
||||
break;
|
||||
case W_RIG4:
|
||||
ship->specs->rig4 = a;
|
||||
break;
|
||||
case W_COL:
|
||||
ship->file->col = a;
|
||||
break;
|
||||
case W_DIR:
|
||||
ship->file->dir = a;
|
||||
break;
|
||||
case W_ROW:
|
||||
ship->file->row = a;
|
||||
break;
|
||||
case W_SINK:
|
||||
if ((ship->file->sink = a) == 2)
|
||||
ship->file->dir = 0;
|
||||
break;
|
||||
case W_STRUCK:
|
||||
ship->file->struck = a;
|
||||
break;
|
||||
case W_TA:
|
||||
ship->specs->ta = a;
|
||||
break;
|
||||
case W_ALIVE:
|
||||
alive = 1;
|
||||
break;
|
||||
case W_TURN:
|
||||
turn = a;
|
||||
break;
|
||||
case W_WIND:
|
||||
winddir = a;
|
||||
windspeed = b;
|
||||
break;
|
||||
case W_BEGIN:
|
||||
(void) strcpy(ship->file->captain, "begin");
|
||||
people++;
|
||||
break;
|
||||
case W_END:
|
||||
*ship->file->captain = 0;
|
||||
ship->file->points = 0;
|
||||
people--;
|
||||
break;
|
||||
case W_DDEAD:
|
||||
hasdriver = 0;
|
||||
break;
|
||||
default:
|
||||
fprintf(stderr, "sync_update: unknown type %d\r\n", type);
|
||||
return -1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
45
sail/version.c
Normal file
45
sail/version.c
Normal file
@@ -0,0 +1,45 @@
|
||||
/* $NetBSD: version.c,v 1.4 1997/10/13 19:46:01 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in the
|
||||
* documentation and/or other materials provided with the distribution.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University nor the names of its contributors
|
||||
* may be used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
|
||||
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
* SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#if 0
|
||||
static char sccsid[] = "@(#)version.c 8.1 (Berkeley) 5/31/93";
|
||||
#else
|
||||
__RCSID("$NetBSD: version.c,v 1.4 1997/10/13 19:46:01 christos Exp $");
|
||||
#endif
|
||||
#endif /* not lint */
|
||||
|
||||
char version[] = "Wooden Ships and Iron Men, Version 8.1 (93/05/31)";
|
||||
Reference in New Issue
Block a user