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

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

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



#! /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 5 (of 6)."
# Contents:  bits.c crft.h crftupdate.c dbm.c dmpdbm.c flds.h logoff.c
#   logon.c objinit.c objupdate.c output.c remove.c shutdown.c
#   spacewar.h swobj.init upddsh.c updobjs.c updtorp.c vdisp.c
#   vmsrsw.c
# Wrapped by billr@saab on Tue May 31 09:54:54 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f bits.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"bits.c\"
else
echo shar: Extracting \"bits.c\" \(448 characters\)
sed "s/^X//" >bits.c <<'END_OF_bits.c'
X/*
X * Spacewar - turn bits on, off, and return value
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X
X#define BPB	8	/* bits per byte */
X
XVOID biton(ary,bitno)
Xchar ary[];
Xint bitno;
X{
X	ary[bitno/BPB] |= 1<<(bitno%BPB);
X}
X
XVOID bitoff(ary,bitno)
Xchar ary[];
Xint bitno;
X{
X	ary[bitno/BPB] &= ~(1<<(bitno%BPB));
X}
X
Xnabit(ary,bitno)
Xchar ary[];
Xint bitno;
X{
X	return((ary[bitno/BPB]>>(bitno%BPB))&1);
X}
END_OF_bits.c
if test 448 -ne `wc -c <bits.c`; then
    echo shar: \"bits.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f crft.h -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"crft.h\"
else
echo shar: Extracting \"crft.h\" \(1875 characters\)
sed "s/^X//" >crft.h <<'END_OF_crft.h'
X/*
X * Spacewar - include file that defines a player's craft structure
X *	      (requires prior inclusion of sys.h, login.h, and universe.h)
X *
X * Copyright 1984 obo Systems, Inc.
X * Copyright 1984 Dan Rosenblatt
X */
X
X#define CRAFT	'C'	/* prefix for dbm(3) key */
X
Xstruct crftkey {
X	char	cr_crftkey;	/* prefix for dbm(3) key */
X	char	cr_plyr[8+1];	/* player(owner) name */
X	char	cr_name[12+1];	/* craft name */
X};
X
X#define MHOM	6
X
Xstruct crft {
X	char	cr_htyp;	/* craft hull type */
X	long	cr_flsp;	/* craft free floor space */
X	long	cr_crew;	/* craft free crew */
X	long	cr_pnts;	/* craft points */
X	time_t	cr_time;	/* craft playing time */
X	short	cr_kill;	/* craft credited kills */
X	idxptr	cr_dock;	/* craft docked at (object) */
X	double	cr_pstn[3];	/* craft position */
X	double	cr_dir[3];	/* craft direction */
X	double	cr_vel[3];	/* craft velocity */
X	double	cr_thr[3];	/* craft thrust */
X	idxptr	cr_hom[MHOM];	/* craft homing channels */
X	idxptr	cr_auto;	/* craft autopilot */
X	char	cr_ffwd;	/* craft facing forward */
X	double	cr_vang;	/* craft viewing angle */
X	long	cr_vdst;	/* craft visual distance */
X	char	cr_plvl;	/* craft privilege level */
X
X/* in-core only */
X	struct login *cr_lgn;	/* craft login */
X	idxptr	cr_univ;		/* craft universe pointer */
X	long	cr_hdst[MHOM];	/* craft homing channel distances */
X	char	cr_sens[2];	/* craft sensors */
X	idxptr	cr_lhit;	/* craft last hit by */
X	double	cr_lhpstn[3];	/* craft last hit from position */
X	char	cr_lrpt;	/* craft last report line */
X	char	cr_lcmd;	/* craft last command line */
X	char	cr_chng[10];	/* craft field changed flags */
X	char	cr_scrn[15][31];/* craft viewscreen */
X	double	cr_rmat[3][3];	/* craft rotation matrix */
X	struct sys cr_sys[MSYS];/* craft systems */
X};
X
X#define MAXCRFT	MAXLOGIN
X
Xextern struct crft crftlst[];
X
X#define CRDATSIZ (((char *)(&crftlst[0].cr_lgn))-((char *)(&crftlst[0].cr_htyp)))
END_OF_crft.h
if test 1875 -ne `wc -c <crft.h`; then
    echo shar: \"crft.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f crftupdate.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"crftupdate.c\"
else
echo shar: Extracting \"crftupdate.c\" \(2687 characters\)
sed "s/^X//" >crftupdate.c <<'END_OF_crftupdate.c'
X/*
X * Spacewar - update crafts to database
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
XVOID crftupdate(plogin)
Xregister struct login *plogin;
X{
X	struct login *plow,*phigh;
X	struct crftkey getcrkey;
X	struct crft getcrdat;
X	struct syskey getskey;
X	datum dbmkey,dbmdata;
X	register struct sys *psys;
X	register int i;
X
X
X	/* do a specific one or all */
X	if (plogin) {
X#ifdef DEBUG
X	    DBG("crftupdate(#%d/%s)\n",plogin-loginlst,plogin->ln_name);
X#endif
X	    plow = phigh = plogin;
X	} else {
X#ifdef DEBUG
X	    DBG("crftupdate(#ALL)\n");
X#endif
X	    plow = loginlst;
X	    phigh = loginlst + MAXLOGIN - 1;
X	}
X
X	/* update associated crafts and subsystems to the database */
X	for (plogin=plow;plogin <= phigh;++plogin) {
X
X	    /* skip if not a player or not playing */
X	    if (!plogin->ln_tty || !plogin->ln_play.ip_ptr)
X		continue;
X
X	    /* update craft */
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_crft);
X	    dbmkey.dptr = (char *)&getcrkey;
X	    dbmkey.dsize = sizeof(getcrkey);
X
X	    /* normalize idxptr's */
X	    getcrdat = *plogin->ln_play.ip_ptr->uv_ptr.uv_crft;
X	    if (getcrdat.cr_dock.ip_ptr)
X		getcrdat.cr_dock.ip_ofst = getcrdat.cr_dock.ip_ptr - univlst;
X	    else
X		getcrdat.cr_dock.ip_ofst = 0;
X	    if (getcrdat.cr_auto.ip_ptr)
X		getcrdat.cr_auto.ip_ofst = getcrdat.cr_auto.ip_ptr - univlst;
X	    else
X		getcrdat.cr_auto.ip_ofst = 0;
X	    for (i=0;i < MHOM;++i)
X		if (getcrdat.cr_hom[i].ip_ptr)
X		    getcrdat.cr_hom[i].ip_ofst = getcrdat.cr_hom[i].ip_ptr -
X		    univlst;
X		else
X		    getcrdat.cr_hom[i].ip_ofst = 0;
X
X	    dbmdata.dptr = (char *)&getcrdat;
X	    dbmdata.dsize = CRDATSIZ;
X	    if (store(dbmkey,dbmdata))
X		perror("crftupdate: can't update crft");
X
X	    /* update craft 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,plogin->ln_crft);
X	    dbmkey.dptr = (char *)&getskey;
X	    dbmkey.dsize = sizeof(getskey);
X	    dbmdata.dsize = sizeof(struct sys);
X	    for (psys=getcrdat.cr_sys,i=0;i < MSYS;++psys,++i) {
X		if (!psys->s_cap) continue;  /* not in this craft */
X		getskey.s_type = i;
X		dbmdata.dptr = (char *)psys;
X		if (store(dbmkey,dbmdata))
X		    perror("crftupdate: can't update sys");
X	    }
X	}
X
X#ifdef DEBUG
X	VDBG("crftupdate return\n");
X#endif
X}
END_OF_crftupdate.c
if test 2687 -ne `wc -c <crftupdate.c`; then
    echo shar: \"crftupdate.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f dbm.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"dbm.c\"
