[comp.sources.games] v04i023: spacewar - multiplayer asynchronous space battle game, Part03/06

games@tekred.TEK.COM (06/01/88)

Submitted by: udenva!koala!dir (Dan Rosenblatt)
Comp.sources.games: Volume 4, Issue 23
Archive-name: spacewar/Part03



#! /bin/sh
# This is a shell archive.  Remove anything before this line, then unpack
# it by saving it into a file and typing "sh file".  To overwrite existing
# files, type "sh file -c".  You can also feed this as standard input via
# unshar, or by typing "sh <file", e.g..  If this archive is complete, you
# will see the following message at the end:
#		"End of archive 3 (of 6)."
# Contents:  mutils.c plinit.c proctrap.c prvcmd.c scrn.c see.c
#   updaln.c updmov.c
# Wrapped by billr@saab on Tue May 31 09:54:52 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f mutils.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"mutils.c\"
else
echo shar: Extracting \"mutils.c\" \(2974 characters\)
sed "s/^X//" >mutils.c <<'END_OF_mutils.c'
X/*
X * Spacewar - matrix, vector, and trig routines
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X
XVOID unity(mtrx)
Xdouble mtrx[3][3];
X{
X	minit(mtrx);
X	mtrx[0][0] = 1.0;
X	mtrx[1][1] = 1.0;
X	mtrx[2][2] = 1.0;
X}
X
XVOID matmul(amtrx,bmtrx,cmtrx)
Xdouble amtrx[3][3],bmtrx[3][3],cmtrx[3][3];
X{
X	double tmp,tmpmtrx[3][3];
X	int i,j,k;
X
X	for (i=0;i<3;++i)
X	    for (j=0;j<3;++j) {
X		tmp = 0.0;
X		for (k=0;k<3;++k)
X		    tmp = ADD(tmp,MUL(amtrx[k][j],bmtrx[i][k]));
X		tmpmtrx[i][j] = tmp;
X	    }
X	mcopy(cmtrx,tmpmtrx);
X}
X
XVOID vecmul(avec,bmtrx,cvec)
Xdouble avec[3],bmtrx[3][3],cvec[3];
X{
X	double tmp,tmpvec[3];
X	int i,j;
X
X	for (i=0;i<3;++i) {
X	    tmp = 0.0;
X	    for (j=0;j<3;++j)
X		tmp = ADD(tmp,MUL(avec[j],bmtrx[i][j]));
X	    tmpvec[i] = tmp;
X	}
X	vcopy(cvec,tmpvec);
X}
X
XVOID xrot(rotmtrx,rotangl)
Xdouble rotmtrx[3][3],rotangl;
X{
X	double tmpmtrx[3][3];
X
X	minit(tmpmtrx);
X	tmpmtrx[1][1] = tmpmtrx[2][2] = COS(rotangl);
X	tmpmtrx[1][2] = NEG(tmpmtrx[2][1] = SIN(rotangl));
X	tmpmtrx[0][0] = 1.0;
X	matmul(rotmtrx,tmpmtrx,rotmtrx);
X}
X
XVOID yrot(rotmtrx,rotangl)
Xdouble rotmtrx[3][3],rotangl;
X{
X	double tmpmtrx[3][3];
X
X	minit(tmpmtrx);
X	tmpmtrx[0][0] = tmpmtrx[2][2] = COS(rotangl);
X	tmpmtrx[2][0] = NEG(tmpmtrx[0][2] = SIN(rotangl));
X	tmpmtrx[1][1] = 1.0;
X	matmul(rotmtrx,tmpmtrx,rotmtrx);
X}
X
XVOID zrot(rotmtrx,rotangl)
Xdouble rotmtrx[3][3],rotangl;
X{
X	double tmpmtrx[3][3];
X
X	minit(tmpmtrx);
X	tmpmtrx[0][0] = tmpmtrx[1][1] = COS(rotangl);
X	tmpmtrx[0][1] = NEG(tmpmtrx[1][0] = SIN(rotangl));
X	tmpmtrx[2][2] = 1.0;
X	matmul(rotmtrx,tmpmtrx,rotmtrx);
X}
X
XVOID sptort(spvec,rtvec)
Xdouble spvec[3],rtvec[3];
X{
X	double sin2,tmpvec[3];
X
X	sin2 = SIN(spvec[2]);
X	tmpvec[0] = MUL(spvec[0],MUL(COS(spvec[1]),sin2));
X	tmpvec[1] = MUL(spvec[0],MUL(SIN(spvec[1]),sin2));
X	tmpvec[2] = MUL(spvec[0],COS(spvec[2]));
X	vcopy(rtvec,tmpvec);
X}
X
Xdouble xatan2(x,y)
Xdouble x,y;
X{
X	if (x == 0. && y == 0.)
X	    return(0.);
X	else
X	    return(ATAN2(x,y));
X}
X
XVOID rttosp(rtvec,spvec)
Xdouble rtvec[3],spvec[3];
X{
X	double tmp,tmpvec[3];
X
X	tmp = ADD(SQUARE(rtvec[0]),SQUARE(rtvec[1]));
X	tmpvec[0] = SQRT(ADD(tmp,SQUARE(rtvec[2])));
X	tmpvec[1] = FMOD(ADD(xatan2(rtvec[1],rtvec[0]),TWOPI),TWOPI);
X	tmpvec[2] = FMOD(ADD(xatan2(SQRT(tmp),rtvec[2]),TWOPI),TWOPI);
X	vcopy(spvec,tmpvec);
X}
X
XVOID vdiff(avec,bvec,cvec)
Xregister double *avec,*bvec,*cvec;
X{
X	register int i;
X
X	for (i=0;i++<3;)
X		*cvec++ = *avec++ - *bvec++;
X}
X
Xdouble vdist(avec,bvec)
Xdouble avec[3],bvec[3];
X{
X	double tmp,sumsqr=0.;
X	int i;
X
X	for (i=0;i<3;++i) {
X	    tmp = SUB(avec[i],bvec[i]);
X	    sumsqr = ADD(sumsqr,SQUARE(tmp));
X	}
X	return(SQRT(sumsqr));
X}
X
Xdouble vlen(avec)
Xdouble avec[3];
X{
X	double sumsqr;
X
X	sumsqr = SQUARE(avec[0]);
X	sumsqr = ADD(sumsqr,SQUARE(avec[1]));
X	sumsqr = ADD(sumsqr,SQUARE(avec[2]));
X	return(SQRT(sumsqr));
X}
X
X#if defined(NEEDFMOD)
Xdouble fmod(arg1,arg2)
Xdouble arg1,arg2;
X{
X	double tmp;
X
X	while ((tmp = SUB(arg1,arg2)) >= 0.)
X	    arg1 = tmp;
X	return(arg1);
X}
X#endif
END_OF_mutils.c
if test 2974 -ne `wc -c <mutils.c`; then
    echo shar: \"mutils.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f plinit.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"plinit.c\"
else
echo shar: Extracting \"plinit.c\" \(7450 characters\)
sed "s/^X//" >plinit.c <<'END_OF_plinit.c'
X/*
X * Spacewar - routine to initialize a player into the universe
X *	      - terminal type
X *	      - craft name
X *	      - craft structure and universe entry
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#ifndef VMS
X#include <sys/types.h>
X#include <dbm.h>
X#else /* BSD SYSIII SYSV */
X#include <types.h>
X#include "dbm.h"
X#endif /* VMS */
X#include "spacewar.h"
X#include "universe.h"
X#include "login.h"
X#include "sys.h"
X#include "crft.h"
X#include "obj.h"
X#include "aln.h"
X#include "torp.h"
X#include "build.h"
X
Xextern char *malloc(),*tgetstr(),*lckmsg();
Xextern int numpling;
X
Xint plinit(plogin)
Xregister struct login *plogin;
X{
X	char trmbuf[2048],trmcap[128],*ptrmcap,*pcm,*pcl,*pce,*pso,*pse;
X	char buf[80+1],*s,*so,*se;
X	register struct universe *puniv;
X	register struct crft *pcrft;
X	struct crftkey getcrkey;
X	struct crft getcrdat;
X	struct syskey getskey;
X	datum dbmkey,dbmdata;
X	int i;
X
X#ifdef DEBUG
X	DBG("plinit(#%d/%s)\n",plogin-loginlst,plogin->ln_name);
X#endif
X
X	if (!strcmp(plogin->ln_input,".")) goto noplay;
X
X	/********************/
X	/* no terminal type */
X	/********************/
X	if (!plogin->ln_term) {
X
X	    /* get terminal type from user input */
X	    if (!plogin->ln_input[0]) {
Xgetterm:	output(plogin,'C',0,"\nWhat (termcap) terminal type>");
X		output(plogin,0,0,0);
X#ifdef DEBUG
X		VDBG("plinit return\n");
X#endif
X		return(0);
X	    }
X	    plogin->ln_rvslh = 0;
X	    switch(plogin->ln_input[0]) {
X		case '.':
X		    so = "so"; se = "se";
X		    plogin->ln_rvslh = 1;
X		    strcpy(plogin->ln_input,plogin->ln_input+1);
X		    break;
X		case ',':
X		    so = "us"; se = "ue";
X		    strcpy(plogin->ln_input,plogin->ln_input+1);
X		    break;
X		case ';':
X		    so = "us"; se = "ue";
X		    plogin->ln_rvslh = 1;
X		    strcpy(plogin->ln_input,plogin->ln_input+1);
X		    break;
X		default:
X		    so = "so"; se = "se";
X		    break;
X	    }
X	    if (tgetent(trmbuf,plogin->ln_input) != 1) goto getterm;
X
X	    /* get necessary capabilities */
X	    ptrmcap = trmcap;
X	    if (!(pcm=tgetstr("cm",&ptrmcap)) ||
X	    !(pcl=tgetstr("cl",&ptrmcap)) ||
X	    !(pce=tgetstr("ce",&ptrmcap)) ||
X	    !(pso=tgetstr(so,&ptrmcap)) ||
X	    !(pse=tgetstr(se,&ptrmcap))) {
X		output(plogin,'C',0,
X		"\nMissing minimum necessary terminal capabilities\n");
X		goto noplay;
X	    }
X
X	    /* save terminal type and capabilities */
X	    if (!(plogin->ln_term = malloc((unsigned)strlen(plogin->ln_input)+1)) ||
X	    !(plogin->ln_tcm = malloc((unsigned)strlen(pcm)+1)) ||
X	    !(plogin->ln_tcl = malloc((unsigned)strlen(pcl)+1)) ||
X	    !(plogin->ln_tce = malloc((unsigned)strlen(pce)+1)) ||
X	    !(plogin->ln_tso = malloc((unsigned)strlen(pso)+1)) ||
X	    !(plogin->ln_tse = malloc((unsigned)strlen(pse)+1))) {
X		perror("plinit: out of memory for termcaps");
X		plogin->ln_term = NULL;
X		plogin->ln_tcm = NULL;
X		plogin->ln_tcl = NULL;
X		plogin->ln_tce = NULL;
X		plogin->ln_tso = NULL;
X		plogin->ln_tse = NULL;
X		goto noplay;
X	    }
X	    strcpy(plogin->ln_term,plogin->ln_input);
X	    plogin->ln_input[0] = NULL;
X	    strcpy(plogin->ln_tcm,pcm);
X	    strcpy(plogin->ln_tcl,pcl);
X	    strcpy(plogin->ln_tce,pce);
X	    strcpy(plogin->ln_tso,pso);
X	    strcpy(plogin->ln_tse,pse);
X	}
X
X	/*********/
X	/* craft */
X	/*********/
X
X	/* prompt for ship name */
X	if (!plogin->ln_input[0]) {
X	    output(plogin,'C',0,"\nWhat ship>");
X	    output(plogin,0,0,0);
X#ifdef DEBUG
X	    VDBG("plinit return\n");
X#endif
X	    return(0);
X	}
X
X	/* get craft */
X	plogin->ln_input[sizeof(plogin->ln_crft)-1] = NULL;
X	binit((char *)&getcrkey,sizeof(getcrkey));
X	getcrkey.cr_crftkey = CRAFT;
X	strcpy(getcrkey.cr_plyr,plogin->ln_name);
X	strcpy(getcrkey.cr_name,plogin->ln_input);
X	dbmkey.dptr = (char *)&getcrkey;
X	dbmkey.dsize = sizeof(getcrkey);
X	dbmdata = fetch(dbmkey);
X	if (!dbmdata.dptr) {
X	    sprintf(buf,"\n'%s' - no such ship\n",plogin->ln_input);
X	    output(plogin,'C',0,buf);
X	    goto noplay;
X	}
X	binit((char *)&getcrdat,sizeof(getcrdat));
X	bcopy((char *)&getcrdat,dbmdata.dptr,dbmdata.dsize);
X
X	/* must have a hull */
X	if (!getcrdat.cr_htyp) {
X	    sprintf(buf,"\n'%s' - has no hull\n",plogin->ln_input);
X	    output(plogin,'C',0,buf);
X	    goto noplay;
X	}
X
X	/* must be room in the universe */
X	for (puniv=univlst+MAXOBJ+MAXALN;puniv < univlst+MAXUNIVERSE;++puniv)
X	    if (!puniv->uv_type)
X		break;
X	if (puniv >= univlst+MAXUNIVERSE) {
X	    output(plogin,'C',0,"\nSorry, the universe is temporarily full\n");
X	    goto noplay;
X	}
X
X	/* must not be locked */
X	if (s=lckmsg()) {
X	    output(plogin,'C',0,"\n");
X	    output(plogin,'C',0,s);
X	    output(plogin,'C',0,"\n");
X	    goto noplay;
X	}
X
X
X	/**********************************/
X	/* put player/craft into universe */
X	/**********************************/
X
X	/* fill in craft data */
X	pcrft = crftlst + (plogin - loginlst);	/* 1to1 correspondence */
X	*pcrft = getcrdat;
X
X	/* if first time playing, pick a pstn near the object */
X	if (pcrft->cr_dock.ip_ofst == -1) {
X	    pcrft->cr_dock.ip_ptr = NULL;
X	    i = RANDOM(MAXOBJ-1) + 1; /* 1:MAXOBJ-1 */
X	    vcopy(pcrft->cr_pstn,univlst[i].uv_pstn);
X	    pcrft->cr_pstn[0] =
X		ADD(pcrft->cr_pstn[0],FLOAT(RANDOM(2000)+500));
X	    pcrft->cr_pstn[1] =
X	   	 ADD(pcrft->cr_pstn[1],FLOAT(RANDOM(2000)+500));
X	    pcrft->cr_vang = DIV(PI,4.);
X	    pcrft->cr_vdst =
X		INT(DIV(VANGVDST,SQUARE(pcrft->cr_vang)));
X	    
X	    /* point so that facing the object */
X	    vdiff(univlst[i].uv_pstn,pcrft->cr_pstn,pcrft->cr_dir);
X	    rttosp(pcrft->cr_dir,pcrft->cr_dir);
X
X	/* previously docked with a non-object; pstn remains the same */
X	} else if (pcrft->cr_dock.ip_ofst >= MAXOBJ ||
X	pcrft->cr_dock.ip_ofst <= 0) {
X	    pcrft->cr_dock.ip_ptr = NULL;
X
X	/* prevsiously docked with an object; pstn shifts to object */
X	} else if (pcrft->cr_dock.ip_ofst) {
X	    pcrft->cr_dock.ip_ptr = univlst + pcrft->cr_dock.ip_ofst;
X	    vcopy(pcrft->cr_pstn,pcrft->cr_dock.ip_ptr->uv_pstn);
X	}
X
X	/* turn off inappropriate homing/autopilot */
X	if (pcrft->cr_auto.ip_ofst >= MAXOBJ || pcrft->cr_auto.ip_ofst <= 0)
X	    pcrft->cr_auto.ip_ptr = NULL;
X	else
X	    pcrft->cr_auto.ip_ptr = univlst + pcrft->cr_auto.ip_ofst;
X	for (i=0;i < MHOM;++i) {
X	    if (pcrft->cr_hom[i].ip_ofst >= MAXOBJ || pcrft->cr_hom[i].ip_ofst <= 0)
X		pcrft->cr_hom[i].ip_ptr = NULL;
X	    else
X		pcrft->cr_hom[i].ip_ptr = univlst + pcrft->cr_hom[i].ip_ofst;
X	}
X
X	/* normalize direction and do rotation matrix */
X	fixdir(pcrft);
X
X	/* get all subsystems */
X	binit((char *)&getskey,sizeof(getskey));
X	getskey.s_syskey = SUBSYS;
X	strcpy(getskey.s_plyr,plogin->ln_name);
X	strcpy(getskey.s_crft,getcrkey.cr_name);
X	dbmkey.dptr = (char *)&getskey;
X	dbmkey.dsize = sizeof(getskey);
X	for (i=0;i < MSYS;++i) {
X	    getskey.s_type = i;
X	    dbmdata = fetch(dbmkey);
X	    if (dbmdata.dptr)
X		bcopy((char *)(pcrft->cr_sys+i),dbmdata.dptr,dbmdata.dsize);
X	}
X
X	/* et al */
X	pcrft->cr_lgn = plogin;
X	pcrft->cr_lhit.ip_ptr = NULL;
X	plogin->ln_iomode = 's';
X	strcpy(plogin->ln_crft,getcrkey.cr_name);
X	plogin->ln_play.ip_ptr = puniv;
X	puniv->uv_type = 'P';
X	puniv->uv_pctr = pcrft->cr_htyp + '0';
X	puniv->uv_pstn = pcrft->cr_pstn;
X	puniv->uv_mass = pcrft->cr_sys[HULL].s_dmg;
X	puniv->uv_rad = 1;
X	puniv->uv_ptr.uv_crft = pcrft;
X	pcrft->cr_univ.ip_ptr = puniv;
X
X	/* first player must start universe update */
X	if (!numpling++) firstplyr();
X
X#ifdef DEBUG
X	VDBG("plinit return\n");
X#endif
X	return(1);
X
Xnoplay: plogin->ln_stat = NULL;
X	output(plogin,'C',0,PROMPT);
X	output(plogin,0,0,0);
X#ifdef DEBUG
X	VDBG("plinit return\n");
X#endif
X	return(0);
X}
END_OF_plinit.c
if test 7450 -ne `wc -c <plinit.c`; then
    echo shar: \"plinit.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f proctrap.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"proctrap.c\"
