BSD 4_2 release
[unix-history] / usr / src / games / sail / assorted.c
#ifndef lint
static char *sccsid = "@(#)assorted.c 1.1 83/03/17";
#endif
#define EXPLODE 5
#include "externs.h"
table(rig, shot, hittable, onship, fromship, roll)
int rig, shot, hittable, onship, fromship, roll;
{
register 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];
register int n;
int rigg[4];
char message[60];
struct shipspecs *ptr;
struct File *ptr1;
ptr = &specs[scene[game].ship[onship].shipnum];
ptr1 = scene[game].ship[onship].file;
pc = ptr1 -> pcrew;
hull = ptr -> hull;
crew[0] = ptr -> crew1;
crew[1] = ptr -> crew2;
crew[2] = ptr -> crew3;
rigg[0] = ptr -> rig1;
rigg[1] = ptr -> rig2;
rigg[2] = ptr -> rig3;
rigg[3] = ptr -> rig4;
if (shot == GRAPE)
Chit = chits = hittable;
else {
Chit = chits = rig ? RigTable[hittable][roll-1].C : HullTable[hittable][roll-1].C;
Rhit = rhits = rig ? RigTable[hittable][roll-1].R : HullTable[hittable][roll-1].R;
Hhit = hhits = rig ? RigTable[hittable][roll-1].H : HullTable[hittable][roll-1].H;
Ghit = ghits = rig ? RigTable[hittable][roll-1].G : HullTable[hittable][roll-1].G;
if (ptr1 -> FS)
rhits *= 2;
if (shot == CHAIN){
Ghit = ghits = 0;
Hhit = hhits = 0;
}
}
if (ptr1 -> captured > -1){
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))
makesignal("dismasted!", 0, onship);
if (portside(fromship, onship, 0)){
guns = ptr -> gunL;
car = ptr -> carL;
} else {
guns = ptr -> gunR;
car = ptr -> carR;
}
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 (portside(fromship, onship, 0) && Ghit){
Write(SPECS + onship, 0, 20, guns);
Write(SPECS + onship, 0, 24, car);
}
else if (Ghit){
Write(SPECS + onship, 0, 22, guns);
Write(SPECS + onship, 0, 26, car);
}
hull -= hhits;
hull = hull < 0 ? 0 : hull;
if (ptr1 -> captured > -1 && Chit){
Write(FILES + onship, 0, 70, pc);
}
if (Hhit)
Write(SPECS + onship, 0, 10, hull);
if (Chit)
for (n=0; n < 3; n++)
Write(SPECS + onship, 0, 14 + 2*n, crew[n]);
if (Rhit)
for (n=0; n < 4; n++)
Write(SPECS + onship, 0, 28 + 2*n, rigg[n]);
switch(shot){
case ROUND:
strcpy(message, "firing round");
break;
case GRAPE:
strcpy(message, "firing grape");
break;
case CHAIN:
strcpy(message, "firing chain");
break;
case DOUBLE:
strcpy(message, "firing double");
break;
case EXPLODE:
strcpy(message, "exploding");
}
strcat(message, " shot on %s (%c%c)");
makesignal(message, onship, fromship);
if (roll == 6 && rig){
switch(Rhit){
case 0:
strcpy(message, "fore topsail sheets parted");
break;
case 1:
strcpy(message, "mizzen shrouds parted");
break;
case 2:
strcpy(message, "main topsail yard shot away");
break;
case 4:
strcpy(message, "fore topmast and foremast shrouds shot away");
break;
case 5:
strcpy(message, "mizzen mast and yard shot through");
break;
case 6:
strcpy(message, "foremast and spritsail yard shattered");
break;
case 7:
strcpy(message, "main topmast and mizzen mast shattered");
break;
}
makesignal(message, 0, onship);
}
else if (roll == 6) {
switch(Hhit){
case 0:
strcpy(message, "anchor cables severed");
break;
case 1:
strcpy(message, "two anchor stocks shot away");
break;
case 2:
strcpy(message, "quarterdeck bulwarks damaged");
break;
case 3:
strcpy(message, "three gun ports shot away");
break;
case 4:
strcpy(message, "four guns dismounted");
break;
case 5:
strcpy(message, "rudder cables shot through");
Write(SPECS + onship, 0, 4, 0);
break;
case 6:
strcpy(message, "shot holes below the water line");
break;
}
makesignal(message, 0, onship);
}
if ((Chit > 1 && ptr1 -> readyL <= -30000 && ptr1 -> readyR <= -30000) || Chit == 4){
ptr -> qual--;
if (ptr -> qual <= 0){
makesignal("crew mutinying!", 0, onship);
ptr -> qual = 5;
Write(FILES + onship, 0, 68, onship);
} else
makesignal("crew demoralized", 0, onship);
Write(SPECS + onship, 0, 12, ptr -> qual);
}
if (!hull)
strike(onship, fromship);
}
cleanfoul(fromship, toship, offset)
int fromship, toship, offset;
{
register int n = -1;
Write(FILES + fromship, 0, 84 + offset*4, 0);
do {
n++;
} while ((!scene[game].ship[toship].file -> fouls[n].turnfoul || scene[game].ship[toship].file -> fouls[n].toship != fromship) && n < 10);
if (n < 10)
Write(FILES + toship, 0, 84 + 4*n, 0);
if (!grapple(fromship, toship) && !foul(fromship,toship)){
if (!fouled(fromship) && !grappled(fromship)){
unboard(fromship,fromship, 1); /* defense */
unboard(fromship,fromship, 0); /* defense */
} else
unboard(fromship,toship, 0); /* defense */
if (!fouled(toship) && !grappled(toship)){ /* defense */
unboard(toship,toship, 1);
unboard(toship,toship, 0);
} else
unboard(toship, fromship, 0); /* offense */
}
}
cleangrapple(fromship, toship, offset)
int fromship, toship, offset;
{
register int n = -1;
Write(FILES + fromship, 0, 124 + offset*4, 0);
do {
n++;
} while ((!scene[game].ship[toship].file -> grapples[n].turnfoul || scene[game].ship[toship].file -> grapples[n].toship != fromship) && n < 10);
if (n < 10)
Write(FILES + toship, 0, 124 + 4*n, 0);
if (!grapple(fromship, toship) && !foul(fromship,toship)){
if (!fouled(fromship) && !grappled(fromship)){
unboard(fromship,fromship, 1); /* defense */
unboard(fromship,fromship, 0); /* defense */
} else
unboard(fromship,toship, 0); /* defense */
if (!fouled(toship) && !grappled(toship)){ /* defense */
unboard(toship,toship, 1);
unboard(toship,toship, 0);
} else
unboard(toship, fromship, 0); /* offense */
}
}
strike(shipnum, fromship)
int shipnum, fromship;
{
int points;
if (!scene[game].ship[shipnum].file -> struck){
Write(FILES + shipnum, 0, 66, 1);
points = specs[scene[game].ship[shipnum].shipnum].pts + scene[game].ship[fromship].file -> points;
Write(FILES + fromship, 0, 20, points);
unboard(shipnum, shipnum, 0); /* all offense */
unboard(shipnum, shipnum, 1); /* all defense */
switch(die()){
case 3:
case 4: /* ship may sink */
Write(FILES + shipnum, 0, 234, 1);
break;
case 5:
case 6: /* ship may explode */
Write(FILES + shipnum, 0, 232, 1);
break;
}
Write(FILES + shipnum, 1, 164, "striking her colours!");
}
}