else
echo shar: Extracting \"dbm.c\" \(3438 characters\)
sed "s/^X//" >dbm.c <<'END_OF_dbm.c'
X/*
X * NOTE: VMS only
X */
X
X#include "dbm.h"
X#include <rms.h>
X#include <stdio.h>
X
Xstatic struct FAB dbmfab;
Xstatic struct RAB dbmrab;
Xstatic struct XABKEY dbmxab;
Xstatic char *dbmfile;
Xstatic char reckey[24],recdat[512];
X
Xdbminit(file)
Xchar *file;
X{
X	int e;
X
X	dbmfile = file;
X
X	dbmfab=cc$rms_fab;
X	dbmrab=cc$rms_rab;
X	dbmxab=cc$rms_xabkey;
X
X	/* open the file */
X	dbmfab.fab$b_fac = FAB$M_PUT + FAB$M_GET + FAB$M_DEL + FAB$M_UPD;
X	dbmfab.fab$b_shr = FAB$M_SHRPUT + FAB$M_SHRGET + FAB$M_SHRDEL +
X	FAB$M_SHRUPD;
X	dbmfab.fab$l_fna = file;
X	dbmfab.fab$b_fns = strlen(file);
X	dbmfab.fab$l_xab = &dbmxab;
X	if ((e=sys$open(&dbmfab)) != RMS$_KFF && e != RMS$_NORMAL) {
X		fprintf(stderr,"dbminit 1 rms=%x ",e);
X		return(-1);
X	}
X
X	/* set up for record I/O */
X	dbmrab.rab$l_fab = &dbmfab;
X	dbmrab.rab$b_krf = 0;
X	if ((e=sys$connect(&dbmrab)) != RMS$_NORMAL) {
X		fprintf(stderr,"dbminit 2 rms=%x ",e);
X		return(-1);
X	}
X
X	return(0);
X}
X
Xdbmclose()
X{
X	int e;
X
X	if ((e=sys$close(&dbmfab)) != RMS$_NORMAL) {
X		fprintf(stderr,"dbmclose rms=%x ",e);
X		return(-1);
X	}
X	return(0);
X}
X
Xdatum fetch(key)
Xdatum key;
X{
X	datum rec;
X	int e;
X
X	rec.dptr = (char *)0;
X
X	dbmrab.rab$b_rac = RAB$C_KEY;
X	dbmrab.rab$w_usz = sizeof(recdat);
X	dbmrab.rab$l_ubf = recdat;
X	dbmrab.rab$l_kbf = key.dptr;
X	dbmrab.rab$b_ksz = key.dsize;
X	dbmrab.rab$l_rop = RAB$M_NLK;
X	if ((e=sys$get(&dbmrab)) != RMS$_NORMAL && e != RMS$_RNF) {
X		fprintf(stderr,"fetch rms=%x ",e);
X	}
X	if (e == RMS$_NORMAL) {
X		rec.dptr = dbmrab.rab$l_rbf + sizeof(reckey);
X		rec.dsize = dbmrab.rab$w_rsz - sizeof(reckey);
X	}
X	return(rec);
X}
X
Xdbmdelete(key)
Xdatum key;
X{
X	int e;
X
X	dbmrab.rab$b_rac = RAB$C_KEY;
X	dbmrab.rab$l_kbf = key.dptr;
X	dbmrab.rab$b_ksz = key.dsize;
X	dbmrab.rab$l_rop = RAB$M_FDL;
X	if ((e=sys$find(&dbmrab)) != RMS$_NORMAL && e != RMS$_RNF) {
X		fprintf(stderr,"dbmdelete 1 rms=%x ",e);
X	}
X	if (e == RMS$_NORMAL) {
X		if ((e=sys$delete(&dbmrab)) != RMS$_NORMAL) {
X			fprintf(stderr,"dbmdelete 2 rms=%x ",e);
X			return(-1);
X		}
X		return(0);
X	} else
X		return(-1);
X}
X
Xstore(key, dat)
Xdatum key, dat;
X{
X	int e;
X
X	dbmrab.rab$b_rac = RAB$C_KEY;
X	binit(recdat,sizeof(reckey));
X	bcopy(recdat,key.dptr,key.dsize);
X	bcopy(recdat+sizeof(reckey),dat.dptr,dat.dsize);
X	dbmrab.rab$l_kbf = recdat;
X	dbmrab.rab$b_ksz = sizeof(reckey);
X	dbmrab.rab$l_rbf = recdat;
X	dbmrab.rab$w_rsz = sizeof(reckey) + dat.dsize;
X	dbmrab.rab$l_rop = RAB$M_LOA + RAB$M_UIF;
X	if ((e=sys$put(&dbmrab)) != RMS$_NORMAL) {
X		fprintf(stderr,"store rms=%x ",e);
X		return(-1);
X	}
X	return(0);
X}
X
Xdatum firstkey()
X{
X	datum key;
X	int e;
X
X	key.dptr = (char *)0;
X
X	dbmrab.rab$b_rac = RAB$C_SEQ;
X	if ((e=sys$rewind(&dbmrab)) != RMS$_NORMAL) {
X		fprintf(stderr,"firstkey 1 rms=%x ",e);
X	}
X	if (e == RMS$_NORMAL) {
X		dbmrab.rab$l_rop = RAB$M_NLK;
X		dbmrab.rab$w_usz = sizeof(recdat);
X		dbmrab.rab$l_ubf = recdat;
X		if ((e=sys$get(&dbmrab)) != RMS$_NORMAL && e != RMS$_EOF) {
X			fprintf(stderr,"firstkey 2 rms=%x ",e);
X		}
X		if (e == RMS$_NORMAL) {
X			key.dptr = dbmrab.rab$l_rbf;
X			key.dsize = sizeof(reckey);
X		}
X	}
X	return(key);
X}
X
Xdatum nextkey(xkey)
Xdatum xkey;
X{
X	datum key;
X	int e;
X
X	key.dptr = (char *)0;
X
X	dbmrab.rab$b_rac = RAB$C_SEQ;
X	dbmrab.rab$l_rop = RAB$M_NLK;
X	dbmrab.rab$w_usz = sizeof(recdat);
X	dbmrab.rab$l_ubf = recdat;
X	if ((e=sys$get(&dbmrab)) != RMS$_NORMAL && e != RMS$_EOF) {
X		fprintf(stderr,"nextkey rms=%x ",e);
X	}
X	if (e == RMS$_NORMAL) {
X		key.dptr = dbmrab.rab$l_rbf;
X		key.dsize = sizeof(reckey);
X	}
X	return(key);
X}
END_OF_dbm.c
if test 3438 -ne `wc -c <dbm.c`; then
    echo shar: \"dbm.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f dmpdbm.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"dmpdbm.c\"
else
echo shar: Extracting \"dmpdbm.c\" \(3468 characters\)
sed "s/^X//" >dmpdbm.c <<'END_OF_dmpdbm.c'
X/*
X * Spacewar - dump all dbm(3) records
X *
X * Copyright 1984 obo Systems, Inc.
X * Copyright 1984 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 "mlbx.h"
X#include "plyr.h"
X#include "ucmd.h"
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X	datum dbmkey,dbmdata;
X	struct crftkey crk;
X	struct crft crd;
X	struct mlbxkey mbk;
X	struct plyrkey plk;
X	struct plyr pld;
X	struct ucmdkey uck;
X	struct syskey sk;
X	struct sys s;
X	int dodtl = (argc > 1);
X	char *asctime(),*ctime();
X
X	if (dbminit(SWDATABASE)) {
X		perror(SWDATABASE);
X		exit(1);
X	}
X
X	for (dbmkey=firstkey();dbmkey.dptr;dbmkey=nextkey(dbmkey))
X	    switch(dbmkey.dptr[0]) {
X
X		case CRAFT:
X		    bcopy((char *)&crk,dbmkey.dptr,sizeof(crk));
X		    printf("craft '%s' '%s': ",crk.cr_plyr,crk.cr_name);
X		    dbmdata = fetch(dbmkey);
X		    if (!dbmdata.dptr)
X			printf("can't fetch\n");
X		    else {
X			bcopy((char *)&crd,dbmdata.dptr,sizeof(crd));
X			printf("%d %ld %ld %ld %ld %d %d\n",
X			crd.cr_htyp,crd.cr_flsp,crd.cr_crew,crd.cr_pnts,
X			crd.cr_time,crd.cr_kill,crd.cr_dock.ip_ofst);
X			if (dodtl) {
X			    printf(
X			    "      (%g %g %g) (%g %g %g) (%g %g %g) (%g %g %g)\n",
X			    crd.cr_pstn[0],crd.cr_pstn[1],crd.cr_pstn[2],
X			    crd.cr_dir[0],crd.cr_dir[1],crd.cr_dir[2],
X			    crd.cr_vel[0],crd.cr_vel[1],crd.cr_vel[2],
X			    crd.cr_thr[0],crd.cr_thr[1],crd.cr_thr[2]);
X			    printf("      %d %d %d %d %d %d %d %d %g %ld %d\n",
X			    crd.cr_hom[0].ip_ofst,crd.cr_hom[1].ip_ofst,
X			    crd.cr_hom[2].ip_ofst,crd.cr_hom[3].ip_ofst,
X			    crd.cr_hom[4].ip_ofst,crd.cr_hom[5].ip_ofst,
X			    crd.cr_auto.ip_ofst,crd.cr_ffwd,crd.cr_vang,
X			    crd.cr_vdst,crd.cr_plvl);
X			}
X		    }
X		    break;
X
X		case MLBX:
X		    bcopy((char *)&mbk,dbmkey.dptr,sizeof(mbk));
X		    printf("mlbx '%s' %d: ",mbk.mb_plyr,mbk.mb_mlbx);
X		    dbmdata = fetch(dbmkey);
X		    if (!dbmdata.dptr)
X			printf("can't fetch\n");
X		    else
X			printf("'%s'\n",dbmdata.dptr);
X		    break;
X
X		case PLYR:
X		    bcopy((char *)&plk,dbmkey.dptr,sizeof(plk));
X		    printf("plyr '%s': ",plk.pl_name);
X		    dbmdata = fetch(dbmkey);
X		    if (!dbmdata.dptr)
X			printf("can't fetch\n");
X		    else {
X			bcopy((char *)&pld,dbmdata.dptr,sizeof(pld));
X			printf("'%s' %d {%.24s} %d %d %d %d %ld %ld %ld\n",
X			pld.pl_passwd,pld.pl_numlgn,
X#ifdef VMS
X			ctime(&pld.pl_lstlgn),
X#else /* BSD SYSIII SYSV */
X			asctime(localtime(&pld.pl_lstlgn)),
X#endif /* VMS BSD SYSIII SYSV */
X			pld.pl_frstml,pld.pl_seenml,pld.pl_lstml,
X			pld.pl_slst,pld.pl_klst,pld.pl_plst,pld.pl_tlst);
X		    }
X		    break;
X
X		case UCMD:
X		    bcopy((char *)&uck,dbmkey.dptr,sizeof(uck));
X		    printf("ucmd '%s' '%s' %d: ",uck.uc_plyr,
X		    uck.uc_name,uck.uc_ucmd);
X		    dbmdata = fetch(dbmkey);
X		    if (!dbmdata.dptr)
X			printf("can't fetch\n");
X		    else
X			printf("'%s'\n",dbmdata.dptr);
X		    break;
X
X		case SUBSYS:
X		    bcopy((char *)&sk,dbmkey.dptr,sizeof(sk));
X		    printf("sys '%s' '%s' %d: ",sk.s_plyr,sk.s_crft,
X		    sk.s_type);
X		    dbmdata = fetch(dbmkey);
X		    if (!dbmdata.dptr)
X			printf("can't fetch\n");
X		    else {
X			bcopy((char *)&s,dbmdata.dptr,sizeof(s));
X			printf("%d %d %d %d %d\n",s.s_pct,s.s_edmg,s.s_dmg,
X			s.s_lvl,s.s_cap);
X		    }
X		    break;
X
X		default:
X		    printf("%c: unknown\n",dbmkey.dptr[0]);
X		    break;
X	    }
X}
END_OF_dmpdbm.c
if test 3468 -ne `wc -c <dmpdbm.c`; then
    echo shar: \"dmpdbm.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f flds.h -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"flds.h\"