else
echo shar: Extracting \"proctrap.c\" \(6181 characters\)
sed "s/^X//" >proctrap.c <<'END_OF_proctrap.c'
X/*
X * Spacewar - process an asynchronous trap, usually a player wanting
X *	      to logon to the game or possibly a signal from a user
X *	      noticed and passed on by playsw
X *
X *	      trapmsg structure: pid {signal#|ttyname}
X *
X * Copyright 1984 obo Systems, Inc.
X * Copyright 1984 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X#ifdef BSD
X#	include <sys/ioctl.h>
X#else /* VMS SYSIII SYSV */
X#ifdef VMS
X#	include <descrip.h>
X#	include <ssdef.h>
X#	include <psldef.h>
X#	include "uio.h"
X#else /* SYSIII SYSV */
X#	include <fcntl.h>
X#endif /* VMS SYSIII SYSV */
X#endif /* BSD VMS SYSIII SYSV */
X#include <signal.h>
X#include "universe.h"
X#include "login.h"
X#ifndef VMS
X#	include "uio2.h"
X#endif /* VMS */
X
Xstatic int setupread();
X
X#ifdef BSD
XVOID proctrap(trapmsgfd,ntrapmsg)
Xint trapmsgfd,*ntrapmsg;
X{
X	struct uio2 uio;
X#else /* VMS SYSIII SYSV */
XVOID proctrap(uio)
X#ifdef VMS
Xstruct uio uio;
X#else /* SYSIII SYSV */
Xstruct uio2 uio;
X#endif /* VMS SYSIII SYSV */
X{
X#endif /* VMS BSD SYSIII SYSV */
X	register struct login *plogin;
X	int i;
X#ifdef VMS
X	int pid;
X#endif /* VMS */
X	extern VOID logon(),logoff();
X
X#ifdef BSD
X#ifdef DEBUG
X	DBG("proctrap(%d,%d)\n",trapmsgfd,*ntrapmsg);
X#endif
X
X	/* for as many traps as received */
X	do {
X
X		/* get the pid */
X		if (read(trapmsgfd,&uio,sizeof(uio)) != sizeof(uio)) {
X			perror("trapmsg file uio");
X			*ntrapmsg = 0;
X#ifdef DEBUG
X			VDBG("proctrap return\n");
X#endif
X			return;
X		}
X#ifdef DEBUG
X		VDBG("proctrap: uio %d %d %s\n",uio.uio2sig,uio.uio2pid,
X		uio.uio2tty);
X#endif
X#else /* VMS SYSIII SYSV */
X#ifdef VMS
X#ifdef DEBUG
X		DBG("proctrap(%d,%s)\n",(int)uio.uio_lgn,uio.uio_chrs);
X#endif
X		sscanf(uio.uio_chrs+2,"%x",&pid);
X#else /* SYSIII SYSV */
X#ifdef DEBUG
X		DBG("proctrap(%d,%d,%s)\n",uio.uio2sig,uio.uio2pid,uio.uio2tty);
X#endif
X#endif /* VMS SYSIII SYSV */
X#endif /* VMS BSD SYSIII SYSV */
X
X		/* try to find player */
X		for (plogin=loginlst,i=MAXLOGIN+1;--i > 0;++plogin)
X#ifdef VMS
X			if (plogin->ln_pid == pid)
X#else /* BSD SYSIII SYSV */
X			if (plogin->ln_playpid == uio.uio2pid)
X#endif /* VMS BSD SYSIII SYSV */
X				break;
X#ifdef DEBUG
X		VDBG("proctrap: login entry #%d\n",plogin-loginlst);
X#endif
X
X		/* player is already logged on, therefore its a signal */
X		if (i) {
X
X			/* process according to signal# */
X#ifdef VMS
X			switch((int)uio.uio_lgn) {
X#else /* BSD SYSIII SYSV */
X			switch(uio.uio2sig) {
X#endif /* VMS BSD SYSIII SYSV */
X
X			    case SIGQUIT:	/* wants to go away */
X				output(plogin,'E',0,0);
X			    case SIGHUP:	/* or just went away */
X				logoff(plogin);
X				break;
X
X			    case SIGINT:	/* restart if not playing */
X				if (plogin->ln_play.ip_ptr == NULL) {
X					output(plogin,'C',0,
X					"\n\n\nInterrupt - restarting\n");
X					logon(plogin);
X				}
X				break;
X
X			    default:
X				perror("proctrap: unknown signal");
X				break;
X			}
X
X		/* not logged in, therefore its the ttyname */
X		} else {
X
X			/* find an available login */
X			for (plogin=loginlst,i=MAXLOGIN+1;--i > 0;++plogin)
X				if (plogin->ln_tty == NULL)
X					break;
X#ifdef DEBUG
X			VDBG("proctrap: available login entry #%d\n",
X			plogin-loginlst);
X#endif
X#ifdef VMS
X			/* psw will timeout if no message from setupread */
X			if (i && setupread(plogin,pid))
X				logon(plogin);
X#else /* BSD SYSIII SYSV */
X			if (i && setupread(plogin,uio.uio2pid,uio.uio2tty))
X				logon(plogin);
X			else
X				kill(uio.uio2pid,SIGTERM);
X#endif /* VMS BSD SYSIII SYSV */
X		}
X#ifdef BSD
X	} while (--(*ntrapmsg) > 0);
X#endif /* BSD */
X#ifdef DEBUG
X	VDBG("proctrap return\n");
X#endif
X}
X
X#ifdef VMS
Xstatic int setupread(plogin,pid)
Xstruct login *plogin;
Xint pid;
X{
X	struct dsc$descriptor_d mlbx;
X	char buf[32];
X	int i;
X	extern int errno;
X
X#ifdef DEBUG
X	DBG("setupread(#%d,%x)\n",plogin-loginlst,pid);
X#endif
X
X	sprintf(buf,"sw%x",pid);
X	mlbx.dsc$w_length = strlen(buf);
X	mlbx.dsc$b_dtype = DSC$K_DTYPE_T;
X	mlbx.dsc$b_class = DSC$K_CLASS_S;
X	mlbx.dsc$a_pointer = buf;
X	if ((i=sys$crembx(1,&plogin->ln_tty,0,0,0,PSL$C_USER,&mlbx)) !=
X	SS$_NORMAL) {
X		perror("crembx");
X#ifdef DEBUG
X		VDBG("setupread crembx()=%d, errno=%d\n",i,errno);
X#endif
X		plogin->ln_tty = NULL;
X#ifdef DEBUG
X		VDBG("setupread return\n");
X#endif
X		return(0);
X	}
X	plogin->ln_pid = pid;
X
X	sprintf(buf,"%d",plogin);
X	output(plogin,'C',0,buf);
X	output(plogin,0,0,0);
X
X#ifdef DEBUG
X	VDBG("setupread return\n");
X#endif
X	return(1);
X}
X#else /* BSD SYSIII SYSV */
X/*
X * setting up a readsw process with:
X *	fd0 attached to the terminal
X *	fd1 as it exists in spacewar
X *	all other fd's closed
X * partially fill in the login structure
X * returns non-zero if successful, 0 otherwise
X */
Xstatic int setupread(plogin,playpid,ttynm)
Xregister struct login *plogin;
Xint playpid;
Xchar *ttynm;
X{
X	int ttyfd,readpid,i;
X	char buf[32];
X	extern int doproctrap;
X
X	/* temporarily disable interrupts */
X	if (doproctrap == 1) doproctrap = 0;
X
X#ifdef DEBUG
X	DBG("setupread(#%d,%d,%s)\n",plogin-loginlst,playpid,ttynm);
X#endif
X
X	/* open the player's tty */
X	if ((ttyfd = open(ttynm,2)) < 0) {
X		perror(ttynm);
X		if (doproctrap == 0) doproctrap = 1;
X#ifdef DEBUG
X		VDBG("setupread return\n");
X#endif
X		return(0);
X	}
X
X	/* fork */
X	switch(readpid=fork()) {
X		case -1:	/* failed */
X			perror("fork");
X			if (close(ttyfd)) perror(ttynm);
X			if (doproctrap == 0) doproctrap = 1;
X#ifdef DEBUG
X			VDBG("setupread return\n");
X#endif
X			return(0);
X
X		case 0:		/* child */
X#ifdef BSD
X			if (dup2(ttyfd,0) < 0) {
X				perror("dup2");
X				exit(1);
X			}
X			if (close(ttyfd)) perror(ttynm);
X			for (i=3;i < 20;ioctl(i++,FIOCLEX,NULL));
X#ifdef TIOCGPGRP
X			ioctl(0,TIOCGPGRP,&i);
X			setpgrp(0,i);
X#endif
X#else /* SYSIII SYSV */
X			if (close(0)) {
X				perror("close(0)");
X				exit(1);
X			}
X			if (fcntl(ttyfd,F_DUPFD,0) != 0) {
X				perror("fcntl(ttyfd,F_DUPFD,0)");
X				exit(1);
X			}
X			if (close(ttyfd)) perror(ttynm);
X			for (i=3;i < 20;fcntl(i++,F_SETFD,1));
X#endif /* BSD SYSIII SYSV */
X			sprintf(buf,"%d",(int)plogin);
X			execlp(SWREAD,"rsw",buf,0);
X			perror(SWREAD);
X			exit(1);
X	}
X
X	/* parent; fill in login structure */
X	plogin->ln_tty = ttyfd;
X	plogin->ln_playpid = playpid;
X	plogin->ln_readpid = readpid;
X
X	if (doproctrap == 0) doproctrap = 1;
X#ifdef DEBUG
X	VDBG("setupread return\n");
X#endif
X	return(1);
X}
X#endif /* VMS BSD SYSIII SYSV */
END_OF_proctrap.c
if test 6181 -ne `wc -c <proctrap.c`; then
    echo shar: \"proctrap.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f prvcmd.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"prvcmd.c\"
else
echo shar: Extracting \"prvcmd.c\" \(7159 characters\)
sed "s/^X//" >prvcmd.c <<'END_OF_prvcmd.c'
X/*
X * Spacewar -  priviledged commands for SWMASTER
X *
X * Copyright 1984 obo Systems, Inc.
X * Copyright 1984 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X#ifndef VMS
X#include <sys/types.h>
X#else /* BSD SYSIII SYSV */
X#include <types.h>
X#endif /* VMS */
X#include "universe.h"
X#include "login.h"
X#include "sys.h"
X#include "aln.h"
X#include "build.h"
X#include "obj.h"
X#include "crft.h"
X#include "torp.h"
X
Xstatic char *fmtip();
X
XVOID prvcmd(plogin)
Xstruct login *plogin;
X{
X	char *s=plogin->ln_input,buf[256];
X	struct login *plgn;
X	struct aln *paln;
X	struct sys *psys;
X	struct obj *pobj;
X	struct universe *puniv;
X	struct crft *pcrft;
X	struct torp *ptorp;
X	int i;
X
X#ifdef DEBUG
X	DBG("prvcmd(#%d/%s)\n",plogin-loginlst,plogin->ln_name);
X#endif
X
X	/* only allowed if priviledged */
X	if (strcmp(SWMASTER,plogin->ln_name)) {
X#ifdef DEBUG
X		VDBG("prvcmd return\n");
X#endif
X		return;
X	}
X
X	if (!strcmp(".shutdown",s)) {
X		shutdown(0);
X
X	} else if (!strncmp(".logoff ",s,8)) {
X	    for (s+=8,plgn=loginlst;plgn < loginlst+MAXLOGIN;++plgn) {
X		if (!plgn->ln_tty) continue;
X		if (!strcmp(plgn->ln_name,s)) logoff(plgn);
X	    }
X
X	} else if (!strncmp(".aln",s,4)) {
X	    s += 4;
X	    for (paln=alnlst;paln < alnlst+MAXALN;++paln) {
X		sprintf(buf,
X		"#%-3d (%8.1e %8.1e %8.1e) (%3.0f %3.0f %3.0f) (%2.0f %2.0f %2.0f)",
X		paln-alnlst,paln->al_pstn[0],paln->al_pstn[1],paln->al_pstn[2],
X		paln->al_vel[0],paln->al_vel[1],paln->al_vel[2],
X		paln->al_thr[0],paln->al_thr[1],paln->al_thr[2]);
X		output(plogin,'C',0,buf);
X		sprintf(buf," %d %d %s",paln->al_dly,paln->al_htyp,
X		fmtip(paln->al_lhit));
X		output(plogin,'C',0,buf);
X		sprintf(buf," %s %d\n",fmtip(paln->al_atck),paln->al_aeval);
X		output(plogin,'C',0,buf);
X		if (*s)
X		    for (psys=paln->al_sys;psys < paln->al_sys+MSYS;++psys) {
X			if (!psys->s_cap) continue; /* not in this craft */
X			sprintf(buf,"\t%-8.8s %3d %3d %3d %5d %5d\n",
X			subsysnam[psys-paln->al_sys],psys->s_pct,psys->s_edmg,
X			psys->s_dmg,psys->s_lvl,psys->s_cap);
X			output(plogin,'C',0,buf);
X		    }
X	    }
X
X	} else if (!strncmp(".crft",s,5)) {
X	    s += 5;
X	    for (pcrft=crftlst;pcrft < crftlst+MAXCRFT;++pcrft) {
X		if (!pcrft->cr_htyp) continue;
X		sprintf(buf,"#%-3d %d %5ld %3ld %5ld %5ld %2d %s\n",
X		pcrft-crftlst,pcrft->cr_htyp,pcrft->cr_flsp,pcrft->cr_crew,
X		pcrft->cr_pnts,pcrft->cr_time,pcrft->cr_kill,
X		fmtip(pcrft->cr_dock));
X		output(plogin,'C',0,buf);
X		sprintf(buf,"     (%8.1e %8.1e %8.1e) (%8.1e %8.1e %8.1e)\
X(%3.0f %3.0f %3.0f) (%2.0f %2.0f %2.0f)\n     ",
X		pcrft->cr_pstn[0],pcrft->cr_pstn[1],pcrft->cr_pstn[2],
X		pcrft->cr_dir[0],pcrft->cr_dir[1],pcrft->cr_dir[2],
X		pcrft->cr_vel[0],pcrft->cr_vel[1],pcrft->cr_vel[2],
X		pcrft->cr_thr[0],pcrft->cr_thr[1],pcrft->cr_thr[2]);
X		output(plogin,'C',0,buf);
X		for (i=0;i < MHOM;++i) {
X		    sprintf(buf,"%d:%s ",i,fmtip(pcrft->cr_hom[i]));
X		    output(plogin,'C',0,buf);
X		}
X		sprintf(buf,"  %s %d %5.1f %ld %d\n",fmtip(pcrft->cr_auto),
X		pcrft->cr_ffwd,DIV(pcrft->cr_vang,DEGTORAD),pcrft->cr_vdst,
X		pcrft->cr_plvl);
X		output(plogin,'C',0,buf);
X		if (*s)
X		    for (psys=pcrft->cr_sys;psys < pcrft->cr_sys+MSYS;++psys) {
X			if (!psys->s_cap) continue; /* not in this craft */
X			sprintf(buf,"\t%-8.8s %3d %3d %3d %5d %5d\n",
X			subsysnam[psys-pcrft->cr_sys],psys->s_pct,psys->s_edmg,
X			psys->s_dmg,psys->s_lvl,psys->s_cap);
X			output(plogin,'C',0,buf);
X		    }
X	    }
X	} else if (!strncmp(".login",s,6)) {
X	    s += 6;
X	    for (plgn=loginlst;plgn < loginlst+MAXLOGIN;++plgn) {
X		if (!plgn->ln_tty) continue;
X		if (*s) {
X#ifdef VMS
X		    sprintf(buf,
X		    "#%-3d %2d %x '%-8.8s' '%-8.8s' '%c' '%-12.12s' %s",
X		    plgn-loginlst,plgn->ln_tty,plgn->ln_pid,plgn->ln_name,
X		    plgn->ln_term ? plgn->ln_term : "",
X		    plgn->ln_iomode ? plgn->ln_iomode : ' ',
X		    plgn->ln_crft,fmtip(plgn->ln_play));
X#else /* BSD SYSIII SYSV */
X		    sprintf(buf,
X		    "#%-3d %2d %5d %5d '%-8.8s' '%-8.8s' '%c' '%-12.12s' %s",
X		    plgn-loginlst,plgn->ln_tty,plgn->ln_playpid,
X		    plgn->ln_readpid,plgn->ln_name,
X		    plgn->ln_term ? plgn->ln_term : "",
X		    plgn->ln_iomode ? plgn->ln_iomode : ' ',plgn->ln_crft,
X		    fmtip(plgn->ln_play));
X#endif /* VMS BSD SYSIII SYSV */
X		    output(plogin,'C',0,buf);
X		    sprintf(buf," '%c'\n     '%s'\n",
X		    plgn->ln_stat ? plgn->ln_stat : ' ',plgn->ln_input);
X		    output(plogin,'C',0,buf);
X		} else {
X		    sprintf(buf,"#%-3d '%-8.8s' '%-8.8s' '%c' '%-12.12s' %s",
X		    plgn-loginlst,plgn->ln_name,
X		    plgn->ln_term ? plgn->ln_term : "",
X		    plgn->ln_iomode ? plgn->ln_iomode : ' ',plgn->ln_crft,
X		    fmtip(plgn->ln_play));
X		    output(plogin,'C',0,buf);
X		    sprintf(buf," '%c'\n",plgn->ln_stat ? plgn->ln_stat : ' ');
X		    output(plogin,'C',0,buf);
X		}
X	    }
X
X	} else if (!strncmp(".obj",s,4)) {
X	    s += 4;
X	    for (pobj=objlst;pobj < objlst+MAXOBJ;++pobj) {
X		sprintf(buf,"#%-3d %7ld %3d '%c' %s %5d %7ld %3.0f",
X		pobj-objlst,pobj->oj_mass,pobj->oj_rad,pobj->oj_rep,
X		fmtip(pobj->oj_octr),pobj->oj_oprd,pobj->oj_orad,
X		DIV(pobj->oj_ocrpt,DEGTORAD));
X		output(plogin,'C',0,buf);
X		if (*s) {
X		    sprintf(buf," %5.1f %5.1f %5.1f %3.0f %3.0f %3.0f",
X		    pobj->oj_optx,pobj->oj_opty,pobj->oj_optz,
X		    pobj->oj_vel[0],pobj->oj_vel[1],pobj->oj_vel[2]);
X		    output(plogin,'C',0,buf);
X		}
X		output(plogin,'C',0,"\n");
X	    }
X
X	} else if (!strcmp(".torp",s)) {
X	    for (ptorp=torplst;ptorp < torplst+MAXTORP;++ptorp) {
X		if (!ptorp->tp_aim.ip_ptr) continue;
X		sprintf(buf,"#%-3d (%8.1e %8.1e %8.1e) (%3.0f %3.0f %3.0f) \
X(%2.0f %2.0f %2.0f) %s",
X		ptorp-torplst,ptorp->tp_pstn[0],ptorp->tp_pstn[1],
X		ptorp->tp_pstn[2],ptorp->tp_vel[0],ptorp->tp_vel[1],
X		ptorp->tp_vel[2],ptorp->tp_thr[0],ptorp->tp_thr[1],
X		ptorp->tp_thr[2],fmtip(ptorp->tp_aim));
X		output(plogin,'C',0,buf);
X		sprintf(buf," %s %ld %d",fmtip(ptorp->tp_fby),ptorp->tp_dist,
X		ptorp->tp_dmg);
X		output(plogin,'C',0,buf);
X		sprintf(buf," %s\n",fmtip(ptorp->tp_lhit));
X		output(plogin,'C',0,buf);
X	    }
X
X	} else if (!strcmp(".universe",s)) {
X	    for (puniv=univlst;puniv < univlst+MAXUNIVERSE;++puniv) {
X		if (!puniv->uv_type) continue;
X		sprintf(buf,"#%-3d '%c/%c' %8.1e %8.1e %8.1e %7ld %5d",
X		puniv-univlst,puniv->uv_type,puniv->uv_pctr,
X		puniv->uv_pstn[0],puniv->uv_pstn[1],puniv->uv_pstn[2],
X		puniv->uv_mass,puniv->uv_rad);
X		output(plogin,'C',0,buf);
X		switch(puniv->uv_type) {
X		    case 'A':
X			sprintf(buf," #%-3d\n",puniv->uv_ptr.uv_aln-alnlst);
X			break;
X		    case 'P':
X			sprintf(buf," #%-3d\n",puniv->uv_ptr.uv_crft-crftlst);
X			break;
X		    case 'O':
X			sprintf(buf," #%-3d\n",puniv->uv_ptr.uv_obj-objlst);
X			break;
X		    case 'T':
X			sprintf(buf," #%-3d\n",puniv->uv_ptr.uv_torp-torplst);
X			break;
X		    default:
X			strcpy(buf,"\n");
X			break;
X		}
X		output(plogin,'C',0,buf);
X	    }
X
X	} else if (!strncmp(".lock",s,5)) {
X	    static msg[80+1];
X	    s += 5;
X	    while (*s == ' ') ++s;
X	    strcpy(msg,s);
X	    prvlck((*s) ? msg : NULL);
X
X	} else if (!strcmp(".unlock",s)) {
X	    prvlck("");
X	}
X
X	output(plogin,0,0,0);
X#ifdef DEBUG
X	VDBG("prvcmd return\n");
X#endif
X}
X
Xstatic char *fmtip(ip)
Xidxptr ip;
X{
X	static char buf[16];
X	if (ip.ip_ptr)
X	    sprintf(buf,"#%-3d",ip.ip_ptr-univlst);
X	else
X	    strcpy(buf,"NULL");
X	return(buf);
X}
END_OF_prvcmd.c
if test 7159 -ne `wc -c <prvcmd.c`; then
    echo shar: \"prvcmd.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f scrn.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"scrn.c\"
else
echo shar: Extracting \"scrn.c\" \(6276 characters\)
sed "s/^X//" >scrn.c <<'END_OF_scrn.c'
X/*
X * Spacewar - (play) screen output stuff
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X#ifndef VMS
X#include <sys/types.h>
X#else /* BSD SYSIII SYSV */
X#include <types.h>
X#endif /* VMS */
X#include "universe.h"
X#include "login.h"
X#include "flds.h"
X#include "sys.h"
X#include "crft.h"
X#include "build.h"
X#include "aln.h"
X#include "obj.h"
X#include "torp.h"
X
Xstatic VOID dofld();
Xextern long gametime;
X
XVOID background(pcrft)
Xstruct crft *pcrft;
X{
X	static struct {
X		char bg_row,bg_col,*bg_str;
X	} bg[]={
X		{0,	0,	"-------DIRECTION-------"},
X		{2,	0,	"--------POSITION-------"},
X		{4,	0,	"--------VELOCITY-------"},
X		{7,	0,	"ANGLE"},
X		{7,	6,	"---DST---"},
X		{7,	16,	"SEE"},
X		{7,	20,	"BAD"},
X		{10,	0,	"---------HOMING--------"},
X		{11,	0,	"#1:"},
X		{12,	0,	"#2:"},
X		{13,	0,	"#3:"},
X		{11,	12,	"#4:"},
X		{12,	12,	"#5:"},
X		{13,	12,	"#6:"},
X		{15,	0,	"RADIO:"},
X		{0,	59,	"SYSTEM"},
X		{0,	69,	"LEVEL"},
X		{0,	75,	"%DMG"}
X	};
X	int i;
X	register struct flddesc *pfld;
X
X	for (pfld=flds+FLD_BACKGROUND,i=0;i < sizeof(bg)/sizeof(bg[0]);++i) {
X		pfld->f_row = bg[i].bg_row;
X		pfld->f_col = bg[i].bg_col;
X		output(pcrft->cr_lgn,'L',FLD_BACKGROUND,bg[i].bg_str);
X	}
X}
X
XVOID nums(pcrft)
Xregister struct crft *pcrft;
X{
X	int i,j;
X	struct sys *psys;
X
X	/* direction */
X	dofld(pcrft,FLD_DIR1,0,BIT_DIR1,DIV(pcrft->cr_dir[1],DEGTORAD));
X	dofld(pcrft,FLD_DIR2,0,BIT_DIR2,DIV(pcrft->cr_dir[2],DEGTORAD));
X	if (pcrft->cr_ffwd)
X	    dofld(pcrft,FLD_AUTOFFWD,0,BIT_AUTOFFWD,"FFWD");
X	else if (pcrft->cr_auto.ip_ptr)
X	    dofld(pcrft,FLD_AUTOFFWD,0,BIT_AUTOFFWD,"AUTO");
X	else
X	    dofld(pcrft,FLD_AUTOFFWD,0,BIT_AUTOFFWD,"");
X
X	/* position */
X	dofld(pcrft,FLD_PN1,0,BIT_PN1,pcrft->cr_pstn[0]);
X	dofld(pcrft,FLD_PN2,0,BIT_PN2,pcrft->cr_pstn[1]);
X	dofld(pcrft,FLD_PN3,0,BIT_PN3,pcrft->cr_pstn[2]);
X
X	/* velocity */
X	dofld(pcrft,FLD_VEL1,0,BIT_VEL1,pcrft->cr_vel[0]);
X	dofld(pcrft,FLD_VEL2,0,BIT_VEL2,pcrft->cr_vel[1]);
X	dofld(pcrft,FLD_VEL3,0,BIT_VEL3,pcrft->cr_vel[2]);
X
X	/* viewscreen attributes */
X	dofld(pcrft,FLD_VANGL,0,BIT_VANGL,DIV(pcrft->cr_vang,DEGTORAD));
X	dofld(pcrft,FLD_VDIST,0,BIT_VDIST,pcrft->cr_vdst);
X
X	/* sensors */
X	dofld(pcrft,FLD_SSEE,0,BIT_SSEE,pcrft->cr_sens[0]);
X	dofld(pcrft,FLD_SBAD,0,BIT_SBAD,pcrft->cr_sens[1]);
X
X	/* homing */
X	for (i=0;i < MHOM;++i)
X	    if (pcrft->cr_hom[i].ip_ptr)
X		dofld(pcrft,FLD_HOMCHAN+i,0,BIT_HOMCHAN+i,pcrft->cr_hdst[i]);
X	    else {
X		char *savfmt;
X		struct flddesc *pfld=flds+(FLD_HOMCHAN+i);
X		savfmt = pfld->f_fmt;
X		pfld->f_fmt = "%-7.7s";
X		dofld(pcrft,FLD_HOMCHAN+i,0,BIT_HOMCHAN+i,"");
X		pfld->f_fmt = savfmt;
X	    }
X
X	/* subsystems */
X	for (j=0,psys=pcrft->cr_sys,i=0;i < MSYS;++psys,++i) {
X	    if (!psys->s_cap) continue; /* not in this craft */
X	    dofld(pcrft,FLD_SNAME,i,BIT_SNAME,++j,subsysnam[i]);
X	    dofld(pcrft,FLD_SLEVEL,i,BIT_SLEVEL,psys->s_lvl);
X	    dofld(pcrft,FLD_SDMG,i,BIT_SDMG,psys->s_dmg);
X	}
X
X	/* time */
X	output(pcrft->cr_lgn,'H',FLD_TIME,gametime);
X}
X
X/*VARARGS4*/
Xstatic VOID dofld(pcrft,fld,grp,bit,val1,val2,val3,val4)
Xstruct crft *pcrft;
Xint fld,grp,bit;
Xint val1,val2,val3,val4;
X{
X	extern int nabit();
X
X	bit += grp * flds[fld].f_grpw;
X	if (nabit(pcrft->cr_chng,bit)) {
X		output(pcrft->cr_lgn,'H',(grp<<8)|fld,val1,val2,val3,val4);
X		bitoff(pcrft->cr_chng,bit);
X	}
X}
X
XVOID view(pcrft)
Xregister struct crft *pcrft;
X{
X	char vnew[15][31],buf[31+1];
X	double vdst[15][31],tmpdst,tmpvec[3],hlfvang;
X	dsplcmnt tmpdspl;
X	long ldst;
X	int row,col,savrow,savcol;
X	register struct universe *puniv;
X	static char vinit[]="\
X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\
X@@@@@@@@       |       @@@@@@@@\
X@@@@@          |          @@@@@\
X@@@            |            @@@\
X@@             |             @@\
X@              |              @\
X@              |              @\
X@-------------- --------------@\
X@              |              @\
X@              |              @\
X@@             |             @@\
X@@@            |            @@@\
X@@@@@          |          @@@@@\
X@@@@@@@@       |       @@@@@@@@\
X@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@\
X";
X
X	/* init to 'nothing there' */
X	bcopy((char *)vnew,vinit,sizeof(vnew));
X	binit((char *)vdst,sizeof(vdst));
X	savrow = flds[FLD_VIEWSCREEN].f_row;
X	savcol = flds[FLD_VIEWSCREEN].f_col;
X
X	/* special case: draw entire viewscreen */
X	if (pcrft->cr_scrn[0][0] == NULL) {
X	    buf[31] = NULL;
X	    bcopy((char *)pcrft->cr_scrn,vinit,sizeof(pcrft->cr_scrn));
X	    for (row=0;row < 15;++row) {
X		bcopy(buf,pcrft->cr_scrn[row],31);
X		flds[FLD_VIEWSCREEN].f_row = savrow + row;
X		output(pcrft->cr_lgn,'L',FLD_VIEWSCREEN,buf);
X	    }
X	}
X
X	/* every object except own ship */
X	for (puniv=univlst;puniv < univlst+MAXUNIVERSE;++puniv) {
X	    if (!puniv->uv_type) continue;
X	    if (puniv->uv_ptr.uv_crft == pcrft) continue;
X
X	    /* translate and rotate to center viewscreen on */
X	    /* z-axis then see if its within cone of vision */
X	    /*vdiff(puniv->uv_pstn,pcrft->cr_pstn,tmpvec);*/
X	    tmpdspl = vdisp(puniv,pcrft->cr_lgn->ln_play.ip_ptr,'v');
X	    vecmul(/*tmpvec*/tmpdspl.vec,pcrft->cr_rmat,tmpvec);
X	    rttosp(tmpvec,tmpvec);
X	    hlfvang = DIV(pcrft->cr_vang,2.);
X	    if (SUB(hlfvang,tmpvec[2]) >= 0.) {
X
X		/* determine where it shows on viewscreen */
X		/* closer object wins if they coincide    */
X		tmpdst = tmpvec[0];
X		if (tmpdst == 0.) tmpdst = -1.;
X		tmpvec[0] = DIV(tmpvec[2],hlfvang);
X		tmpvec[2] = DIV(PI,2.);
X		sptort(tmpvec,tmpvec);
X		row = INT(MUL(tmpvec[1],7.)) + 7;
X		col = INT(MUL(tmpvec[0],15.)) + 15;
X		if (vdst[row][col] == 0. || SUB(vdst[row][col],tmpdst) > 0.) {
X		    vdst[row][col] = tmpdst;
X		    ldst = INT(tmpdst);
X		    if (ldst <= pcrft->cr_vdst)
X			vnew[row][col] = puniv->uv_pctr;
X		    else if (ldst <= 5000)
X			vnew[row][col] = '.';
X		    else
X			vdst[row][col] = 0.;
X		}
X	    }
X	}
X
X	/* correct actual viewscreen (only put out differences) */
X	buf[1] = NULL;
X	for (row=0;row < 15;++row) {
X	    for (col=0;col < 31;++col) {
X		if (pcrft->cr_scrn[row][col] != vnew[row][col]) {
X		    flds[FLD_VIEWSCREEN].f_row = savrow + row;
X		    flds[FLD_VIEWSCREEN].f_col = savcol + col;
X		    buf[0] = pcrft->cr_scrn[row][col] = vnew[row][col];
X		    output(pcrft->cr_lgn,(vdst[row][col] <= 0.) ? 'L' : 'H',
X		    FLD_VIEWSCREEN,buf);
X		}
X	    }
X	}
X
X	flds[FLD_VIEWSCREEN].f_row = savrow;
X	flds[FLD_VIEWSCREEN].f_col = savcol;
X}
END_OF_scrn.c
if test 6276 -ne `wc -c <scrn.c`; then
    echo shar: \"scrn.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f see.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"see.c\"
else
echo shar: Extracting \"see.c\" \(7080 characters\)
sed "s/^X//" >see.c <<'END_OF_see.c'
X/*
X * Spacewar - let users see the standings
X *	      shows crafts in dbm(3) order, then
X *	      shows players and their standings in dbm(3) order
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#ifndef VMS
X#include <sys/types.h>
X#include <dbm.h>
X#else /* BSD SYSIII SYSV */
X#include <types.h>
X#include "dbm.h"
X#endif /* VMS */
X#include "spacewar.h"
X#include "universe.h"
X#include "login.h"
X#include "sys.h"
X#include "crft.h"
X#include "plyr.h"
X
Xstruct sstat {
X	char	ss_stat;		/* C(raft) or P(layer) */
X	char	ss_savkey[32];		/* for nextkey(dbm); kludge */
X	int	ss_savsiz;		/* for nextkey(dbm); kludge */
X	struct pst *ss_lst;		/* list of player statistics */
X};
Xstruct pst {
X	struct pst *ps_nxt;		/* next player */
X	char	ps_name[8+1];		/* player's name */
X	long	ps_tpnts,ps_mpnts;	/* total,max points */
X	time_t	ps_ttm,ps_mtm;		/* total,max time */
X	short	ps_tkls,ps_mkls;	/* total,max kills */
X	short	ps_opnts,ps_otm,ps_okls;/* ordering for points, time, kills */
X	short	ps_ncrfts;		/* number of crafts (for avg) */
X};
Xstatic struct pst zpst;
X
Xchar *malloc();
X
X
XVOID see(plogin)
Xregister struct login *plogin;
X{
X	struct sstat *psstat;
X	register struct pst *ppst;
X	struct pst *nxtpst;
X	int nlines=6,nc;
X	char buf[80+1];
X	datum dbmkey,dbmdata;
X	struct crftkey getcrkey;
X	struct crft getcrdat;
X	struct plyrkey getplkey;
X	struct plyr getpldat;
X
X
X#ifdef DEBUG
X	DBG("see(#%d/%s)\n",plogin-loginlst,plogin->ln_name);
X#endif
X
X	/**************/
X	/* first time */
X	/**************/
X	if (!(psstat = (struct sstat *)plogin->ln_substat)) {
X
X	    /* allocate and init subtask status structure */
X	    if (!(psstat = (struct sstat *)malloc(sizeof(struct sstat)))) {
X		perror("see: out of memory for sstat");
X		goto done;
X	    }
X	    binit((char *)psstat,sizeof(*psstat));
X	    psstat->ss_stat = CRAFT;
X	    plogin->ln_substat = (char *)psstat;
X
X	    sprintf(buf,"Output is in groups of %d lines. ",nlines);
X	    output(plogin,'C',0,buf);
X	    output(plogin,'C',0,"Hit return when ready for more.\n");
X	    output(plogin,'C',0,
X	    "A single dot (.) on a line by itself terminates See.\n\n");
X	    plogin->ln_iomode = 'm';
X	    dbmkey = firstkey();
X
X	/****************/
X	/* continuation */
X	/****************/
X	} else {
X	    dbmkey.dptr = ((dbmkey.dsize = psstat->ss_savsiz) > 0) ?
X	    psstat->ss_savkey : NULL;
X	}
X
X#ifdef DEBUG
X	VDBG("see: stat '%c'\n",psstat->ss_stat);
X#endif
X
X	/* terminate */
X	if (!strcmp(plogin->ln_input,".")) goto done;	/* horrendous */
X
X	/*********************************************************/
X	/* keep getting and displaying the current_state records */
X	/*********************************************************/
Xagain:	while (dbmkey.dptr) {
X	    if (dbmkey.dptr[0] == CRAFT && psstat->ss_stat == CRAFT) {
X
X		bcopy((char *)&getcrkey,dbmkey.dptr,sizeof(getcrkey));
X		dbmdata = fetch(dbmkey);
X		if (!dbmdata.dptr) {
X		    perror("see: can't fetch craft");
X		    goto done;
X		}
X		bcopy((char *)&getcrdat,dbmdata.dptr,dbmdata.dsize);
X
X		/* find/create player statistics structure */
X		for (ppst=psstat->ss_lst;ppst;ppst=ppst->ps_nxt)
X		    if (!strcmp(ppst->ps_name,getcrkey.cr_plyr))
X			break;
X		if (!ppst) {
X		    if (!(ppst = (struct pst *)malloc(sizeof(struct pst)))) {
X			perror("see: out of memory for pst");
X			goto done;
X		    }
X		    binit((char *)ppst,sizeof(*ppst));
X		    ppst->ps_nxt = psstat->ss_lst;
X		    psstat->ss_lst = ppst;
X		    strcpy(ppst->ps_name,getcrkey.cr_plyr);
X		}
X
X		/* accumulate statistics */
X		ppst->ps_tpnts += getcrdat.cr_pnts;
X		ppst->ps_ttm += getcrdat.cr_time;
X		ppst->ps_tkls += getcrdat.cr_kill;
X		if (getcrdat.cr_pnts > ppst->ps_mpnts)
X		    ppst->ps_mpnts = getcrdat.cr_pnts;
X		if (getcrdat.cr_time > ppst->ps_mtm)
X		    ppst->ps_mtm = getcrdat.cr_time;
X		if (getcrdat.cr_kill > ppst->ps_mkls)
X		    ppst->ps_mkls = getcrdat.cr_kill;
X		ppst->ps_ncrfts += 1;
X
X		/* show */
X		sprintf(buf,"%-8s %-12s %14ld %14ld %8d\n",
X		getcrkey.cr_plyr,getcrkey.cr_name,getcrdat.cr_pnts,
X		getcrdat.cr_time,getcrdat.cr_kill);
X		output(plogin,'C',0,buf);
X		nlines -= 1;
X
X	    } else if (dbmkey.dptr[0] == PLYR && psstat->ss_stat == PLYR) {
X
X		bcopy((char *)&getplkey,dbmkey.dptr,sizeof(getplkey));
X		dbmdata = fetch(dbmkey);
X		if (!dbmdata.dptr) {
X		    perror("see: can't fetch plyr");
X		    goto done;
X		}
X		bcopy((char *)&getpldat,dbmdata.dptr,sizeof(getpldat));
X
X		/* find player statistics structure */
X		for (ppst=psstat->ss_lst;ppst;ppst=ppst->ps_nxt)
X		    if (!strcmp(ppst->ps_name,getplkey.pl_name))
X			break;
X		if (!ppst)
X		    ppst = &zpst;
X
X		/* show */
X		if (!(nc = ppst->ps_ncrfts)) nc = 1;
X		sprintf(buf,
X		"\n%-8s %12d %5ld/%5ld/%2d %5ld/%5ld/%2d %2d/%2d/%2d\n",
X		getplkey.pl_name,ppst->ps_ncrfts,
X		ppst->ps_tpnts/nc,ppst->ps_mpnts,ppst->ps_opnts,
X		ppst->ps_ttm/nc,ppst->ps_mtm,ppst->ps_otm,
X		ppst->ps_tkls/nc,ppst->ps_mkls,ppst->ps_okls);
X		output(plogin,'C',0,buf);
X		sprintf(buf,"%8s (%10d) (%12ld) (%12ld) (%6d)\n","",
X		getpldat.pl_slst,getpldat.pl_plst,getpldat.pl_tlst,
X		getpldat.pl_klst);
X		output(plogin,'C',0,buf);
X		nlines -= 3;
X	    }
X	    dbmkey = nextkey(dbmkey);
X
X	    /* if output linecount reached, save state */
X	    if (nlines <= 0) {
X		output(plogin,0,0,0);
X		psstat->ss_savsiz = (dbmkey.dptr) ? dbmkey.dsize : 0;
X		bcopy(psstat->ss_savkey,dbmkey.dptr,psstat->ss_savsiz);
X#ifdef DEBUG
X		VDBG("see return\n");
X#endif
X		return;
X	    }
X	}
X
X	/*************************************************/
X	/* no more dbm records, (possibly) switch states */
X	/*************************************************/
X	if (psstat->ss_stat == CRAFT) {
X
X	    /* reset state */
X	    psstat->ss_stat = PLYR;
X	    dbmkey = firstkey();
X
X	    /*************************************************************/
X	    /* compute player's ordering for each of points, time, kills */
X	    /*************************************************************/
X	    nc = 0;
X	    do {
X		for (nxtpst=NULL,ppst=psstat->ss_lst;ppst;ppst=ppst->ps_nxt) {
X		    if (!ppst->ps_opnts)
X			if (!nxtpst || ppst->ps_mpnts > nxtpst->ps_mpnts)
X			    nxtpst = ppst;
X		}
X		if (nxtpst)
X		    nxtpst->ps_opnts = ++nc;
X	    } while (nxtpst);
X	    nc = 0;
X	    do {
X		for (nxtpst=NULL,ppst=psstat->ss_lst;ppst;ppst=ppst->ps_nxt) {
X		    if (!ppst->ps_otm)
X			if (!nxtpst || ppst->ps_mtm > nxtpst->ps_mtm)
X			    nxtpst = ppst;
X		}
X		if (nxtpst)
X		    nxtpst->ps_otm = ++nc;
X	    } while (nxtpst);
X	    nc = 0;
X	    do {
X		for (nxtpst=NULL,ppst=psstat->ss_lst;ppst;ppst=ppst->ps_nxt) {
X		    if (!ppst->ps_okls)
X			if (!nxtpst || ppst->ps_mkls > nxtpst->ps_mkls)
X			    nxtpst = ppst;
X		}
X		if (nxtpst)
X		    nxtpst->ps_okls = ++nc;
X	    } while (nxtpst);
X
X	    goto again;	/* horrendous */
X	}
X
X	/*************************************/
X	/* cleanup - free up allocated space */
X	/*************************************/
Xdone:	for (nxtpst=ppst=psstat->ss_lst;ppst;ppst=nxtpst) {
X	    nxtpst = nxtpst->ps_nxt;
X	    free((char *)ppst);
X	}
X	free((char *)psstat);
X	plogin->ln_iomode = NULL;
X	plogin->ln_stat = NULL;
X	plogin->ln_substat = NULL;
X	output(plogin,'C',0,PROMPT);
X	output(plogin,0,0,0);
X
X#ifdef DEBUG
X	VDBG("see return\n");
X#endif
X}
END_OF_see.c
if test 7080 -ne `wc -c <see.c`; then
    echo shar: \"see.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f updaln.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"updaln.c\"
else
echo shar: Extracting \"updaln.c\" \(5782 characters\)
sed "s/^X//" >updaln.c <<'END_OF_updaln.c'
X/*
X * Spacewar - alien intelligence
X *	      thrust toward and attack
X *	      find a player to attack/randomly de-assign
X *	      if not attacking, randomly thrust toward objects
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X#ifndef VMS
X#include <sys/types.h>
X#else /* BSD SYSIII SYSV */
X#include <types.h>
X#endif /* VMS */
X#include "universe.h"
X#include "sys.h"
X#include "aln.h"
X#include "build.h"
X#include "flds.h"
X#include "login.h"
X#include "crft.h"
X#include "torp.h"
X#include "obj.h"
X
Xstatic VOID thr(paln,tmpvec)
Xstruct aln *paln;
Xdouble *tmpvec;
X{
X	rttosp(tmpvec,tmpvec);
X	tmpvec[0] = FLOAT(RANDOM(50)+20);
X	sptort(tmpvec,tmpvec);
X	vdiff(tmpvec,paln->al_vel,paln->al_thr);
X}
X
XVOID updaln()
X{
X	register struct aln *paln;
X	struct sys *psys;
X	register struct universe *puniv;
X	double vdist(),ftmp,tmpvec[3];
X	long l;
X	int i;
X	dsplcmnt tmpdspl;
X
X#ifdef DEBUG
X	DBG("updaln()\n");
X#endif
X
X	for (paln=alnlst+MAXALN;paln-- > alnlst;paln->al_dly -= 1) {
X	    psys = paln->al_sys;
X	    if (paln->al_atck.ip_ptr) {
X		/*ftmp = vdist(paln->al_atck.ip_ptr->uv_pstn,paln->al_pstn);*/
X		tmpdspl = vdisp(paln->al_atck.ip_ptr,paln->al_univ.ip_ptr,'d');
X		ftmp = tmpdspl.dst;
X	    }
X
X	    /* not attacking or delaying or no energy+phasers to attack with */
X	    if (!paln->al_atck.ip_ptr || paln->al_dly > 0 ||
X	    !psys[DILITH].s_cap || !psys[PHASERS].s_cap)
X		goto noatck;
X
X	    /* too far away to attack; less chance if closer */
X	    if (SUB(ftmp,2500.) > 0.)
X		goto noatck;
X	    if (RANDOM(100) > 15 + INT(ftmp)/25)
X		goto noatck;
X
X	    /* attack and set delay */
X	    if ((l = INT(ftmp)/(RANDOM(50)+1)) > 100L)
X		l = 100L;
X	    if (paln->al_aeval > 500)
X		l += paln->al_aeval/20;
X	    if (l > psys[DILITH].s_lvl && psys[DILITH].s_lvl < 50)
X		goto noatck;
X	    if (l > psys[DILITH].s_lvl)
X		l = psys[DILITH].s_lvl;
X	    psys[DILITH].s_lvl -= l;
X	    l *= psys[PHASERS].s_pct;
X	    l /= 100L;
X	    l *= 100L - psys[PHASERS].s_dmg;
X	    l /= 100L;
X	    l *= psys[PHASERS].s_cap;
X	    l /= 100L;
X	    /*for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;)
X		if (puniv->uv_type == 'A' && puniv->uv_ptr.uv_aln == paln)
X		    damage(puniv,paln->al_atck.ip_ptr,1.,FLOAT(l),
X		    "Phaser attack");
X	    */
X	    damage(paln->al_univ.ip_ptr,paln->al_atck.ip_ptr,1.,FLOAT(l),
X	    "Phaser attack");
X	    paln->al_dly = 3;
Xnoatck:
X
X	    /* find an attackee */
X	    if (paln->al_atck.ip_ptr)
X		;
X	    else if (RANDOM(100) < 10) {	/* find a close one */
X		for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;)
X		    if (puniv->uv_type == 'P' &&
X		    !puniv->uv_ptr.uv_crft->cr_dock.ip_ptr) {
X			tmpdspl = vdisp(paln->al_univ.ip_ptr,puniv,'d');
X			if (SUB(tmpdspl.dst,500.) < 0.) {
X			    paln->al_atck.ip_ptr = puniv;
X			    paln->al_dly = 50;
X			    ftmp = tmpdspl.dst;
X			    break;
X			}
X		    }
X	    } else if (RANDOM(100) > 90) {	/* choose a random one */
X		puniv = univlst + RANDOM(MAXUNIVERSE-MAXOBJ) + MAXOBJ;
X		if (puniv->uv_type == 'P' &&
X		!puniv->uv_ptr.uv_crft->cr_dock.ip_ptr) {
X		    paln->al_atck.ip_ptr = puniv;
X		    paln->al_dly = 50;
X		    /*ftmp = vdist(puniv->uv_pstn,paln->al_pstn);*/
X		    tmpdspl = vdisp(puniv,paln->al_univ.ip_ptr,'d');
X		    ftmp = tmpdspl.dst;
X		}
X	    }
X
X	    /* randomly de-assign; decreasing probability based on aeval */
X	    if (paln->al_atck.ip_ptr &&
X	    RANDOM(5000) < 500 - paln->al_aeval)
X		paln->al_atck.ip_ptr = NULL;
X	    if (paln->al_aeval > 0)
X		paln->al_aeval -= 1; /* decay of evaluation (lose interest) */
X
X	    /* get closer to attackee by warping */
X	    if (paln->al_atck.ip_ptr && psys[WARP].s_cap &&
X	    (l=500L+15L*INT(SQRT(ftmp))) > 1170L && psys[WARP].s_lvl >= l) {
X		psys[WARP].s_lvl -= l;
X		paln->al_dly = 5;
X		for (i=0;i<3;++i)
X		    paln->al_pstn[i] = ADD(paln->al_atck.ip_ptr->uv_pstn[i],
X		    FLOAT(RANDOM(600) - 300));
X		vchngd(paln->al_univ.ip_ptr);
X		for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) {
X		    register struct crft *pcrft;
X		    if (puniv->uv_type != 'P') continue;
X		    pcrft = puniv->uv_ptr.uv_crft;
X		    if (pcrft->cr_auto.ip_ptr &&
X		    pcrft->cr_auto.ip_ptr->uv_type == 'A' &&
X		    pcrft->cr_auto.ip_ptr->uv_ptr.uv_aln == paln) {
X			pcrft->cr_auto.ip_ptr = NULL;
X			biton(pcrft->cr_chng,BIT_AUTOFFWD);
X		    }
X		    if (pcrft->cr_dock.ip_ptr &&
X		    pcrft->cr_dock.ip_ptr->uv_type == 'A' &&
X		    pcrft->cr_auto.ip_ptr->uv_ptr.uv_aln == paln) {
X			pcrft->cr_dock.ip_ptr = NULL;
X			pcrft->cr_scrn[7][15] = '?';
X		    }
X		}
X	    }
X
X	    /* compute thrust */
X	    /* not attacking, go toward an object */
X	    if (!paln->al_atck.ip_ptr && paln->al_dly <= 0) {
X		puniv = univlst + RANDOM(MAXOBJ);
X		/*vdiff(puniv->uv_pstn,paln->al_pstn,tmpvec);*/
X		tmpdspl = vdisp(puniv,paln->al_univ.ip_ptr,'v');
X		thr(paln,/*tmpvec*/tmpdspl.vec);
X		paln->al_dly = 200;
X
X	    /* attacking, go toward attackee */
X	    } else if (paln->al_atck.ip_ptr) {
X
X		if (paln->al_dly < -60) { /* long wait ==> break off */
X		    /*vdiff(paln->al_pstn,paln->al_atck.ip_ptr->uv_pstn,tmpvec);*/
X		    tmpdspl = vdisp(paln->al_univ.ip_ptr,paln->al_atck.ip_ptr,'v');
X		    thr(paln,/*tmpvec*/tmpdspl.vec);
X		    paln->al_dly = 20;
X		    paln->al_atck.ip_ptr = NULL;
X		} else {
X		    /*ftmp = vdist(paln->al_pstn,paln->al_atck.ip_ptr->uv_pstn);*/
X		    tmpdspl = vdisp(paln->al_univ.ip_ptr,paln->al_atck.ip_ptr,'d');
X		    ftmp = tmpdspl.dst;
X		    for (i=0;i<3;++i)
X			tmpvec[i] = ADD(paln->al_pstn[i],paln->al_vel[i]);
X		    ftmp = SUB(ftmp,vdist(tmpvec,paln->al_atck.ip_ptr->uv_pstn));
X		    if (ftmp <= 0.) { /* getting further away */
X			/*vdiff(paln->al_atck.ip_ptr->uv_pstn,paln->al_pstn,tmpvec);*/
X			tmpdspl = vdisp(paln->al_atck.ip_ptr,paln->al_univ.ip_ptr,'v');
X			thr(paln,/*tmpvec*/tmpdspl.vec);
X		    }
X		}
X	    }
X	}
X
X#ifdef DEBUG
X	VDBG("updaln return\n");
X#endif
X}
END_OF_updaln.c
if test 5782 -ne `wc -c <updaln.c`; then
    echo shar: \"updaln.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f updmov.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"updmov.c\"