else
echo shar: Extracting \"flds.h\" \(2611 characters\)
sed "s/^X//" >flds.h <<'END_OF_flds.h'
X/*
X * Spacewar - definitions for fields
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#ifndef FLDS
Xextern
X#endif
Xstruct flddesc {
X	char	f_row;		/* field row (uppermost is 0) */
X	char	f_col;		/* field column (leftmost is 0) */
X	char	f_len;		/* field length */
X	char	*f_fmt;		/* printf format */
X	char	f_grpw;		/* repeating group width (# of fields) */
X	char	f_maxg;		/* maximum group repetitions */
X} flds[]
X#ifdef FLDS
X    = {
X	/* upper left of viewscreen */
X	{0,	24,	0,	"%s"},
X
X	/* direction */
X	{1,	19,	4,	"%-4.4s"},
X	{1,	6,	5,	"%5.1f"},
X	{1,	12,	5,	"%5.1f"},
X
X	/* position */
X	{3,	0,	7,	"%7.0f"},
X	{3,	8,	7,	"%7.0f"},
X	{3,	16,	7,	"%7.0f"},
X
X	/* velocity */
X	{5,	0,	7,	"%7.1f"},
X	{5,	8,	7,	"%7.1f"},
X	{5,	16,	7,	"%7.1f"},
X
X	/* viewscreen attributes */
X	{8,	0,	5,	"%5.1f"},	/* angle */
X	{8,	6,	9,	"%9ld"},	/* distance */
X
X	/* sensors */
X	{8,	16,	3,	"%3d"},		/* see */
X	{8,	20,	3,	"%3d"},		/* bad */
X
X	/* homing */
X	{11,	4,	7,	"%7ld"},
X	{12,	4,	7,	"%7ld"},
X	{13,	4,	7,	"%7ld"},
X	{11,	16,	7,	"%7ld"},
X	{12,	16,	7,	"%7ld"},
X	{13,	16,	7,	"%7ld"},
X
X	/* radio */
X	{15,	7,	40,	"%-40.40s"},
X
X	/* time */
X	{15,	48,	7,	"%7ld"},
X
X	/* subsystems */
X	{1,	56,	11,	"%2d:%-8.8s",	3,	MSYS},	/* name */
X	{1,	68,	6,	"%6d",	3,	MSYS},	/* level */
X	{1,	76,	3,	"%3d",	3,	MSYS},	/* %damage */
X
X	/* report */
X	{17,	41,	38,	"%-38.38s",	1,	6},
X
X	/* commands */
X	{16,	0,	1,	"%1.1s",	2,	7}, /* last indicator */
X	{16,	1,	40,	"%-40.40s",	2,	7}, /* command */
X
X	/* background */
X	{0,	0,	0,	"%s"}
X}
X#endif
X;
X
X#define FLD_VIEWSCREEN		0
X#define FLD_AUTOFFWD		1
X#define FLD_DIR1		2
X#define FLD_DIR2		3
X#define FLD_PN1			4
X#define FLD_PN2			5
X#define FLD_PN3			6
X#define FLD_VEL1		7
X#define FLD_VEL2		8
X#define FLD_VEL3		9
X#define FLD_VANGL		10
X#define FLD_VDIST		11
X#define FLD_SSEE		12
X#define FLD_SBAD		13
X#define FLD_HOMCHAN		14
X#define FLD_RADIO		20
X#define FLD_TIME		21
X#define FLD_SNAME		22
X#define FLD_SLEVEL		23
X#define FLD_SDMG		24
X#define FLD_REPORT		25
X#define FLD_LSTCMD		26
X#define FLD_COMMAND		27
X#define FLD_BACKGROUND		28
X
X#define BIT_AUTOFFWD		FLD_AUTOFFWD
X#define BIT_DIR1		FLD_DIR1
X#define BIT_DIR2		FLD_DIR2
X#define BIT_PN1			FLD_PN1
X#define BIT_PN2			FLD_PN2
X#define BIT_PN3			FLD_PN3
X#define BIT_VEL1		FLD_VEL1
X#define BIT_VEL2		FLD_VEL2
X#define BIT_VEL3		FLD_VEL3
X#define BIT_VANGL		FLD_VANGL
X#define BIT_VDIST		FLD_VDIST
X#define BIT_SSEE		FLD_SSEE
X#define BIT_SBAD		FLD_SBAD
X#define BIT_HOMCHAN		FLD_HOMCHAN
X#define BIT_RADIO		FLD_RADIO
X#define BIT_TIME		FLD_TIME
X#define BIT_SNAME		FLD_SNAME
X#define BIT_SLEVEL		FLD_SLEVEL
X#define BIT_SDMG		FLD_SDMG
X#define BIT_REPORT		FLD_SNAME+(3*MSYS)
END_OF_flds.h
if test 2611 -ne `wc -c <flds.h`; then
    echo shar: \"flds.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f logoff.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"logoff.c\"
else
echo shar: Extracting \"logoff.c\" \(2660 characters\)
sed "s/^X//" >logoff.c <<'END_OF_logoff.c'
X/*
X * Spacewar - logoff a player:
X *		reset tty modes
X *		close the tty I/O channel
X *	 	terminate (signal) the play and read processes
X *		clear out the login structure
X *
X * Copyright 1984 obo Systems, Inc.
X * Copyright 1984 Dan Rosenblatt
X */
X
X#include <signal.h>
X#include "spacewar.h"
X#include "universe.h"
X#include "login.h"
X
X#ifdef BSD
X#	include <sgtty.h>
X#else /* VMS SYSIII SYSV */
X#ifdef VMS
X#	include <ssdef.h>
X#else /* SYSIII SYSV */
X#	include <sys/types.h>
X#	include <sys/ioctl.h>
X#	include <termio.h>
X#endif /* VMS SYSIII SYSV */
X#endif /* BSD VMS SYSIII SYSV */
X
XVOID logoff(plogin)
Xregister struct login *plogin;
X{
X#ifdef VMS
X	int i;
X#endif /* VMS */
X	extern int errno;
X
X#ifdef DEBUG
X	DBG("logoff(#%d/%s)\n",plogin-loginlst,plogin->ln_name);
X#endif
X
X	/* remove from universe if playing */
X	if (plogin->ln_play.ip_ptr) unplay(plogin);
X
X	/*****************/
X	/* set tty modes */
X	/*****************/
X#ifdef BSD
X	{
X	struct sgttyb tmode;
X
X	if (gtty(plogin->ln_tty,&tmode)) {
X		perror("gtty");
X		goto sigh;	/* horrendous */
X	}
X
X	/* reset echo and no cbreak mode */
X	/* (too bad the previous states weren't saved)  */
X	tmode.sg_flags &= ~CBREAK;
X	tmode.sg_flags |= ECHO;
X
X	if (stty(plogin->ln_tty,&tmode)) {
X		perror("stty");
X		goto sigh;	/* horrendous */
X	}
X	}
X#else /* VMS SYSIII SYSV */
X#ifndef VMS
X	{
X	struct termio tmode;
X
X	if (ioctl(plogin->ln_tty,TCGETA,&tmode)) {
X		perror("ioctl TCGETA");
X		goto sigh;	/* horrendous */
X	}
X
X	/* reset echo and erase/kill edit processing */
X	/* (too bad the previous states weren't saved)  */
X	tmode.c_lflag |= ICANON+ECHO+ECHOE+ECHOK+ECHONL;
X	tmode.c_cc[VEOF] = CEOF;
X	tmode.c_cc[VEOL] = CNUL;
X
X	if (ioctl(plogin->ln_tty,TCSETA,&tmode)) {
X		perror("ioctl TCSETA");
X		goto sigh;	/* horrendous */
X	}
X	}
X#endif /* VMS SYSIII SYSV */
X#endif /* BSD VMS SYSIII SYSV */
X
X	/* close the player's terminal and kill the read and play processes */
Xsigh:
X#ifdef VMS
X	output(plogin,0,0,0);
X	output(plogin,'C',0,"ShUtDoWn");
X	output(plogin,0,0,0);
X	if ((i=sys$delmbx(plogin->ln_tty)) != SS$_NORMAL) {
X		perror("delete mlbx 1");
X#ifdef DEBUG
X		VDBG("logoff delmbx()=%d, errno=%d\n",i,errno);
X#endif
X	}
X	if ((i=sys$dassgn(plogin->ln_tty)) != SS$_NORMAL) {
X		perror("dassgn mlbx 1");
X#ifdef DEBUG
X		VDBG("logoff dassgn()=%d, errno=%d\n",i,errno);
X#endif
X	}
X#else /* BSD SYSIII SYSV */
X	if (close(plogin->ln_tty))
X		perror("close");
X	if (kill(plogin->ln_readpid,SIGTERM))
X		perror("kill readsw");
X	else
X		wait(0);
X	if (kill(plogin->ln_playpid,SIGTERM))
X		perror("kill playsw");
X#endif /* VMS BSD SYSIII SYSV */
X
X	/* reset the login entry */
X	binit((char *)plogin,sizeof(*plogin));
X#ifdef DEBUG
X	VDBG("logoff return\n");
X#endif
X}
END_OF_logoff.c
if test 2660 -ne `wc -c <logoff.c`; then
    echo shar: \"logoff.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f logon.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"logon.c\"
else
echo shar: Extracting \"logon.c\" \(2581 characters\)
sed "s/^X//" >logon.c <<'END_OF_logon.c'
X/*
X * Spacewar - logon a player
X *	      clear out most of the login structure
X *	      set tty modes
X *	      prompt player for his/her name
X *
X * Copyright 1984 obo Systems, Inc.
X * Copyright 1984 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X#include "universe.h"
X#include "login.h"
X
X#ifdef BSD
X#	include <sgtty.h>
X#else /* VMS SYSIII SYSV */
X#ifndef VMS
X#	include <sys/types.h>
X#	include <sys/ioctl.h>
X#	include <termio.h>
X#endif /* VMS SYSIII SYSV */
X#endif /* BSD VMS SYSIII SYSV */
X
XVOID logon(plogin)
Xregister struct login *plogin;
X{
X
X#ifdef DEBUG
X	DBG("logon(#%d/%s)\n",plogin-loginlst,plogin->ln_name);
X#endif
X
X	/* clear out most of login structure */
X	plogin->ln_name[0] = NULL;
X	if (plogin->ln_term)
X		free(plogin->ln_term);
X	plogin->ln_term = NULL;
X	if (plogin->ln_tcm)
X		free(plogin->ln_tcm);
X	plogin->ln_tcm = NULL;
X	if (plogin->ln_tcl)
X		free(plogin->ln_tcl);
X	plogin->ln_tcl = NULL;
X	if (plogin->ln_tce)
X		free(plogin->ln_tce);
X	plogin->ln_tce = NULL;
X	if (plogin->ln_tso)
X		free(plogin->ln_tso);
X	plogin->ln_tso = NULL;
X	if (plogin->ln_tse)
X		free(plogin->ln_tse);
X	plogin->ln_tse = NULL;
X	plogin->ln_rvslh = 0;
X	plogin->ln_iomode = NULL;
X	plogin->ln_crft[0] = NULL;
X	plogin->ln_play.ip_ptr = NULL;
X	plogin->ln_stat = NULL;
X	plogin->ln_substat = NULL;
X	plogin->ln_input[0] = NULL;
X
X	/*****************/
X	/* set tty modes */
X	/*****************/
X#ifdef BSD
X	{
X	struct sgttyb tmode;
X
X	if (gtty(plogin->ln_tty,&tmode)) {
X		perror("gtty");
X		logoff(plogin);
X#ifdef DEBUG
X		VDBG("logon return\n");
X#endif
X		return;
X	}
X
X	/* insure no echo and cbreak mode */
X	/* (too bad the previous states aren't saved)  */
X	tmode.sg_flags |= CBREAK;
X	tmode.sg_flags &= ~(RAW+ECHO);
X
X	if (stty(plogin->ln_tty,&tmode)) {
X		perror("stty");
X		logoff(plogin);
X#ifdef DEBUG
X		VDBG("logon return\n");
X#endif
X		return;
X	}
X	}
X#else /* VMS SYSIII SYSV */
X#ifndef VMS
X	{
X	struct termio tmode;
X
X	if (ioctl(plogin->ln_tty,TCGETA,&tmode)) {
X		perror("ioctl TCGETA");
X		logoff(plogin);
X#ifdef DEBUG
X		VDBG("logon return\n");
X#endif
X		return;
X	}
X
X	/* insure no echo and no erase/kill edit processing */
X	/* (too bad the previous states aren't saved)  */
X	tmode.c_lflag &= ~(ICANON+ECHO+ECHOE+ECHOK+ECHONL);
X	tmode.c_cc[VMIN] = 1;
X	tmode.c_cc[VTIME] = 0;
X
X	if (ioctl(plogin->ln_tty,TCSETA,&tmode)) {
X		perror("ioctl TCSETA");
X		logoff(plogin);
X#ifdef DEBUG
X		VDBG("logon return\n");
X#endif
X		return;
X	}
X	}
X#endif /* VMS */
X#endif /* VMS BSD SYSIII SYSV */
X
X
X	/* prompt player for name */
X	output(plogin,'C',0,"\nWhat is your name?");
X	output(plogin,0,0,0);
X#ifdef DEBUG
X	VDBG("logon return\n");
X#endif
X}
END_OF_logon.c
if test 2581 -ne `wc -c <logon.c`; then
    echo shar: \"logon.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f objinit.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"objinit.c\"
else
echo shar: Extracting \"objinit.c\" \(2205 characters\)
sed "s/^X//" >objinit.c <<'END_OF_objinit.c'
X/*
X * Spacewar - read in objects and set them up for the universe
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#include <stdio.h>
X#include "spacewar.h"
X#include "universe.h"
X#include "obj.h"
X
XVOID objinit()
X{
X	FILE *fobj;
X	struct obj *p=objlst;
X	struct universe *puniv;
X
X#ifdef DEBUG
X	DBG("objinit()\n");
X#endif
X
X	if (!(fobj = fopen(SWOBJ,"r"))) {
X	    perror(SWOBJ);
X	    exit(1);
X	}
X
X	/* try to read the exact number of objects that there should be */
X	for (p=objlst;p < objlst+MAXOBJ;++p)
X	    if (fscanf(fobj,"%ld\t%hd\t%c\t%d\t%hd\t%ld\t%lf\t%lf\t%lf\t%lf\n",
X	    &p->oj_mass,&p->oj_rad,&p->oj_rep,&p->oj_octr.ip_ofst,&p->oj_oprd,
X	    &p->oj_orad,&p->oj_ocrpt,&p->oj_optx,&p->oj_opty,&p->oj_optz) != 10) {
X		perror("bad object");
X		exit(1);
X	    }
X
X	if (!feof(fobj) || ferror(fobj) || fclose(fobj)) {
X	    perror(SWOBJ);
X	    exit(1);
X	}
X
X	/* fix up orbital center and rotation matrix */
X	for (p=objlst+MAXOBJ;p-- > objlst;) {
X
X	    /* validate */
X	    if (p->oj_octr.ip_ofst < 0 ||
X	    p->oj_octr.ip_ofst >= p-objlst) {
X		if (p != objlst) { /* first object is center of universe */
X		    perror("bad oj_octr");
X		    exit(1);
X		}
X	    }
X	    switch(p->oj_rep) {
X		case '.':
X		    p->oj_rep = ' ';
X		case '*': case 'O': case 'o': case '#':
X		    break;
X		default:
X		    perror("bad oj_rep");
X		    exit(1);
X	    }
X
X	    /* rotation matrix */
X	    unity(p->oj_rmat);
X	    xrot(p->oj_rmat,NEG(MUL(p->oj_optx,DEGTORAD)));
X	    yrot(p->oj_rmat,NEG(MUL(p->oj_opty,DEGTORAD)));
X	    zrot(p->oj_rmat,NEG(MUL(p->oj_optz,DEGTORAD)));
X
X	    /* place into universe */
X	    p->oj_octr.ip_ptr = univlst + p->oj_octr.ip_ofst;
X	    puniv = univlst + (p - objlst);
X	    puniv->uv_type = 'O';
X	    puniv->uv_pctr = p->oj_rep;
X	    puniv->uv_pstn = p->oj_pstn;
X	    puniv->uv_mass = p->oj_mass;
X	    puniv->uv_rad = p->oj_rad;
X	    puniv->uv_ptr.uv_obj = p;
X		p->oj_univ.ip_ptr = puniv;
X	}
X
X	/* update objects so that universe position is current */
X	/* (necessary because of first-time players that crank */
X	/* up a new instance of the game and how they are put  */
X	/* into the universe the very first time)	       */
X	updobjs();
X
X#ifdef DEBUG
X	VDBG("objinit return\n");
X#endif
X}
END_OF_objinit.c
if test 2205 -ne `wc -c <objinit.c`; then
    echo shar: \"objinit.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f objupdate.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"objupdate.c\"
else
echo shar: Extracting \"objupdate.c\" \(1211 characters\)
sed "s/^X//" >objupdate.c <<'END_OF_objupdate.c'
X/*
X * Spacewar - update universe orbiting objects to external file
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#include <stdio.h>
X#include "spacewar.h"
X#include "universe.h"
X#include "obj.h"
X
XVOID objupdate()
X{
X	char buf[128];
X	FILE *fobj;
X	register struct obj *p=objlst;
X
X#ifdef DEBUG
X	DBG("objupdate()\n");
X#endif
X
X	/* write to secondary file to be renamed */
X	strcpy(buf,SWOBJ);
X#ifndef VMS
X	strcat(buf,"x");
X#endif
X	if (!(fobj = fopen(buf,"w"))) {
X	    perror(buf);
X#ifdef DEBUG
X	    VDBG("objupdate return\n");
X#endif
X	    return;
X	}
X
X	/* write the exact number of objects */
X	for (p=objlst;p < objlst+MAXOBJ;++p)
X	    fprintf(fobj,"%ld\t%d\t%c\t%d\t%d\t%ld\t%.5f\t%.1f\t%.1f\t%.1f\n",
X	    p->oj_mass,p->oj_rad,(p->oj_rep == ' ') ? '.' : p->oj_rep,
X	    p->oj_octr.ip_ptr-univlst,p->oj_oprd,p->oj_orad,p->oj_ocrpt,
X	    p->oj_optx,p->oj_opty,p->oj_optz);
X
X	if (ferror(fobj) || fclose(fobj)) {
X	    perror(buf);
X#ifdef DEBUG
X	    VDBG("objupdate return\n");
X#endif
X	    return;
X	}
X
X#ifndef VMS
X	/* rename secondary file to be primary */
X	if (unlink(SWOBJ) || link(buf,SWOBJ) || unlink(buf)) {
X	    perror(buf);
X	}
X#endif
X
X#ifdef DEBUG
X	VDBG("objupdate return\n");
X#endif
X}
END_OF_objupdate.c
if test 1211 -ne `wc -c <objupdate.c`; then
    echo shar: \"objupdate.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f output.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"output.c\"