else
echo shar: Extracting \"updmov.c\" \(7076 characters\)
sed "s/^X//" >updmov.c <<'END_OF_updmov.c'
X/*
X * Spacewar - updates movement of non-objects
X *	      from rocket thrust
X *	      from gravity
X *	      checks and carries out crashing into objects
X *	      docked crfts are updated
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X#ifndef VMS
X#include <sys/types.h>
X#else /* BSD SYSIII SYSV */
X#include <types.h>
X#endif /* VMS */
X#include "universe.h"
X#include "sys.h"
X#include "login.h"
X#include "obj.h"
X#include "crft.h"
X#include "aln.h"
X#include "torp.h"
X#include "build.h"
X#include "flds.h"
X
Xextern double vlen();
X
XVOID updmov()
X{
X	register struct universe *puniv,*pobj;
X	register struct sys *psys;
X	double *ppstn,*pvel,*pthr;
X	double accel[3],ftmp,tmpvec[3];
X	char *pchng;
X	long l,m,sub;
X	register int i;
X	dsplcmnt tmpdspl;
X
X#ifdef DEBUG
X	DBG("updmov()\n");
X#endif
X
X	for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) {
X
X	    /**********/
X	    /* set up */
X	    /**********/
X	    ppstn = puniv->uv_pstn;
X	    sub = 0L;
X	    switch(puniv->uv_type) {
X		case 'A':
X		    pvel = puniv->uv_ptr.uv_aln->al_vel;
X		    pthr = puniv->uv_ptr.uv_aln->al_thr;
X		    psys = puniv->uv_ptr.uv_aln->al_sys;
X		    pchng = NULL;
X		    break;
X		case 'P':
X		    if (puniv->uv_ptr.uv_crft->cr_dock.ip_ptr) continue;
X		    pvel = puniv->uv_ptr.uv_crft->cr_vel;
X		    pthr = puniv->uv_ptr.uv_crft->cr_thr;
X		    psys = puniv->uv_ptr.uv_crft->cr_sys;
X		    pchng = puniv->uv_ptr.uv_crft->cr_chng;
X		    break;
X		case 'T':
X		    pvel = puniv->uv_ptr.uv_torp->tp_vel;
X		    pthr = puniv->uv_ptr.uv_torp->tp_thr;
X		    psys = NULL;
X		    pchng = NULL;
X		    break;
X		default:
X		    continue;
X	    }
X
X	    /***********************************/
X	    /* acceleration from rocket thrust */
X	    /***********************************/
X	    rttosp(pthr,accel);
X	    if (accel[0] != 0.) {
X		l = INT(accel[0]);
X
X		/* limited by how much fuel is available and maximum */
X		/* acceleration (reduced by damage to rockets) */
X		if (psys && psys[ROCKETS].s_cap) {
X		    if (l > psys[ROCKETS].s_lvl) {
X			sub += l - psys[ROCKETS].s_lvl;
X			l = psys[ROCKETS].s_lvl;
X		    }
X		    m = psys[ROCKETS].s_cap;
X		    m *= 100L - psys[ROCKETS].s_dmg;
X		    m /= 100L;
X		    if (l > m) {
X			sub += l - m;
X			l = m;
X		    }
X		}
X
X		/* limited by maximum hull acceleration */
X		if (psys && l > psys[HULL].s_cap) {
X		    sub += l - psys[HULL].s_cap;
X		    l = psys[HULL].s_cap;
X		} else if (puniv->uv_type == 'T' && l > MAXTTHR) {
X		    sub += l - MAXTTHR;
X		    l = MAXTTHR;
X		}
X
X		/* reduce fuel (only for Players) */
X		if (l && psys && psys[ROCKETS].s_cap) {
X		    if (pchng) {
X			psys[ROCKETS].s_lvl -= l;
X			biton(pchng,BIT_SLEVEL+ROCKETS*flds[FLD_SLEVEL].f_grpw);
X		    }
X		}
X
X		/* reduce thrust */
X		accel[0] = SUB(accel[0],FLOAT(sub));
X		sptort(accel,accel);
X		for (i=0;i<3;++i) {
X		    pthr[i] = SUB(pthr[i],accel[i]);
X
X		    /* close enough to zero to be zero */
X		    if ((ftmp=pthr[i]) < 0.) ftmp = NEG(ftmp);
X		    if (SUB(ftmp,1.) < 0.) pthr[i] = 0.;
X		}
X	    }
X
X	    /*****************************/
X	    /* acceleration from gravity */
X	    /*****************************/
X	    if (!pchng || !puniv->uv_ptr.uv_crft->cr_plvl)
X		for (pobj=univlst+MAXOBJ;pobj-- > univlst;) {
X
X		    /* vector and distance to object */
X		    /*vdiff(pobj->uv_pstn,ppstn,tmpvec);*/
X		    /*ftmp = vlen(tmpvec);*/
X		    tmpdspl = vdisp(pobj,puniv,'b');
X		    ftmp = tmpdspl.dst;
X
X		    /* crash */
X		    if ((l = INT(ftmp)) < 2*(pobj->uv_rad+1)) {
X			struct crft *pcrft;
X			if (puniv->uv_type == 'T') {
X			    if (puniv->uv_ptr.uv_torp->tp_fby.ip_ptr &&
X			    puniv->uv_ptr.uv_torp->
X			    tp_fby.ip_ptr->uv_type == 'P') {
X				setrpt(pcrft=puniv->uv_ptr.uv_torp->
X				tp_fby.ip_ptr->uv_ptr.uv_crft);
X				output(pcrft->cr_lgn,'B',0,0);
X				rpt(pcrft,"Your torpedo crashed");
X				fnshrpt(pcrft,1);
X			    }
X			    if (puniv->uv_ptr.uv_torp->tp_lhit.ip_ptr &&
X			    puniv->uv_ptr.uv_torp->
X			    tp_lhit.ip_ptr->uv_type == 'P') {
X				setrpt(pcrft=puniv->uv_ptr.uv_torp->
X				tp_lhit.ip_ptr->uv_ptr.uv_crft);
X				output(pcrft->cr_lgn,'B',0,0);
X				rpt(pcrft,"Torpedo destroyed by you (crashed)");
X				fnshrpt(pcrft,1);
X			    }
X			} else if (puniv->uv_type == 'A') {
X			    if (puniv->uv_ptr.uv_aln->al_lhit.ip_ptr &&
X			    puniv->uv_ptr.uv_aln->
X			    al_lhit.ip_ptr->uv_type == 'P') {
X				setrpt(pcrft=puniv->uv_ptr.uv_aln->
X				al_lhit.ip_ptr->uv_ptr.uv_crft);
X				output(pcrft->cr_lgn,'B',0,0);
X				rpt(pcrft,"Alien destroyed by you (crashed)");
X				fnshrpt(pcrft,1);
X			    }
X			}
X			if (pchng) {
X			    struct login *plgn;
X			    pcrft = puniv->uv_ptr.uv_crft;
X			    pcrft->cr_dock.ip_ptr = NULL; /* assure destruc. */
X			    pcrft->cr_sens[1] = 1; /* assure destruction */
X			    unplay(plgn=pcrft->cr_lgn);
X			    output(plgn,'B',0,0);
X			    output(plgn,'E',0,0);
X			    output(plgn,'C',0,"You have crashed");
X			    output(plgn,'C',0,PROMPT);
X			    output(plgn,0,0,0);
X			} else {
X			    idxptr prmv;
X			    prmv.ip_ptr = puniv;
X			    remove(prmv);
X			}
X			goto nxtuobj;
X		    }
X
X		    /* acceleration from gravity */
X		    if (l < 250L) { /* cube root of 10*greatest_mass_object */
X			ftmp = CUBE(ftmp);
X			for (i=0;i<3;++i)
X			    accel[i] = ADD(accel[i],
X			    DIV(MUL(pobj->uv_mass,tmpdspl.vec[i]),ftmp));
X		    }
X		}
X
X	    /* show acceleration if Player */
X	    if (pchng)
X		if ((l=INT(vlen(accel))) != psys[HULL].s_lvl) {
X		    psys[HULL].s_lvl = l;
X		    biton(pchng,BIT_SLEVEL+HULL*flds[FLD_SLEVEL].f_grpw);
X		}
X
X	    /*******************************************/
X	    /* position and velocity from acceleration */
X	    /*******************************************/
X	    for (i=0;i<3;++i) {
X
X		/* close enough to zero to be zero */
X		if ((ftmp=accel[i]) < 0.) ftmp = NEG(ftmp);
X		if (SUB(ftmp,.1) < 0.) accel[i] = 0.;
X
X		ftmp = ADD(ADD(ppstn[i],pvel[i]),DIV(accel[i],2.));
X		if (pchng && INT(ftmp) != INT(ppstn[i]))
X		    biton(pchng,BIT_PN1+i);
X		ppstn[i] = ftmp;
X
X		ftmp = ADD(pvel[i],accel[i]);
X		if (pchng && INT(MUL(ftmp,50.)) != INT(MUL(pvel[i],50.)))
X		    biton(pchng,BIT_VEL1+i);
X		pvel[i] = ftmp;
X
X		/* close enough to zero to be zero */
X		if (ftmp < 0.) ftmp = NEG(ftmp);
X		if (SUB(ftmp,.1) < 0.) pvel[i] = 0.;
X	    }
X	    vchngd(puniv);
Xnxtuobj:;
X	}
X
X	/**********/
X	/* docked */
X	/**********/
X	for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) {
X	    if (puniv->uv_type != 'P') continue;
X	    pvel = puniv->uv_ptr.uv_crft->cr_vel;
X	    if (pobj = puniv->uv_ptr.uv_crft->cr_dock.ip_ptr) {
X		/*vdiff(pobj->uv_pstn,puniv->uv_pstn,tmpvec);*/
X		tmpdspl = vdisp(pobj,puniv,'v');
X		vcopy(tmpvec,tmpdspl.vec);
X		for (i=0;i<3;++i) {
X
X		    /* close enough to zero to be zero */
X		    if ((ftmp=tmpvec[i]) < 0.) ftmp = NEG(ftmp);
X		    if (SUB(ftmp,.1) < 0.) tmpvec[i] = 0.;
X
X		    if (INT(MUL(tmpvec[i],50.)) != INT(MUL(pvel[i],50.)))
X			biton(puniv->uv_ptr.uv_crft->cr_chng,BIT_VEL1+i);
X		    pvel[i] = tmpvec[i];
X
X		    if (INT(pobj->uv_pstn[i]) != INT(puniv->uv_pstn[i]))
X			biton(puniv->uv_ptr.uv_crft->cr_chng,BIT_PN1+i);
X		    puniv->uv_pstn[i] = pobj->uv_pstn[i];
X		}
X		vchngd(puniv);
X	    }
X	}
X
X#ifdef DEBUG
X	VDBG("updmov return\n");
X#endif
X}
END_OF_updmov.c
if test 7076 -ne `wc -c <updmov.c`; then
    echo shar: \"updmov.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 3 \(of 6\).
cp /dev/null ark3isdone
MISSING=""
for I in 1 2 3 4 5 6 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 6 archives.
    rm -f ark[1-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0