else
echo shar: Extracting \"output.c\" \(3377 characters\)
sed "s/^X//" >output.c <<'END_OF_output.c'
X/*
X * Spacewar - do output to a terminal
X *	      output is built with control/leadin characters
X *		as needed for terminal type and is buffered
X *	      modes are: Delete Erase Converse High Low Beep and (null)
X *
X * Copyright 1984 obo Systems, Inc.
X * Copyright 1984 Dan Rosenblatt
X */
X
X#include <errno.h>
X#include "spacewar.h"
X#include "universe.h"
X#include "login.h"
X#include "sys.h"
X#define FLDS
X#include "flds.h"
X#ifdef VMS
X#	include <iodef.h>
X#	include <ssdef.h>
X#endif /* VMS */
X
Xstatic char outbuf[80*24*2]="";
Xstatic VOID doout(),dowrite();
Xextern int errno;
X
X/*VARARGS1*/
XVOID output(plogin,mode,fld,str,val2,val3,val4)
Xregister struct login *plogin;
Xchar mode;
Xint fld;
Xchar *str;
Xint val2,val3,val4;
X{
X	char *s,buf[256],fmt[16],*so="",*se="",*tgoto();
X	int grp;
X#ifdef VMS
X	int i;
X#endif /* VMS */
X
X	switch(mode) {
X	    case 'B':
X		doout(plogin->ln_tty,"\007");
X		break;
X	    case 'C':
X		doout(plogin->ln_tty,str);
X		break;
X	    case 'D':
X		s = tgoto(plogin->ln_tcm,0,23);
X		doout(plogin->ln_tty,s);
X		doout(plogin->ln_tty,plogin->ln_tce);
X		break;
X	    case 'E':
X		if (s=plogin->ln_tcl)
X		    doout(plogin->ln_tty,s);
X		break;
X	    case 'H':
X	    case 'L':
X		if ((plogin->ln_rvslh && mode == 'L') ||
X		(!plogin->ln_rvslh && mode == 'H')) {
X		    so = plogin->ln_tso;
X		    se = plogin->ln_tse;
X		}
X		grp = (fld>>8)&0xff;
X		fld &= 0xff;
X		sprintf(fmt,"%%s%%s%s",flds[fld].f_fmt); /* no overflow check */
X		sprintf(buf,fmt,
X		tgoto(plogin->ln_tcm,flds[fld].f_col,flds[fld].f_row+grp),
X		so,str,val2,val3,val4);
X		strcat(buf,se);
X		doout(plogin->ln_tty,buf);
X		break;
X	    case 0:
X		if (plogin->ln_play.ip_ptr) {
X		    s = tgoto(plogin->ln_tcm,strlen(plogin->ln_input),23);
X		    doout(plogin->ln_tty,s);
X		}
X		if (outbuf[0]) {
X#ifdef VMS
X		    if ((i=sys$qiow(0,plogin->ln_tty,IO$_WRITEVBLK+IO$M_NOW,
X		    0,0,0,outbuf,strlen(outbuf)+1,0,0,0,0)) != SS$_NORMAL) {
X			perror("output qiow 1");
X#ifdef DEBUG
X			VDBG("output qiow(WRITEVBLK)=%d, errno=%d\n",i,errno);
X#endif
X		    }
X#else /* BSD SYSIII SYSV */
X		    dowrite(plogin->ln_tty,outbuf,strlen(outbuf));
X#endif /* VMS BSD SYSIII SYSV */
X		    outbuf[0] = NULL;
X		}
X		break;
X	    default:
X		write(2,"output: unknown mode\n",21);
X		break;
X	}
X}
X
Xstatic VOID doout(fd,s)
Xshort fd;
Xchar *s;
X{
X#ifdef VMS
X	int i;
X#endif /* VMS */
X
X#if 1 /* with buffering */
X	if (strlen(outbuf)+strlen(s)+1 >= sizeof(outbuf)) {
X#ifdef VMS
X	    if ((i=sys$qiow(0,fd,IO$_WRITEVBLK+IO$M_NOW,0,0,0,
X	    outbuf,strlen(outbuf)+1,0,0,0,0)) != SS$_NORMAL) {
X		perror("output qiow 2");
X#ifdef DEBUG
X		VDBG("output qiow(WRITEVBLK)=%d, errno=%d\n",i,errno);
X#endif
X	    }
X#else /* BSD SYSIII SYSV */
X	    dowrite(fd,outbuf,strlen(outbuf));
X#endif /* VMS BSD SYSIII SYSV */
X	    outbuf[0] = NULL;
X	}
X	strcat(outbuf,s);
X
X#else /* without buffering */
X#ifdef VMS
X	if ((i=sys$qiow(0,fd,IO$_WRITEVBLK+IO$M_NOW,0,0,0,
X	s,strlen(s)+1,0,0,0,0)) != SS$_NORMAL) {
X	    perror("output qiow 3");
X#ifdef DEBUG
X	    VDBG("output qiow(WRITEVBLK)=%d, errno=%d\n",i,errno);
X#endif
X	}
X#else /* BSD SYSIII SYSV */
X	dowrite(fd,s,strlen(s));
X#endif /* VMS BSD SYSIII SYSV */
X#endif /* with/without buffering */
X}
X
X#ifndef VMS
X#include <signal.h>
Xstatic VOID dowrite(fd,s,ls)
Xint fd,ls;
Xchar *s;
X{
X	int oldmask;
X#ifdef BSD
X	oldmask = sigblock(1<<(SIGALRM-1));
X#endif
X	while (write(fd,s,ls) == -1 && errno == EINTR);
X#ifdef BSD
X	sigsetmask(oldmask);
X#endif
X}
X#endif
END_OF_output.c
if test 3377 -ne `wc -c <output.c`; then
    echo shar: \"output.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f remove.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"remove.c\"
else
echo shar: Extracting \"remove.c\" \(3648 characters\)
sed "s/^X//" >remove.c <<'END_OF_remove.c'
X/*
X * Spacewar - remove (nicely) an object from the universe (crft, torp, aln)
X *	      fixes (*)lhit,atck,dock,hom,auto
X *	      aliens are relocated (as if removed and replaced) when removed
X *	      torps are NOT removed if firing crft/aln removed
X *	      torps report a miss if fired at crft/torp/aln removed
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 "crft.h"
X#include "obj.h"
X#include "torp.h"
X#include "flds.h"
X#include "aln.h"
X
XVOID remove(prmv)
Xidxptr prmv;
X{
X	struct universe *puniv=univlst+MAXUNIVERSE;
X	struct aln *paln;
X	struct crft *pcrft;
X	int i;
X	struct torp *ptorp;
X
X#ifdef DEBUG
X	DBG("remove(#%d/'%c/%c')\n",prmv.ip_ptr-univlst,prmv.ip_ptr->uv_type,
X	prmv.ip_ptr->uv_pctr);
X#endif
X
X	while (--puniv >= univlst) {
X	    if (!puniv->uv_type) continue;
X	    /*if (puniv == prmv.ip_ptr) continue;???*/
X
X	    switch(puniv->uv_type) {
X
X		case 'A':
X		    paln = puniv->uv_ptr.uv_aln;
X		    if (paln->al_lhit.ip_ptr == prmv.ip_ptr) {
X			paln->al_lhit.ip_ptr = NULL;
X			paln->al_aeval = 0;
X		    }
X		    if (paln->al_atck.ip_ptr == prmv.ip_ptr) {
X			paln->al_atck.ip_ptr = NULL;
X			paln->al_dly = 0;
X		    }
X		    break;
X
X		case 'P':
X		    pcrft = puniv->uv_ptr.uv_crft;
X		    if (pcrft->cr_dock.ip_ptr == prmv.ip_ptr) {
X			pcrft->cr_dock.ip_ptr = NULL;
X			pcrft->cr_scrn[7][15] = '?';
X		    }
X		    for (i=0;i < MHOM;++i)
X			if (pcrft->cr_hom[i].ip_ptr == prmv.ip_ptr) {
X			    pcrft->cr_hom[i].ip_ptr = NULL;
X			    biton(pcrft->cr_chng,BIT_HOMCHAN+i);
X			}
X		    if (pcrft->cr_auto.ip_ptr == prmv.ip_ptr) {
X			pcrft->cr_auto.ip_ptr = NULL;
X			biton(pcrft->cr_chng,BIT_AUTOFFWD);
X		    }
X		    if (pcrft->cr_lhit.ip_ptr == prmv.ip_ptr)
X			pcrft->cr_lhit.ip_ptr = NULL;
X		    break;
X
X		case 'T':
X		    ptorp = puniv->uv_ptr.uv_torp;
X		    if (ptorp->tp_lhit.ip_ptr == prmv.ip_ptr)
X			ptorp->tp_lhit.ip_ptr = NULL;
X		    if (ptorp->tp_fby.ip_ptr == prmv.ip_ptr) {
X			/**** don't remove (hee hee hee)****/
X			/****idxptr xrmv;		****/
X			/****xrmv.ip_ptr = puniv;	****/
X			/****remove(xrmv);		****/
X			/****continue;			****/
X			ptorp->tp_fby.ip_ptr = NULL;
X		    }
X		    if (ptorp->tp_aim.ip_ptr == prmv.ip_ptr) {
X			if (ptorp->tp_fby.ip_ptr &&
X			ptorp->tp_fby.ip_ptr->uv_type == 'P') {
X			    pcrft = ptorp->tp_fby.ip_ptr->uv_ptr.uv_crft;
X			    output(pcrft->cr_lgn,'B',0,0);
X			    setrpt(pcrft);
X			    rpt(pcrft,"Torpedo missed - target went away");
X			    fnshrpt(pcrft,1);
X			}
X			remove(ptorp->tp_univ);
X			continue;
X		    }
X		    break;
X	    }
X	}
X
X	/* relocate rather than remove aliens */
X	if (prmv.ip_ptr->uv_type == 'A') {
X	    paln = prmv.ip_ptr->uv_ptr.uv_aln;
X
X	    /* zero out velocity, thrust, attack variables, subsystem damage */
X	    vinit(paln->al_vel);
X	    vinit(paln->al_thr);
X	    paln->al_dly = 0;
X	    paln->al_lhit.ip_ptr = NULL;
X	    paln->al_atck.ip_ptr = NULL;
X	    paln->al_aeval = 0;
X	    for (i=0;i<MSYS;++i)
X		paln->al_sys[i].s_dmg = 0;
X	    prmv.ip_ptr->uv_mass = 0;
X
X	    /* relocate */
X	    for (i=0;i<3;++i)
X		paln->al_pstn[i] = MUL(paln->al_pstn[i],-2.);
X	    vchngd(paln->al_univ.ip_ptr);
X
X	/* actually remove the object */
X	} else {
X	    if (prmv.ip_ptr->uv_type == 'T')
X		binit((char *)prmv.ip_ptr->uv_ptr.uv_torp,sizeof(struct torp));
X	    else if (prmv.ip_ptr->uv_type == 'P')
X		binit((char *)prmv.ip_ptr->uv_ptr.uv_crft,sizeof(struct crft));
X	    vrmv(prmv.ip_ptr);
X	    binit((char *)prmv.ip_ptr,sizeof(*prmv.ip_ptr));
X	}
X
X
X#ifdef DEBUG
X	VDBG("remove return\n");
X#endif
X}
END_OF_remove.c
if test 3648 -ne `wc -c <remove.c`; then
    echo shar: \"remove.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f shutdown.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"shutdown.c\"
else
echo shar: Extracting \"shutdown.c\" \(1539 characters\)
sed "s/^X//" >shutdown.c <<'END_OF_shutdown.c'
X/*
X * Spacewar - shutdown (gracefully) the spacewar game
X *
X * Copyright 1984 obo Systems, Inc.
X * Copyright 1984 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X#include "universe.h"
X#include "login.h"
X
X#ifdef VMS
X#	include <ssdef.h>
X	extern short inmlbx;
X#endif /* VMS */
X
XVOID shutdown(e)
Xint e;
X{
X	register struct login *plogin;
X	int i;
X	extern int errno;
X
X#ifdef DEBUG
X	DBG("shutdown(%d)\n",e);
X#endif
X
X	/* don't update the universe any more */
X	alarm(0);
X
X	/* update objects, crafts */
X	objupdate();
X	crftupdate((struct login *)0);
X
X	/* notify and log all players off */
X	for (plogin=loginlst,i=MAXLOGIN;i-- > 0;++plogin)
X		if (plogin->ln_tty) {
X			if (plogin->ln_play.ip_ptr) {
X				plogin->ln_play.ip_ptr = NULL;
X				output(plogin,'E',0,0);
X			}
X			output(plogin,'B',0,0);
X			output(plogin,'C',0,"\n\nSpacewar has been shut down\n");
X			output(plogin,0,0,0);
X			logoff(plogin);
X		}
X
X	/* remove communication files */
X#ifdef BSD
X	if (unlink(SWLGNFILE)) perror(SWLGNFILE);
X	if (unlink(SWPIDFILE)) perror(SWPIDFILE);
X#else /* VMS SYSIII SYSV */
X#ifdef VMS
X	if ((i=sys$delmbx(inmlbx)) != SS$_NORMAL) {
X		perror("delete mlbx 2");
X#ifdef DEBUG
X		VDBG("shutdown delmbx()=%d, errno=%d\n",i,errno);
X#endif
X	}
X	if ((i=sys$dassgn(inmlbx)) != SS$_NORMAL) {
X		perror("dassgn mlbx 2");
X#ifdef DEBUG
X		VDBG("shutdown dassgn()=%d, errno=%d\n",i,errno);
X#endif
X	}
X#else /* SYSIII SYSV */
X	if (unlink(SWCOMFILE)) perror(SWCOMFILE);
X#endif /* VMS SYSIII SYSV */
X#endif /* VMS BSD SYSIII SYSV */
X
X#ifdef DEBUG
X	VDBG("shutdown exiting\n");
X#endif
X	exit(e);
X}
END_OF_shutdown.c
if test 1539 -ne `wc -c <shutdown.c`; then
    echo shar: \"shutdown.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f spacewar.h -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"spacewar.h\"
else
echo shar: Extracting \"spacewar.h\" \(2296 characters\)
sed "s/^X//" >spacewar.h <<'END_OF_spacewar.h'
X/*
X * Spacewar - include file for general stuff
X *
X * Copyright 1984 obo Systems, Inc.
X * Copyright 1984 Dan Rosenblatt
X */
X
X#ifdef VMS
X#define VOID
X#define delete dbmdelete
X#endif /* VMS */
X
X#ifdef BSD
X#	define SWPIDFILE	"/usr/dir/sw/swpid"
X#	define SWLGNFILE	"/usr/dir/sw/swlgn"
X#else /* VMS SYSIII SYSV */
X#ifdef VMS
X#	define SWCOMFILE	"swmlbx"
X#else /* SYSIII SYSV */
X#	define SWCOMFILE	"/usr/dir/sw/swcomm"
X#endif /* VMS SYSIII SYSV */
X#endif /* BSD VMS SYSIII SYSV */
X
X#ifdef VMS
X#	define SWDATABASE	"$DISK2:[TSDIR.SW]swdb."
X#	define SWGAME		"$DISK2:[TSDIR.SW]sw"
X#	define SWREAD		"$DISK2:[TSDIR.SW]vmsrsw"
X#	define SWNEWS		"$DISK2:[TSDIR.SW]swnews"
X#	define SWERR		"$DISK2:[TSDIR.SW]swerr"
X#	define SWOBJ		"$DISK2:[TSDIR.SW]swobj"
X#else /* BSD SYSIII SYSV */
X#	define SWDATABASE	"/usr/dir/sw/swdb"
X#	define SWGAME		"/usr/dir/sw/sw"
X#	define SWREAD		"/usr/dir/sw/rsw"
X#	define SWNEWS		"/usr/dir/sw/swnews"
X#	define SWERR		"/usr/dir/sw/swerr"
X#	define SWOBJ		"/usr/dir/sw/swobj" /* see objupdate.c */
X#endif /* VMS BSD SYSIII SYSV */
X
X#define SWMASTER	"Dan R"
X
X#define PI		(3.1415926536)
X#define TWOPI		(6.2831853072)
X#define DEGTORAD	DIV(TWOPI,360.)
X#define PROMPT		"\nPlay/See/Info/Complain/Mail/reBuild/Usercmd/Logoff/Who>"
X#ifdef NULL
X#undef	NULL
X#endif
X#define	NULL		(0)
X
X/* uninteresting fudge factors */
X#define VANGVDST	(3084.2514)		/* makes 45deg match 5000 */
X
X/*
X * all floating-point operations through these macros
X * allowing co-processor routines to be substituted for in-line code
X */
X#define ADD(x,y)	((x)+(y))
X#define SUB(x,y)	((x)-(y))
X#define	MUL(x,y)	((x)*(y))
X#define DIV(x,y)	((x)/(y))
X#define SQUARE(x)	((x)*(x))
X#define CUBE(x)		((x)*(x)*(x))
X
Xextern double sqrt();
Xextern int rand();
X#define SQRT(x)		(sqrt(x))
X#define RANDOM(x)	(rand()%(x))
X
Xextern double atan2(),sin(),cos();
X#define ATAN2(x,y)	(atan2((x),(y)))
X#define SIN(x)		(sin(x))
X#define COS(x)		(cos(x))
X
Xextern double fmod();
X#define FMOD(x,y)	(fmod((x),(y)))
X#define NEG(x)		(-(x))
X#define INT(x)		((long)(x))
X#define FLOAT(i)	((double)(i))
X#define MAX(x,y)	(((x) > (y)) ? (x) : (y))
X#define MIN(x,y)	(((x) < (y)) ? (x) : (y))
X
X#ifdef DEBUG
Xextern VOID DBG(),VDBG();
X#endif
X
Xtypedef struct {
X	double vec[3];
X	double dst;
X	char valid;
X} dsplcmnt;
X#define VECVALID 1
X#define DSTVALID 2
X
Xdsplcmnt vdisp();
END_OF_spacewar.h
if test 2296 -ne `wc -c <spacewar.h`; then
    echo shar: \"spacewar.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f swobj.init -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"swobj.init\"
else
echo shar: Extracting \"swobj.init\" \(1198 characters\)
sed "s/^X//" >swobj.init <<'END_OF_swobj.init'
X1000000	1	.	0	0	0	0	0	0	0
X22500	20	*	0	0	75000	0	0	0	0
X62500	50	*	0	0	-125000	0	0	0	0
X100	2	O	1	1000	2500	0	5	0	0
X800	6	O	1	1780	4000	0	0	6	0
X450	4	O	1	2125	7000	0	0	0	0
X500	4	O	1	3000	10000	0	0	0	0
X550	5	O	1	3250	16000	0	3.5	0	0
X1000	6	O	1	4200	19500	0	0	0	0
X700	5	O	1	5000	30000	0	3	0	0
X900	4	O	1	5600	32000	0	0	1	0
X375	2	O	1	6000	35000	0	1	0	0
X620	3	O	1	7500	40000	0	1.5	1.5	0
X275	2	O	1	8500	41000	0	-.5	-.5	0
X180	1	O	1	12500	48000	0	1	-1	0
X140	3	O	2	800	1500	0	0	0	0
X500	5	O	2	2000	3200	0	10	10	0
X900	6	O	2	4500	4500	0	-5	0	0
X300	7	O	2	5000	10000	0	0	-5	0
X650	9	O	2	7000	13000	0	2	3	0
X800	10	O	2	10100	14000	0	1	4	0
X400	3	O	2	9500	24000	0	-2	-2	0
X175	2	O	2	9000	30000	0	3	-1	0
X50	1	O	2	10500	33000	0	2	0	0
X75	1	O	2	12000	38000	0	0	2	0
X20	1	o	0	10000	175000	0	15	15	0
X25	1	o	1	500	125000	0	0	0	0
X40	1	o	1	1000	50000	0	-15	0	0
X15	1	o	2	3500	75000	0	0	-15	0
X5	1	o	2	4000	7000	0	5	10	0
X15	2	o	3	500	100	0	90	0	0
X18	1	o	8	750	75	0	0	90	0
X25	3	o	8	1500	150	0	-90	0	0
X5	1	o	8	200	40	0	0	-90	0
X8	1	o	10	300	50	0	45	45	0
X7	1	o	16	175	80	0	-45	45	0
X4	1	o	20	250	20	0	45	-45	0
X1	1	o	22	700	25	0	22	22	0
X2	1	o	23	650	75	0	-22	-22	0
X19	3	o	24	475	45	0	0	0	0
X1	10	#	17	0	150	0	0	90	0
X1	10	#	4	0	150	0	0	90	0
END_OF_swobj.init
if test 1198 -ne `wc -c <swobj.init`; then
    echo shar: \"swobj.init\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f upddsh.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"upddsh.c\"
else
echo shar: Extracting \"upddsh.c\" \(2872 characters\)
sed "s/^X//" >upddsh.c <<'END_OF_upddsh.c'
X/*
X * Spacewar - update craft direction, sensors, and homing channels
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 "sys.h"
X#include "aln.h"
X#include "crft.h"
X#include "flds.h"
X#include "obj.h"
X#include "torp.h"
X
Xextern double vlen(),vdist();
X
XVOID upddsh()
X{
X	register struct crft *pcrft;
X	register struct universe *puniv;
X	double tmpvec[3];
X	int i,sens0,sens1;
X	long l;
X	dsplcmnt tmpdspl;
X
X#ifdef DEBUG
X	DBG("upddsh()\n");
X#endif
X
X	for (pcrft=crftlst+MAXCRFT;pcrft-- > crftlst;) {
X	    if (!pcrft->cr_htyp) continue;
X
X	    /********************************************/
X	    /* direction based on autopilot/faceforward */
X	    /********************************************/
X	    if (pcrft->cr_ffwd)
X		if (vlen(pcrft->cr_vel) == 0.) {
X		    pcrft->cr_ffwd = NULL;
X		    biton(pcrft->cr_chng,BIT_AUTOFFWD);
X		} else
X		    rttosp(pcrft->cr_vel,tmpvec);
X	    else if (pcrft->cr_auto.ip_ptr) {
X		/*vdiff(pcrft->cr_auto.ip_ptr->uv_pstn,pcrft->cr_pstn,tmpvec);*/
X		tmpdspl = vdisp(pcrft->cr_auto.ip_ptr,pcrft->cr_univ.ip_ptr,'v');
X		rttosp(/*tmpvec*/tmpdspl.vec,tmpvec);
X	    }
X
X	    /* update screen by checking rounded value */
X	    if (pcrft->cr_ffwd || pcrft->cr_auto.ip_ptr) {
X		if (INT(DIV(MUL(pcrft->cr_dir[1],10.),DEGTORAD)) !=
X		INT(DIV(MUL(tmpvec[1],10.),DEGTORAD)))
X		    biton(pcrft->cr_chng,BIT_DIR1);
X		pcrft->cr_dir[1] = tmpvec[1];
X		if (INT(DIV(MUL(pcrft->cr_dir[2],10.),DEGTORAD)) !=
X		INT(DIV(MUL(tmpvec[2],10.),DEGTORAD)))
X		    biton(pcrft->cr_chng,BIT_DIR2);
X		pcrft->cr_dir[2] = tmpvec[2];
X		fixdir(pcrft);
X	    }
X
X	    /***********/
X	    /* sensors */
X	    /***********/
X	    sens0 = sens1 = 0;
X	    for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) {
X		if (!puniv->uv_type) continue;
X		if (puniv == pcrft->cr_univ.ip_ptr) continue;
X		tmpdspl = vdisp(puniv,pcrft->cr_univ.ip_ptr,'d');
X		l = INT(/*vdist(puniv->uv_pstn,pcrft->cr_pstn)*/tmpdspl.dst);
X		if (l <= pcrft->cr_vdst)
X		    sens0 += 1;
X		if (l <= 5000L && puniv->uv_type != 'O')
X		    sens1 += 1;
X	    }
X	    if (sens0 != pcrft->cr_sens[0]) {
X		pcrft->cr_sens[0] = sens0;
X		biton(pcrft->cr_chng,BIT_SSEE);
X	    }
X	    if (sens1 != pcrft->cr_sens[1]) {
X		pcrft->cr_sens[1] = sens1;
X		biton(pcrft->cr_chng,BIT_SBAD);
X	    }
X
X	    /*******************/
X	    /* homing channels */
X	    /*******************/
X	    for (i=0;i<MHOM;++i) {
X		if (!pcrft->cr_hom[i].ip_ptr) continue;
X		tmpdspl = vdisp(pcrft->cr_hom[i].ip_ptr,pcrft->cr_univ.ip_ptr,'d');
X		l = INT(/*vdist(pcrft->cr_hom[i].ip_ptr->uv_pstn,pcrft->cr_pstn)*/tmpdspl.dst);
X		if (l != pcrft->cr_hdst[i]) {
X		    pcrft->cr_hdst[i] = l;
X		    biton(pcrft->cr_chng,BIT_HOMCHAN+i);
X		}
X	    }
X	}
X
X#ifdef DEBUG
X	VDBG("upddsh return\n");
X#endif
X}
END_OF_upddsh.c
if test 2872 -ne `wc -c <upddsh.c`; then
    echo shar: \"upddsh.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f updobjs.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"updobjs.c\"
else
echo shar: Extracting \"updobjs.c\" \(1249 characters\)
sed "s/^X//" >updobjs.c <<'END_OF_updobjs.c'
X/*
X * Spacewar - update movement of objects
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X#include "universe.h"
X#include "obj.h"
X
XVOID updobjs()
X{
X	register struct obj *pobj;
X	double tmpvec[3];
X	int i;
X
X#ifdef DEBUG
X	DBG("updobjs()\n");
X#endif
X
X	for (pobj=objlst;pobj < objlst+MAXOBJ;++pobj) {
X
X	    /* new orbital center relative plane theta */
X	    if (pobj->oj_oprd) {
X		pobj->oj_ocrpt = ADD(pobj->oj_ocrpt,
X		DIV(TWOPI,FLOAT(pobj->oj_oprd)));
X		pobj->oj_ocrpt = FMOD(pobj->oj_ocrpt,TWOPI);
X	    }
X
X	    /* new position by converting from spherical to rectangular, */
X	    /* rotating from orbital plane, and translating from orbital */
X	    /* center; figure velocity from old and new position	 */
X	    vcopy(tmpvec,pobj->oj_pstn);
X	    pobj->oj_pstn[0] = FLOAT(pobj->oj_orad);
X	    pobj->oj_pstn[1] = pobj->oj_ocrpt;
X	    pobj->oj_pstn[2] = DIV(PI,2.);
X	    sptort(pobj->oj_pstn,pobj->oj_pstn);
X	    vecmul(pobj->oj_pstn,pobj->oj_rmat,pobj->oj_pstn);
X	    for (i=0;i < 3;++i)
X		pobj->oj_pstn[i] = ADD(pobj->oj_pstn[i],
X		pobj->oj_octr.ip_ptr->uv_pstn[i]);
X	    vchngd(pobj->oj_univ.ip_ptr);
X	    vdiff(pobj->oj_pstn,tmpvec,pobj->oj_vel);
X	}
X
X#ifdef DEBUG
X	VDBG("updobjs return\n");
X#endif
X}
END_OF_updobjs.c
if test 1249 -ne `wc -c <updobjs.c`; then
    echo shar: \"updobjs.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f updtorp.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"updtorp.c\"
else
echo shar: Extracting \"updtorp.c\" \(3160 characters\)
sed "s/^X//" >updtorp.c <<'END_OF_updtorp.c'
X/*
X * Spacewar - torpedo intelligence
X *	      thrust torward target
X *	      miss/blow up logic
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 "crft.h"
X#include "aln.h"
X#include "torp.h"
X#include "obj.h"
X
XVOID updtorp()
X{
X	register struct torp *ptorp;
X	double tmpvec[3],*pvel,vlen();
X	long l,m;
X	int i;
X	dsplcmnt tmpdspl;
X
X#ifdef DEBUG
X	DBG("updtorp()\n");
X#endif
X
X	for (ptorp=torplst+MAXTORP;ptorp-- > torplst;) {
X	    if (!ptorp->tp_aim.ip_ptr) continue;
X
X	    /* vector and distance to target */
X	    /*vdiff(ptorp->tp_aim.ip_ptr->uv_pstn,ptorp->tp_pstn,tmpvec);*/
X	    /*l = INT(vlen(tmpvec));*/
X	    tmpdspl = vdisp(ptorp->tp_aim.ip_ptr,ptorp->tp_univ.ip_ptr,'b');
X	    l = INT(tmpdspl.dst);
X
X	    /* target is getting further away or is real close */
X	    if (l > ptorp->tp_dist || l < 50L) {
X
X		/* too far away */
X		if (ptorp->tp_dist < 5000L && l > 5000L) {
X		    /*idxptr prmv;*/
X		    if (ptorp->tp_fby.ip_ptr &&
X		    ptorp->tp_fby.ip_ptr->uv_type == 'P') {
X			struct crft *pcrft=
X			ptorp->tp_fby.ip_ptr->uv_ptr.uv_crft;
X			output(pcrft->cr_lgn,'B',0,0);
X			setrpt(pcrft);
X			rpt(pcrft,"Your torpedo missed");
X			fnshrpt(pcrft,1);
X		    }
X		    remove(ptorp->tp_univ);
X		    /*for (prmv.ip_ptr=univlst+MAXUNIVERSE;prmv.ip_ptr-- > univlst;)
X			if (prmv.ip_ptr->uv_type == 'T' &&
X			prmv.ip_ptr->uv_ptr.uv_torp == ptorp) {
X			    remove(prmv);
X			    break;
X			}*/
X		    continue;
X
X		/* real close */
X		} else if (l < 50L) {
X		    /*idxptr prmv;*/
X		    if (ptorp->tp_fby.ip_ptr &&
X		    ptorp->tp_fby.ip_ptr->uv_type == 'P') {
X			struct crft *pcrft=
X			ptorp->tp_fby.ip_ptr->uv_ptr.uv_crft;
X			output(pcrft->cr_lgn,'B',0,0);
X			setrpt(pcrft);
X			rpt(pcrft,"Your torpedo detonated");
X			fnshrpt(pcrft,1);
X		    }
X		    damage(ptorp->tp_univ.ip_ptr,ptorp->tp_univ.ip_ptr,
X		    100.,200.,"Torpedo attack");
X		    remove(ptorp->tp_univ);
X		    /*for (prmv.ip_ptr=univlst+MAXUNIVERSE;prmv.ip_ptr-- > univlst;)
X			if (prmv.ip_ptr->uv_type == 'T' &&
X			prmv.ip_ptr->uv_ptr.uv_torp == ptorp) {
X			    damage(prmv.ip_ptr,ptorp->tp_pstn,100.,200.,
X			    "Torpedo attack");
X			    remove(prmv);
X			    break;
X			}*/
X		    continue;
X		}
X	    }
X	    ptorp->tp_dist = l;
X
X	    /****************************/
X	    /* compute thrust to target */
X	    /****************************/
X	    switch(ptorp->tp_aim.ip_ptr->uv_type) {
X		case 'P':
X		    pvel = ptorp->tp_aim.ip_ptr->uv_ptr.uv_crft->cr_vel;
X		    break;
X		case 'T':
X		    pvel = ptorp->tp_aim.ip_ptr->uv_ptr.uv_torp->tp_vel;
X		    break;
X		case 'A':
X		    pvel = ptorp->tp_aim.ip_ptr->uv_ptr.uv_aln->al_vel;
X		    break;
X	    }
X	    rttosp(/*tmpvec*/tmpdspl.vec,tmpvec);
X	    for (m=0;l > 0L && l > m;) {
X		l -= m + MAXTTHR/2;
X		m += MAXTTHR;
X	    }
X	    if (m < MAXTTHR/2) m = MAXTTHR/2;
X	    tmpvec[0] = FLOAT(m);
X	    sptort(tmpvec,tmpvec);
X	    for (i=0;i<3;++i)
X		ptorp->tp_thr[i] = ADD(SUB(tmpvec[i],ptorp->tp_vel[i]),pvel[i]);
X	}
X
X#ifdef DEBUG
X	VDBG("updtorp return\n");
X#endif
X}
END_OF_updtorp.c
if test 3160 -ne `wc -c <updtorp.c`; then
    echo shar: \"updtorp.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f vdisp.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"vdisp.c\"
else
echo shar: Extracting \"vdisp.c\" \(2354 characters\)
sed "s/^X//" >vdisp.c <<'END_OF_vdisp.c'
X/*
X * Spacewar - return vector displacement
X *			  (buffered to reduce recomputation)
X *
X * Copyright 1986 obo Systems, Inc.
X * Copyright 1986 Dan Rosenblatt
X */
X
X#ifndef VMS
X#include <sys/types.h>
X#else /* BSD SYSIII SYSV */
X#include <types.h>
X#endif /* VMS */
X#include "spacewar.h"
X#include "universe.h"
X#include "login.h"
X#include "sys.h"
X#include "aln.h"
X#include "crft.h"
X#include "obj.h"
X#include "torp.h"
X
X
Xdsplcmnt vdisp(p1,p2,which)
Xregister struct universe *p1,*p2;
Xchar which;
X{
X	dsplcmnt d;
X	register dsplcmnt *pd;
X	double vlen();
X	int i,p1off;
X	int negate=0;
X	char *malloc();
X
X
X	/* use higher of two pointers to cut storage in half ==> negate xyz */
X	if (p2 > p1) {
X	    struct universe *ptmp;
X	    negate = 1;
X	    ptmp = p1;
X	    p1 = p2;
X	    p2 = ptmp;
X	}
X
X	p1off = p1 - univlst;
X
X	/* allocate storage if not there already */
X	if (!p1->uv_dspl) {
X	    if (!(pd = p1->uv_dspl = (dsplcmnt *)
X	    malloc(sizeof(dsplcmnt) * (p1off+1)))) {
X		perror("vdisp malloc");
X		if (negate)
X		    vdiff(p2->uv_pstn,p1->uv_pstn,d.vec);
X		else
X		    vdiff(p1->uv_pstn,p2->uv_pstn,d.vec);
X		d.dst = vlen(d.vec);
X		return(d);
X	    }
X	    for (i=p1off;i-- > 0;)
X		pd++->valid = 0; /* init to not valid */
X	}
X
X	/* point to displacement info and recompute if not valid */
X	pd = p1->uv_dspl + (p2 - univlst);
X	vdiff(p1->uv_pstn,p2->uv_pstn,pd->vec);
X	pd->valid |= VECVALID;
X	if ((which == 'd' || which == 'b') && !(pd->valid&DSTVALID)) {
X	    pd->dst = vlen(pd->vec);
X	    pd->valid |= DSTVALID;
X	}
X
X	if (negate) {
X	    d.valid = 0;
X	    if (which == 'v' || which == 'b') {
X		d.vec[0] = -pd->vec[0];
X		d.vec[1] = -pd->vec[1];
X		d.vec[2] = -pd->vec[2];
X		d.valid |= VECVALID;
X	    }
X	    if (which == 'd' || which == 'b') {
X		d.dst = pd->dst;
X		d.valid |= DSTVALID;
X	    }
X	    return(d);
X	} else {
X	    return(*pd);
X	}
X}
X
X/* mark all displacements w.r.t. puniv as invalid */
XVOID vchngd(puniv)
Xstruct universe *puniv;
X{
X	register dsplcmnt *pd;
X	int poff = (puniv - univlst);
X	register int i;
X
X	/* up to diagonal */
X	if (pd = puniv->uv_dspl) {
X	    for (i=poff;i-- > 0;)
X		pd++->valid = 0;
X	}
X
X	/* 90 degrees after reaching diagonal */
X	while (++puniv < univlst+MAXUNIVERSE)
X	    if (pd = puniv->uv_dspl)
X		pd[poff].valid = 0;
X
X}
X
XVOID vrmv(puniv)
Xstruct universe *puniv;
X{
X	if (puniv->uv_dspl)
X	    free(puniv->uv_dspl);
X	puniv->uv_dspl = 0;
X	vchngd(puniv);
X}
END_OF_vdisp.c
if test 2354 -ne `wc -c <vdisp.c`; then
    echo shar: \"vdisp.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f vmsrsw.c -a "${1}" != "-c" ; then 
  echo shar: Will not over-write existing file \"vmsrsw.c\"
else
echo shar: Extracting \"vmsrsw.c\" \(2666 characters\)
sed "s/^X//" >vmsrsw.c <<'END_OF_vmsrsw.c'
X/*
X * Spacewar - program that reads a user's terminal and passes
X *	      it back to the spacewar game through a mailbox in
X *	      order to present spacewar with only one I/O channel to
X *	      read for user input eliminating polling
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X#include "universe.h"
X#include "login.h"
X#include "uio.h"
X
X#include <descrip.h>
X#include <iodef.h>
X#include <psldef.h>
X#include <ssdef.h>
X#include <signal.h>
Xstatic $DESCRIPTOR(swmlbx,SWCOMFILE);
Xstatic $DESCRIPTOR(tty,"TT");
Xstatic struct dsc$descriptor_s pmlbx;
Xstatic char buf[32];
Xstatic short swchan,tchan,pchan;
Xstatic struct uio ttyuio;
Xextern int errno;
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X	struct login *plogin;
X	int i,cleanup();
X
X	/* get and save player's login pointer */
X	if (argc != 3) exit(1);
X	plogin = (struct login *) atoi(argv[1]);
X
X	if ((i=sys$assign(&swmlbx,&swchan,PSL$C_USER,0)) != SS$_NORMAL) {
X		sprintf(buf,"vmsrsw assign(swmlbx)=%d, errno=%d\n",i,errno);
X		write(2,buf,strlen(buf));
X		cleanup();
X	}
X	if ((i=sys$assign(&tty,&tchan,PSL$C_USER,0)) != SS$_NORMAL) {
X		sprintf(buf,"vmsrsw assign(tty)=%d, errno=%d\n",i,errno);
X		write(2,buf,strlen(buf));
X		cleanup();
X	}
X
X	pmlbx.dsc$w_length = strlen(argv[2]);
X	pmlbx.dsc$b_dtype = DSC$K_DTYPE_T;
X	pmlbx.dsc$b_class = DSC$K_CLASS_S;
X	pmlbx.dsc$a_pointer = argv[2];
X	if ((i=sys$assign(&pmlbx,&pchan,PSL$C_USER,0)) != SS$_NORMAL) {
X		sprintf(buf,"vmsrsw assign(pmlbx)=%d, errno=%d\n",i,errno);
X		write(2,buf,strlen(buf));
X		cleanup();
X	}
X
X	/* read tty and forward it on */
X	signal(SIGALRM,cleanup);
X	signal(SIGHUP,cleanup);
X	for(;;) {
X		if ((i=sys$qiow(0,tchan,IO$_READVBLK,0,0,0,ttyuio.uio_chrs,1,
X		0,0,0,0)) == SS$_NORMAL) {
X			switch(ttyuio.uio_chrs[0]) {
X				case '\031':	/* ^Y */
X				case '\032':	/* ^Z */
X					ttyuio.uio_lgn = (struct login *) SIGINT;
X					strcpy(ttyuio.uio_chrs,argv[2]);
X					break;
X				case '\003':	/* ^C */
X					ttyuio.uio_lgn = (struct login *) SIGQUIT;
X					strcpy(ttyuio.uio_chrs,argv[2]);
X					break;
X				default:
X					ttyuio.uio_lgn = plogin;
X					ttyuio.uio_chrs[1] = '\0';
X					break;
X			}
X			alarm(10);
X			if ((i=sys$qiow(0,swchan,IO$_WRITEVBLK,0,0,0,&ttyuio,
X			sizeof(ttyuio),0,0,0,0)) != SS$_NORMAL) {
X				sprintf(buf,"vmsrsw qiow(WRITE)=%d, errno=%d\n",
X				i,errno);
X				write(2,buf,strlen(buf));
X				cleanup();
X			}
X			alarm(0);
X		}
X	}
X}
X
Xcleanup()
X{
X	ttyuio.uio_lgn = (struct login *)SIGHUP;
X	strcpy(ttyuio.uio_chrs,pmlbx.dsc$a_pointer);
X	sys$qiow(0,swchan,IO$_WRITEVBLK+IO$M_NOW,0,0,0,&ttyuio,sizeof(ttyuio),
X	0,0,0,0);
X	sys$qiow(0,pchan,IO$_WRITEVBLK+IO$M_NOW,0,0,0,"ShUtDoWn",9,0,0,0,0);
X	exit(SS$_ABORT);
X}
END_OF_vmsrsw.c
if test 2666 -ne `wc -c <vmsrsw.c`; then
    echo shar: \"vmsrsw.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 5 \(of 6\).
cp /dev/null ark5isdone
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