games@tekred.TEK.COM (06/01/88)
Submitted by: udenva!koala!dir (Dan Rosenblatt)
Comp.sources.games: Volume 4, Issue 24
Archive-name: spacewar/Part04
#! /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 4 (of 6)."
# Contents: Makefile alninit.c build.h damage.c psw.c sw.c upddbm.c
# upddmg.c updsys.c usrcmd.c vmspsw.c
# Wrapped by billr@saab on Tue May 31 09:54:53 1988
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f Makefile -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"Makefile\"
else
echo shar: Extracting \"Makefile\" \(4797 characters\)
sed "s/^X//" >Makefile <<'END_OF_Makefile'
X#
X# Spacewar - makefile
X#
X# Copyright 1984 obo Systems, Inc.
X# Copyright 1984 Dan Rosenblatt
X#
XLDFLAGS= -n
XCFLAGS= -O -DBSD -DVOID=void -m68020 -f68881 -DNEEDFMOD
XLPR= lpr
X
XINCLUDES= aln.h build.h crft.h flds.h login.h mlbx.h obj.h plyr.h \
X spacewar.h sys.h torp.h ucmd.h uio.h uio2.h universe.h
XSOURCES= sw.c globals.c lckmsg.c proctrap.c shutdown.c \
X alninit.c objinit.c crftupdate.c objupdate.c \
X logon.c logoff.c \
X cmd.c prvcmd.c \
X build.c mail.c see.c usrcmd.c who.c \
X play.c plinit.c unplay.c \
X update.c \
X updaln.c upddmg.c upddsh.c updmov.c updobjs.c updsys.c updtorp.c \
X bfuncs.c bits.c damage.c fixdir.c mutils.c vdisp.c remove.c rpt.c \
X output.c scrn.c
XOBJECTS= sw.o globals.o lckmsg.o proctrap.o shutdown.o \
X alninit.o objinit.o crftupdate.o objupdate.o \
X logon.o logoff.o \
X cmd.o prvcmd.o \
X build.o mail.o see.o usrcmd.o who.o \
X play.o plinit.o unplay.o \
X update.o \
X updaln.o upddmg.o upddsh.o updmov.o updobjs.o updsys.o updtorp.o \
X bfuncs.o bits.o damage.o fixdir.o mutils.o vdisp.o remove.o rpt.o \
X output.o scrn.o
X
Xall : sw psw rsw dmpdbm upddbm tstsz
X
X.PRECIOUS: print send
X
Xprint : Makefile ${INCLUDES} ${SOURCES} psw.c psw.sh vmspsw.c rsw.c vmsrsw.c \
X tget.c dmpdbm.c upddbm.c tstsz.c swobj.init dbm.h dbm.c \
X vmsdelmbx.c
X pr $? | ${LPR}
X touch print
X
Xsend : Makefile ${INCLUDES} ${SOURCES} psw.c psw.sh vmspsw.c rsw.c vmsrsw.c \
X tget.c dmpdbm.c upddbm.c tstsz.c swobj.init doc dbm.h dbm.c \
X vmsdelmbx.c swnews
X uucp $? 'obo586!~/sw/'
X touch send
X
Xclean :
X rm *.o sw psw rsw dmpdbm upddbm tstsz
X
Xsw : ${OBJECTS}
X ${CC} ${CFLAGS} ${LDFLAGS} -o sw ${OBJECTS} -ltermlib -ldbm -lm
X chmod u+s sw
X
Xpsw : psw.c spacewar.h uio2.h
X ${CC} ${CFLAGS} ${LDFLAGS} psw.c -o psw
X chmod u+s psw
X
Xrsw : rsw.c login.h uio.h universe.h spacewar.h
X ${CC} ${CFLAGS} ${LDFLAGS} rsw.c -o rsw
X
Xdmpdbm : dmpdbm.c spacewar.h universe.h login.h sys.h crft.h mlbx.h \
X plyr.h ucmd.h bfuncs.o
X ${CC} ${CFLAGS} ${LDFLAGS} dmpdbm.c bfuncs.o -ldbm -o dmpdbm
X
Xupddbm : upddbm.c spacewar.h universe.h login.h sys.h crft.h mlbx.h \
X plyr.h ucmd.h bfuncs.o
X ${CC} ${CFLAGS} ${LDFLAGS} upddbm.c bfuncs.o -ldbm -o upddbm
X
Xtstsz : tstsz.c uio.h uio2.h spacewar.h
X ${CC} ${CFLAGS} ${LDFLAGS} tstsz.c -o tstsz
X tstsz
X
Xlint : ${SOURCES} psw.c rsw.c dmpdbm.c upddbm.c tstsz.c
X lint ${CFLAGS} ${SOURCES}
X lint ${CFLAGS} psw.c
X lint ${CFLAGS} rsw.c
X lint ${CFLAGS} dmpdbm.c bfuncs.c
X lint ${CFLAGS} upddbm.c bfuncs.c
X lint ${CFLAGS} tstsz.c
X
Xbfuncs.o : spacewar.h
X
Xbits.o : spacewar.h
X
Xsw.o : spacewar.h
X
Xproctrap.o : spacewar.h universe.h login.h uio2.h
X
Xglobals.o : universe.h torp.h sys.h obj.h login.h crft.h aln.h spacewar.h
X
Xlogon.o : spacewar.h universe.h login.h
X
Xlogoff.o : universe.h login.h spacewar.h
X
Xoutput.o : spacewar.h universe.h login.h flds.h sys.h
X
Xcmd.o : spacewar.h universe.h login.h uio.h plyr.h mlbx.h uio2.h
X
Xshutdown.o : spacewar.h universe.h login.h
X
Xmail.o : spacewar.h universe.h login.h mlbx.h plyr.h
X
Xbuild.o : universe.h login.h build.h sys.h crft.h obj.h spacewar.h
X
Xsee.o : universe.h login.h sys.h crft.h plyr.h spacewar.h
X
Xusrcmd.o : spacewar.h universe.h login.h ucmd.h
X
Xobjinit.o : spacewar.h universe.h obj.h
X
Xobjupdate.o : spacewar.h universe.h obj.h
X
Xalninit.o : spacewar.h universe.h sys.h aln.h obj.h build.h
X
Xprvcmd.o : spacewar.h universe.h login.h sys.h aln.h build.h obj.h crft.h torp.h
X
Xwho.o : spacewar.h universe.h login.h
X
Xplay.o : spacewar.h universe.h login.h sys.h crft.h flds.h build.h aln.h obj.h \
X torp.h ucmd.h
X
Xplinit.o : spacewar.h universe.h login.h sys.h crft.h obj.h aln.h torp.h build.h
X
Xupdobjs.o : spacewar.h universe.h obj.h
X
Xdamage.o : spacewar.h universe.h sys.h login.h crft.h aln.h flds.h build.h \
X obj.h torp.h
X
Xlckmsg.o : spacewar.h
X
Xfixdir.o : spacewar.h universe.h sys.h crft.h flds.h
X
Xcrftupdate.o : universe.h login.h sys.h crft.h spacewar.h
X
Xunplay.o : spacewar.h universe.h plyr.h login.h crft.h sys.h
X
Xrpt.o : universe.h login.h sys.h crft.h flds.h spacewar.h
X
Xremove.o : spacewar.h sys.h login.h crft.h obj.h torp.h universe.h flds.h aln.h
X
Xscrn.o : universe.h login.h flds.h spacewar.h sys.h crft.h build.h aln.h obj.h \
X torp.h
X
Xupdate.o : spacewar.h universe.h login.h sys.h aln.h build.h flds.h torp.h \
X crft.h
X
Xupddmg.o : spacewar.h universe.h sys.h login.h crft.h build.h aln.h flds.h \
X obj.h torp.h
X
Xupdsys.o : spacewar.h universe.h login.h sys.h obj.h aln.h crft.h build.h \
X flds.h torp.h
X
Xupddsh.o : spacewar.h universe.h login.h sys.h aln.h crft.h flds.h obj.h torp.h
X
Xupdmov.o : spacewar.h universe.h sys.h login.h obj.h crft.h aln.h torp.h \
X build.h flds.h
X
Xupdtorp.o : spacewar.h universe.h sys.h login.h crft.h aln.h torp.h obj.h
X
Xupdaln.o : spacewar.h universe.h sys.h aln.h build.h login.h crft.h torp.h \
X obj.h flds.h
X
Xvdisp.o : spacewar.h universe.h login.h sys.h aln.h crft.h obj.h torp.h
END_OF_Makefile
if test 4797 -ne `wc -c <Makefile`; then
echo shar: \"Makefile\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f alninit.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"alninit.c\"
else
echo shar: Extracting \"alninit.c\" \(2244 characters\)
sed "s/^X//" >alninit.c <<'END_OF_alninit.c'
X/*
X * Spacewar - set up aliens into the universe
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X#include "universe.h"
X#include "sys.h"
X#include "aln.h"
X#include "obj.h"
X#include "build.h"
X
XVOID alninit()
X{
X struct aln *paln=alnlst+MAXALN;
X int i;
X struct sysc *psysc;
X struct sys *psys;
X struct universe *puniv;
X
X#ifdef DEBUG
X DBG("alninit()\n");
X#endif
X
X /* build all the aliens, one at a time */
X while (paln-- > alnlst) {
X
X /* random position, but not too far */
X /* from the plane of the ecliptic */
X paln->al_pstn[0] = SUB(MUL(FLOAT(RANDOM(100)),4000.),200000.);
X paln->al_pstn[1] = SUB(MUL(FLOAT(RANDOM(100)),4000.),200000.);
X paln->al_pstn[2] = SUB(MUL(FLOAT(RANDOM(100)),100.),5000.);
X
X /* no velocity or thrust */
X vinit(paln->al_vel);
X vinit(paln->al_thr);
X
X /* not doing(attacking) anything */
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
X /* choose a (random) hull type and give */
X /* random percentages of each subsystem */
X paln->al_htyp = RANDOM(6) + 4; /* see build.h */
X for (i=0;i < MSYS && i < MAXSYS;++i) {
X
X /* point to alien subsystem and configuration */
X psys = paln->al_sys + i;
X psysc = &config[i][paln->al_htyp];
X if (!psysc->sc_cap) continue; /* not in this craft */
X
X /* actual% = recommended% +/- 20 and within limits */
X if ((psys->s_pct = psysc->sc_rpct + RANDOM(40) - 20) > 100)
X psys->s_pct = 100;
X else if (psys->s_pct < 0)
X psys->s_pct = 0;
X
X /* rest of subsystem */
X psys->s_edmg = psysc->sc_edmg;
X psys->s_dmg = 0;
X psys->s_lvl = psysc->sc_ilvl;
X psys->s_cap = psysc->sc_cap;
X if (i == ROCKETS)
X psys->s_lvl = ((long)psys->s_lvl * (long)psys->s_pct)
X / 100L;
X else if (i == TORPS)
X psys->s_lvl = (psys->s_cap * psys->s_lvl) / 100L;
X }
X
X /* place into universe */
X puniv = univlst + MAXOBJ + (paln-alnlst);
X puniv->uv_type = 'A';
X puniv->uv_pctr = paln->al_htyp + '0';
X puniv->uv_pstn = paln->al_pstn;
X puniv->uv_mass = paln->al_sys[HULL].s_dmg; /* kludge */
X puniv->uv_rad = 1;
X puniv->uv_ptr.uv_aln = paln;
X paln->al_univ.ip_ptr = puniv;
X }
X#ifdef DEBUG
X VDBG("alninit return\n");
X#endif
X}
END_OF_alninit.c
if test 2244 -ne `wc -c <alninit.c`; then
echo shar: \"alninit.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f build.h -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"build.h\"
else
echo shar: Extracting \"build.h\" \(5215 characters\)
sed "s/^X//" >build.h <<'END_OF_build.h'
X/*
X * Spacewar - system configuration tables for player and alien ships
X * includes system name and offset
X *
X * Copyright 1984 obo Systems, Inc.
X * Copyright 1984 Dan Rosenblatt
X */
X
X#define MAXSYS 11
X#define MAXHTYP 9
X
X#define HULL 0
X#define SOLARE 1
X#define ANTME 2
X#define WARP 3
X#define ROCKETS 4
X#define DILITH 5
X#define PHASERS 6
X#define SHIELDS 7
X#define TORPS 8
X#define DMGCON 9
X#define SECURITY 10
X
X#ifndef BUILD
Xextern
X#endif
Xchar *subsysnam[MAXSYS]
X#ifdef BUILD
X = {
X "Hull",
X "Solar E.",
X "Antm. E.",
X "Warp",
X "Rockets",
X "Dilith.",
X "Phasers",
X "Shields",
X "Torps.",
X "Dmg.Con.",
X "Security"
X}
X#endif
X;
X
X#ifndef BUILD
Xextern
X#endif
Xstruct sysc {
X long sc_bsp; /* system configuration base space */
X long sc_bcr; /* system configuration base crew */
X long sc_fsp; /* system configuration 100% space */
X long sc_fcr; /* system configuration 100% crew */
X char sc_edmg; /* system configuration ease of damage */
X short sc_ilvl; /* system configuration initial level */
X short sc_cap; /* system configuration capacity */
X char sc_rpct; /* system configuration recommended % */
X
X} config[MAXSYS][MAXHTYP+1]
X#ifdef BUILD
X = { /* varies by system, hull */
X
X/* Hull */{
X /* 0 */ {0},
X /* 1 */ {16500, 120, 0, 0, 40, 0, 15, 100},
X /* 2 */ {18000, 100, 0, 0, 40, 0, 12, 100},
X /* 3 */ {17500, 110, 0, 0, 40, 0, 9, 100},
X /* 4 */ {0, 0, 0, 0, 40, 0, 15, 100},
X /* 5 */ {0, 0, 0, 0, 35, 0, 12, 100},
X /* 6 */ {0, 0, 0, 0, 45, 0, 9, 100},
X /* 7 */ {0, 0, 0, 0, 40, 0, 10, 100},
X /* 8 */ {0, 0, 0, 0, 40, 0, 10, 100},
X /* 9 */ {0, 0, 0, 0, 40, 0, 10, 100}
X },
X
X/* Solar E. */{
X /* 0 */ {0},
X /* 1 */ {250, 1, 450, 4, 100, 0, 35, 30},
X /* 2 */ {250, 1, 1000, 10, 100, 0, 50, 40},
X /* 3 */ {250, 1, 550, 5, 100, 0, 40, 35},
X /* 4 */ {0, 0, 0, 0, 100, 0, 35, 30},
X /* 5 */ {0, 0, 0, 0, 100, 0, 50, 40},
X /* 6 */ {0, 0, 0, 0, 100, 0, 40, 35},
X /* 7 */ {0, 0, 0, 0, 100, 0, 20, 80},
X /* 8 */ {0, 0, 0, 0, 100, 0, 25, 75},
X /* 9 */ {0, 0, 0, 0, 100, 0, 25, 70}
X },
X
X/* Antm. E. */{
X /* 0 */ {0},
X /* 1 */ {500, 1, 2400, 8, 50, 0, 35, 100},
X /* 2 */ {500, 1, 1500, 5, 50, 0, 30, 100},
X /* 3 */ {500, 1, 3000, 10, 50, 0, 40, 100},
X /* 4 */ {0, 0, 0, 0, 70, 0, 50, 80},
X /* 5 */ {0, 0, 0, 0, 60, 0, 30, 100},
X /* 6 */ {0, 0, 0, 0, 65, 0, 40, 90},
X /* 7 */ {0, 0, 0, 0, 50, 0, 35, 70},
X /* 8 */ {0, 0, 0, 0, 50, 0, 45, 85},
X /* 9 */ {0, 0, 0, 0, 45, 0, 70, 100}
X },
X
X/* Warp */{
X /* 0 */ {0},
X /* 1 */ {1000, 10, 2000, 20, 70, 3000, 3000, 100},
X /* 2 */ {1000, 10, 2500, 25, 70, 4000, 4000, 100},
X /* 3 */ {1000, 10, 5000, 40, 70, 7000, 7000, 100},
X /* 4 */ {0, 0, 0, 0, 70, 3000, 3000, 100},
X /* 5 */ {0, 0, 0, 0, 70, 4000, 4000, 90},
X /* 6 */ {0, 0, 0, 0, 70, 6000, 6000, 80},
X /* 7 */ {0, 0, 0, 0, 50, 2000, 2000, 100},
X /* 8 */ {0, 0, 0, 0, 60, 4000, 4000, 60},
X /* 9 */ {0, 0, 0, 0, 80, 10000, 10000, 50}
X },
X
X/* Rockets */{
X /* 0 */ {0},
X /* 1 */ {200, 4, 5000, 20, 30, 7500, 15, 45},
X /* 2 */ {200, 4, 3750, 15, 30, 5625, 12, 30},
X /* 3 */ {200, 4, 2500, 10, 30, 3750, 9, 20},
X /* 4 */ {0, 0, 0, 0, 40, 10000, 15, 45},
X /* 5 */ {0, 0, 0, 0, 40, 10000, 12, 30},
X /* 6 */ {0, 0, 0, 0, 40, 10000, 9, 20},
X /* 7 */ {0, 0, 0, 0, 40, 10000, 20, 50},
X /* 8 */ {0, 0, 0, 0, 40, 10000, 25, 40},
X /* 9 */ {0, 0, 0, 0, 50, 10000, 8, 45}
X },
X
X/* Dilith. */{
X /* 0 */ {0},
X /* 1 */ {500, 4, 4000, 10, 10, 5000, 5000, 50},
X /* 2 */ {500, 4, 4000, 10, 10, 5000, 5000, 50},
X /* 3 */ {500, 4, 4000, 10, 10, 5000, 5000, 50},
X /* 4 */ {0, 0, 0, 0, 10, 5000, 5000, 60},
X /* 5 */ {0, 0, 0, 0, 15, 5500, 5500, 50},
X /* 6 */ {0, 0, 0, 0, 10, 4500, 4500, 70},
X /* 7 */ {0, 0, 0, 0, 15, 5000, 5000, 55},
X /* 8 */ {0, 0, 0, 0, 20, 6000, 6000, 70},
X /* 9 */ {0, 0, 0, 0, 20, 5800, 5800, 65}
X },
X
X/* Phasers */{
X /* 0 */ {0},
X /* 1 */ {500, 5, 2400, 8, 40, 0, 80, 70},
X /* 2 */ {500, 5, 2100, 7, 40, 0, 70, 80},
X /* 3 */ {500, 5, 3000, 10, 40, 0, 100, 100},
X /* 4 */ {0, 0, 0, 0, 40, 0, 150, 75},
X /* 5 */ {0, 0, 0, 0, 40, 0, 140, 80},
X /* 6 */ {0, 0, 0, 0, 40, 0, 160, 70},
X /* 7 */ {0, 0, 0, 0, 40, 0, 140, 60},
X /* 8 */ {0, 0, 0, 0, 45, 0, 170, 85},
X /* 9 */ {0, 0, 0, 0, 90, 0, 250, 100}
X },
X
X/* Shields */{
X /* 0 */ {0},
X /* 1 */ {1500, 2, 700, 7, 20, 50, 70, 100},
X /* 2 */ {1500, 2, 1000, 10, 20, 50, 85, 90},
X /* 3 */ {1500, 2, 500, 5, 20, 50, 75, 90},
X /* 4 */ {0, 0, 0, 0, 20, 20, 70, 100},
X /* 5 */ {0, 0, 0, 0, 20, 20, 85, 90},
X /* 6 */ {0, 0, 0, 0, 20, 20, 60, 80},
X /* 7 */ {0, 0, 0, 0, 20, 20, 70, 80},
X /* 8 */ {0, 0, 0, 0, 50, 10, 50, 100},
X /* 9 */ {0, 0, 0, 0, 80, 10, 90, 75}
X },
X
X/* Torps. */{
X /* 0 */ {0},
X /* 1 */ {1000, 6, 500, 5, 60, 35, 10, 20},
X /* 2 */ {1000, 6, 1000, 10, 60, 35, 20, 20},
X /* 3 */ {1000, 6, 600, 6, 60, 35, 12, 40}
X },
X
X/* Dmg.Con. */{
X /* 0 */ {0},
X /* 1 */ {0, 1, 30, 30, 20, 0, 100, 100},
X /* 2 */ {0, 1, 30, 30, 20, 0, 100, 100},
X /* 3 */ {0, 1, 30, 30, 20, 0, 100, 100},
X /* 4 */ {0, 0, 0, 0, 20, 0, 80, 100},
X /* 5 */ {0, 0, 0, 0, 20, 0, 70, 100},
X /* 6 */ {0, 0, 0, 0, 20, 0, 80, 100},
X /* 7 */ {0, 0, 0, 0, 20, 0, 70, 100},
X /* 8 */ {0, 0, 0, 0, 20, 0, 80, 100},
X /* 9 */ {0, 0, 0, 0, 20, 0, 80, 100}
X },
X
X/* Security */{
X /* 0 */ {0},
X /* 1 */ {0, 1, 30, 30, 20, 0, 100, 0},
X /* 2 */ {0, 1, 30, 30, 20, 0, 100, 0},
X /* 3 */ {0, 1, 30, 30, 20, 0, 100, 0}
X }
X}
X#endif
X;
END_OF_build.h
if test 5215 -ne `wc -c <build.h`; then
echo shar: \"build.h\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f damage.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"damage.c\"
else
echo shar: Extracting \"damage.c\" \(5340 characters\)
sed "s/^X//" >damage.c <<'END_OF_damage.c'
X/*
X * Spacewar - inflict damage (proximity based)
X * reports damage to inflictee
X * reports to and credits inflictor
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 "flds.h"
X#include "build.h"
X#include "obj.h"
X#include "torp.h"
X
XVOID damage(patck,ptrgt,rng,dmg,msg)
Xstruct universe *patck,*ptrgt;
Xdouble rng,dmg;
Xchar *msg;
X{
X register struct universe *puniv;
X struct universe *plhit,*prvatck;
X register struct sys *psys,*psysdmg;
X struct crft *pcrft;
X struct aln *paln;
X struct torp *ptorp;
X double vdist(),trgtdist;
X int inflict,savinflict,totinflict=0,sh,ishulldmg,sysdmg;
X char buf[80+1];
X dsplcmnt tmpdspl;
X
X#ifdef DEBUG
X DBG("damage(#%3d,.,%f,%f,%s)\n",patck-univlst,rng,dmg,msg);
X#endif
X
X /* is it from hull damage; last hit by */
X ishulldmg = (SUB(dmg,DIV(1.,690.)) <= 0.);
X plhit = patck;
X if (plhit && plhit->uv_type == 'T')
X plhit = plhit->uv_ptr.uv_torp->tp_fby.ip_ptr;
X
X /******************************************/
X /* find all damageable stuff within range */
X /******************************************/
X for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) {
X if (!puniv->uv_type) continue;
X if (puniv->uv_type == 'O') continue;
X
X tmpdspl = vdisp(puniv,ptrgt,'d');
X /*if (SUB(vdist(puniv->uv_pstn,ptrgt->uv_pstn),rng) > 0.) continue;*/
X if (SUB(tmpdspl.dst,rng) > 0.) continue;
X
X /*******************************/
X /* figure shielding protection */
X /*******************************/
X psys = NULL;
X pcrft = NULL;
X paln = NULL;
X ptorp = NULL;
X switch(puniv->uv_type) {
X case 'T':
X if (patck == puniv) continue;
X ptorp = puniv->uv_ptr.uv_torp;
X sh = 30;
X if (plhit) ptorp->tp_lhit.ip_ptr = plhit;
X break;
X case 'A':
X paln = puniv->uv_ptr.uv_aln;
X psys = paln->al_sys;
X sh = 3;
X if (plhit) {
X prvatck = paln->al_lhit.ip_ptr;
X paln->al_lhit.ip_ptr = plhit;
X if (plhit->uv_type != 'P' ||
X !plhit->uv_ptr.uv_crft->cr_dock.ip_ptr) {
X paln->al_dly = 2;
X paln->al_atck.ip_ptr = plhit;
X }
X }
X break;
X case 'P':
X pcrft = puniv->uv_ptr.uv_crft;
X psys = pcrft->cr_sys;
X sh = 3;
X if (plhit) pcrft->cr_lhit.ip_ptr = plhit;
X break;
X }
X if (psys && psys[SHIELDS].s_cap)
X if (!ishulldmg) {/* no shields if caused by hull dmg */
X int tmpsh;
X tmpsh = psys[SHIELDS].s_lvl;
X tmpsh *= psys[SHIELDS].s_pct;
X tmpsh /= 100;
X tmpsh *= psys[SHIELDS].s_cap;
X tmpsh /= 100;
X sh += tmpsh;
X }
X
X /******************/
X /* inflict damage */
X /******************/
X /* compute damage to inflict */
X if (patck) {
X tmpdspl = vdisp(patck,puniv,'d');
X trgtdist = /*vdist(patck->uv_pstn,puniv->uv_pstn)*/ tmpdspl.dst;
X } else
X trgtdist = 1.;
X if (SUB(trgtdist,1.) < 0) trgtdist = 1.;
X inflict = INT(DIV(MUL(125000.,dmg),trgtdist)) / (sh*sh);
X if (inflict > 1000) inflict = 1000;
X totinflict += savinflict = inflict;
X
X /* apply damage */
X if (psys) /* non-torp */
X while (inflict > 0) {
X
X /* randomly choose an existing system */
X psysdmg = psys + RANDOM(MSYS);
X if (!psysdmg->s_cap) continue;
X
X /* 35<=sysdmg<80 */
X sysdmg = RANDOM(45) + 35;
X if (sysdmg > inflict) sysdmg = inflict;
X inflict -= sysdmg;
X
X /* actual damage affected by subsystem ease of damage */
X psysdmg->s_dmg += (sysdmg*psysdmg->s_edmg)/100;
X if (psysdmg->s_dmg > 100 || psysdmg->s_dmg < 0)
X psysdmg->s_dmg = 100;
X
X if (pcrft)
X biton(pcrft->cr_chng,BIT_SDMG+
X (psysdmg-psys)*flds[FLD_SDMG].f_grpw);
X if (psys == psysdmg)
X puniv->uv_mass = psysdmg->s_dmg;
X }
X
X else {/* torp */
X if (ptorp->tp_dmg + inflict >= 100)
X ptorp->tp_dmg = 100;
X else
X ptorp->tp_dmg += inflict;
X puniv->uv_mass = ptorp->tp_dmg;
X }
X
X /* report damage inflicted to inflictee */
X if (pcrft) {
X output(pcrft->cr_lgn,'B',0,0);
X setrpt(pcrft);
X sprintf(buf,"%s damage: %d",msg,savinflict);
X rpt(pcrft,buf);
X
X /* report direction if not from hull damage and */
X /* not torpedo or torpedo fired-by still around */
X if (!ishulldmg && plhit) {
X double tmpvec[3];
X vcopy(pcrft->cr_lhpstn,plhit->uv_pstn);
X /*vdiff(plhit->uv_pstn,puniv->uv_pstn,tmpvec);*/
X tmpdspl = vdisp(plhit,puniv,'v');
X rttosp(/*tmpvec*/tmpdspl.vec,tmpvec);
X sprintf(buf,"Attacker @%ld %.1f %.1f",INT(tmpvec[0]),
X DIV(tmpvec[1],DEGTORAD),DIV(tmpvec[2],DEGTORAD));
X rpt(pcrft,buf);
X }
X fnshrpt(pcrft,1);
X
X /* alien attack evaluation */
X } else if (paln) {
X
X /* acccumulate damage caused by attacker */
X if (plhit) {
X if (plhit != prvatck) paln->al_aeval = 0;
X paln->al_aeval += savinflict;
X }
X }
X }
X
X /* report to and credit inflictor */
X if (!ishulldmg && plhit && plhit->uv_type == 'P') {
X pcrft = plhit->uv_ptr.uv_crft;
X pcrft->cr_pnts += totinflict/10;
X output(pcrft->cr_lgn,'B',0,0);
X setrpt(pcrft);
X sprintf(buf,"%s damage inflicted: %d",msg,totinflict);
X rpt(pcrft,buf);
X fnshrpt(pcrft,1);
X }
X#ifdef DEBUG
X VDBG("damage return\n");
X#endif
X}
END_OF_damage.c
if test 5340 -ne `wc -c <damage.c`; then
echo shar: \"damage.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f psw.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"psw.c\"
else
echo shar: Extracting \"psw.c\" \(4127 characters\)
sed "s/^X//" >psw.c <<'END_OF_psw.c'
X/*
X * Spacewar - program that a user runs to play spacewar
X * start up the game if its not running
X * set tty permissions so that spacewar can communicate
X * notify spacewar of a new player
X * pause in order to tie up the shell
X *
X * Copyright 1984 obo Systems, Inc.
X * Copyright 1984 Dan Rosenblatt
X */
X
X#ifdef BSD
X# include <sys/ioctl.h>
X extern long lseek();
X#else /* SYSIII SYSV */
X# include <fcntl.h>
X#endif /* BSD SYSIII SYSV */
X
X#include <signal.h>
X#include "spacewar.h"
X#include "uio2.h"
X
Xstruct uio2 uio;
Xint swpid,swlgnfd;
Xchar *thistty;
Xstatic VOID fixttyexit(),catchsig();
X
Xmain()
X{
X int i;
X char *ttyname();
X static char waitmsg[]="\nJust a moment while the game cranks up ...\n";
X static char backmsg[]="Doesn't make sense to run in background\n";
X extern char **environ;
X
X /* if newsfile readable, show it */
X if ((i=open(SWNEWS,0)) >= 0) {
X char buf[1024];
X int j;
X while ((j=read(i,buf,sizeof(buf))) > 0)
X write(2,buf,j);
X close(i);
X }
X uio.uio2pid = getpid();
X
X /* if spacewar not running, run it */
X#ifdef BSD
X if (access(SWPIDFILE,0)) {
X#else /* SYSIII SYSV */
X if (access(SWCOMFILE,0)) {
X#endif /* BSD SYSIII SYSV */
Xtryagain:
X write(2,waitmsg,strlen(waitmsg));
X switch(fork()) {
X case -1: /* fork failed */
X perror("fork");
X exit(1);
X case 0: /* child */
X#ifdef BSD
X for (i=0;i < 20;ioctl(i++,FIOCLEX,NULL));
X ioctl(2,FIONCLEX,NULL);
X#else /* SYSIII SYSV */
X for (i=0;i < 20;fcntl(i++,F_SETFD,1));
X fcntl(2,F_SETFD,0);
X#endif /* BSD SYSIII SYSV */
X close(2);
X lseek(open(SWERR,1),0L,2);
X environ = NULL;
X execle(SWGAME,"sw",(char *)0,(char *)0);
X perror(SWGAME);
X kill(uio.uio2pid,SIGKILL); /* inform parent */
X exit(1);
X default: /* parent; wait for the game to get going */
X#ifdef BSD
X while (access(SWPIDFILE,0))
X#else /* SYSIII SYSV */
X while (access(SWCOMFILE,0))
X#endif /* BSD SYSIII SYSV */
X sleep(2);
X break;
X }
X }
X
X /* trap user signals, termination signal */
X /* (insure not running in background) */
X if (signal(SIGINT,catchsig) == SIG_IGN) {
X write(2,backmsg,strlen(backmsg));
X exit(1);
X }
X signal(SIGHUP,catchsig);
X signal(SIGQUIT,catchsig);
X signal(SIGTERM,fixttyexit);
X
X#ifdef BSD
X /* get pid of game to notify it of a new player */
X if ((i=open(SWPIDFILE,0)) < 0 ||
X read(i,&swpid,sizeof(swpid)) != sizeof(swpid) ||
X close(i)) {
X perror(SWPIDFILE);
X exit(1);
X }
X
X /* open notification information file */
X if ((swlgnfd=open(SWLGNFILE,1)) < 0) {
X perror(SWLGNFILE);
X exit(1);
X }
X#else /* SYSIII SYSV */
X /* open communication file */
X if ((swlgnfd=open(SWCOMFILE,O_WRONLY|O_NDELAY)) < 0) {
X perror("notify spacewar");
X write(2,"Restarting!\n",12);
X unlink(SWCOMFILE);
X goto tryagain;
X /*perror(SWCOMFILE);
X *exit(1);
X */
X }
X#endif /* BSD SYSIII SYSV */
X
X /* get tty name and set permissions so */
X /* that the spacewar game can communicate */
X if (!(thistty = ttyname(0)) && !(thistty = ttyname(1))) {
X perror("ttyname");
X exit(1);
X }
X strcpy(uio.uio2tty,thistty);
X
X#ifdef BSD
X /* notify spacewar of new player's tty and this program's pid */
X if (lseek(swlgnfd,0L,2) < 0L ||
X write(swlgnfd,&uio,sizeof(uio)) != sizeof(uio)) {
X perror(SWLGNFILE);
X fixttyexit(1);
X }
X if (kill(swpid,SIGTRAP)) {
X perror("notify spacewar");
X write(2,"Restarting!\n",12);
X close(swlgnfd);
X unlink(SWPIDFILE);
X unlink(SWLGNFILE);
X goto tryagain;
X }
X#else /* SYSIII SYSV */
X if (write(swlgnfd,&uio,sizeof(uio)) != sizeof(uio)) {
X perror(SWCOMFILE);
X fixttyexit(1);
X }
X#endif /* BSD SYSIII SYSV */
X
X /* wait for notification so that shell is tied up */
X uio.uio2tty[0] = '\0';
X for (;;) pause();
X}
X
Xstatic VOID catchsig(sig)
Xint sig;
X{
X signal(sig,catchsig);
X uio.uio2sig = sig;
X
X#ifdef BSD
X if (lseek(swlgnfd,0L,2) < 0L ||
X write(swlgnfd,&uio,sizeof(uio)) != sizeof(uio)) {
X perror(SWLGNFILE);
X fixttyexit(1);
X }
X if (kill(swpid,SIGTRAP)) {
X perror("notify spacewar");
X fixttyexit(1);
X }
X#else /* SYSIII SYSV */
X if (write(swlgnfd,&uio,sizeof(uio)) != sizeof(uio)) {
X perror(SWCOMFILE);
X fixttyexit(1);
X }
X#endif /* BSD SYSIII SYSV */
X}
X
Xstatic VOID fixttyexit(n)
Xint n;
X{
X exit(n);
X}
END_OF_psw.c
if test 4127 -ne `wc -c <psw.c`; then
echo shar: \"psw.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f sw.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"sw.c\"
else
echo shar: Extracting \"sw.c\" \(5105 characters\)
sed "s/^X//" >sw.c <<'END_OF_sw.c'
X/*
X * Spacewar - main for spacewar game
X *
X * Copyright 1984 obo Systems, Inc.
X * Copyright 1984 Dan Rosenblatt
X */
X
X#include <signal.h>
X#include "spacewar.h"
X
Xint numpling;
X
X#ifdef BSD
X# include <sys/ioctl.h>
X static int sigtrap,swlgnfd;
X#else /* VMS SYSIII SYSV */
X#ifdef VMS
X# include <descrip.h>
X# include <ssdef.h>
X# include <psldef.h>
X static $DESCRIPTOR(mlbx,SWCOMFILE);
X extern short inmlbx;
X#else /* SYSIII SYSV */
X# include <sys/types.h>
X# include <sys/stat.h>
X#endif /* VMS SYSIII SYSV */
X#endif /* BSD VMS SYSIII SYSV */
Xextern int doproctrap,doupdate;
Xstatic int dbglvl;
Xstatic VOID catchtrp(),catchalrm();
X
Xmain(argc,argv)
Xint argc;
Xchar *argv[];
X{
X extern VOID proctrap(),shutdown(),cmd();
X#ifdef VMS
X int i;
X#endif /* VMS */
X extern int errno;
X#ifdef BSD
X int swpidfd,thispid,pfd[2];
X#endif /* BSD */
X
X if (argc > 1) dbglvl = atoi(argv[1]);
X
X /* insure running in background */
X#ifndef VMS
X /*if (fork() > 0) exit(0);*/
X#endif /* VMS BSD SYSIII SYSV */
X
X /* ignore interrupts, shutdown on terminate */
X /* break connection with controlling tty */
X /* close unneccesary files */
X#ifndef VMS
X signal(SIGHUP,SIG_IGN);
X signal(SIGINT,SIG_IGN);
X signal(SIGQUIT,SIG_IGN);
X signal(SIGTERM,shutdown);
X#ifdef SIGTSTP
X signal(SIGTSTP,SIG_IGN);
X#endif
X#ifdef SIGTTIN
X signal(SIGTTIN,SIG_IGN);
X#endif
X#ifdef SIGTTOU
X signal(SIGTTOU,SIG_IGN);
X#endif
X#ifdef TIOCNOTTY
X ioctl(0,TIOCNOTTY,0);
X close(open("/dev/console",1));
X#endif
X setpgrp(getpid(),getpid());
X#endif
X close(0);
X close(1);
X
X /* set up objects and aliens */
X srand(time(0));
X objinit();
X alninit();
X
X /* set up readsw pipe/named pipe/mailbox */
X#ifdef BSD
X if (pipe(pfd) || pfd[0] != 0 || pfd[1] != 1) {
X perror("pipe");
X exit(1);
X }
X
X /* set up communication files */
X thispid = getpid();
X if ((swpidfd=creat(SWPIDFILE,0644)) < 0 ||
X write(swpidfd,&thispid,sizeof(thispid)) != sizeof(thispid) ||
X close(swpidfd)) {
X perror(SWPIDFILE);
X exit(1);
X }
X if ((swlgnfd=creat(SWLGNFILE,0666)) < 0 || close(swlgnfd) ||
X (swlgnfd=open(SWLGNFILE,0)) < 0) {
X perror(SWLGNFILE);
X if (unlink(SWPIDFILE)) perror(SWPIDFILE);
X exit(1);
X }
X#else /* VMS SYSIII SYSV */
X#ifdef VMS
X if ((i=sys$assign(&mlbx,&inmlbx,PSL$C_USER,0)) != SS$_NORMAL) {
X perror("assign mlbx");
X#ifdef DEBUG
X VDBG("sw assign()=%d, errno=%d\n",i,errno);
X#endif
X exit(1);
X }
X#else /* SYSIII SYSV */
X if (mknod(SWCOMFILE,0666+S_IFIFO,0) ||
X open(SWCOMFILE,0) != 0 ||
X open(SWCOMFILE,1) != 1) {
X perror(SWCOMFILE);
X exit(1);
X }
X#endif /* VMS SYSIII SYSV */
X#endif /* VMS BSD SYSIII SYSV */
X
X /* open dbm(3) file */
X if (dbminit(SWDATABASE)) {
X perror(SWDATABASE);
X#ifdef BSD
X if (unlink(SWLGNFILE)) perror(SWLGNFILE);
X if (unlink(SWPIDFILE)) perror(SWPIDFILE);
X#else /* VMS SYSIII SYSV */
X#ifndef VMS
X if (unlink(SWCOMFILE)) perror(SWCOMFILE);
X#endif /* VMS SYSIII SYSV */
X#endif /* VMS BSD SYSIII SYSV */
X exit(1);
X }
X
X /* catch asynchronous event notification from playsw */
X#ifdef BSD
X signal(SIGTRAP,catchtrp);
X#endif /* BSD */
X
X /* trap alarm to update universe */
X signal(SIGALRM,catchalrm);
X
X /*******************/
X /* MAIN PROCESSING */
X /*******************/
X
X /* get and process commands and interrupts */
X for (;;) {
X cmd();
X#ifdef BSD
X if (sigtrap) {
X doproctrap = 0;
X proctrap(swlgnfd,&sigtrap);
X doproctrap = 1;
X }
X#endif /* BSD */
X if (doupdate < 0) {
X doproctrap = 0;
X update();
X if (doproctrap == 0) doproctrap = 1;
X doupdate = 1;
X }
X }
X
X}
X
Xfirstplyr()
X{catchalrm();}
X
Xstatic VOID catchalrm()
X{
X
X#ifdef DEBUG
X VDBG("catchalrm\n");
X#endif
X#ifdef VMS
X sys$cancel(inmlbx);
X#endif /* VMS */
X signal(SIGALRM,catchalrm);
X if (doproctrap > 0 && doupdate > 0) {
X doproctrap = 0;
X update();
X if (doproctrap == 0) doproctrap = 1;
X } else
X doupdate = -1;
X if (numpling)
X alarm(1);
X}
X
X#ifdef BSD
Xstatic VOID catchtrp()
X{
X#ifdef DEBUG
X VDBG("catchtrp [doproctrap=%d]\n",doproctrap);
X#endif
X ++sigtrap;
X if (doproctrap > 0) {
X doproctrap = 0;
X proctrap(swlgnfd,&sigtrap);
X doproctrap = 1;
X } else
X doproctrap = -1;
X}
X#endif /* BSD */
X
X
X#ifdef DEBUG
X
X#undef NULL
X#include <stdio.h>
X
X#ifdef VMS
X#include <varargs.h>
XVOID DBG(va_alist)
Xva_dcl
X{
X va_list ap;
X int nargs,i,a[8];
X char *fmt;
X
X va_start(ap);
X va_count(nargs);
X fmt = va_arg(ap,char *);
X for (i=0;--nargs > 0;++i)
X a[i] = va_arg(ap,int);
X va_end(ap);
X while (i < sizeof(a)/sizeof(a[0]))
X a[i++] = -1;
X if (dbglvl > 0) fprintf(stderr,fmt,
X a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
X}
XVOID VDBG(va_alist)
Xva_dcl
X{
X va_list ap;
X int nargs,i,a[8];
X char *fmt;
X
X va_start(ap);
X va_count(nargs);
X fmt = va_arg(ap,char *);
X for (i=0;--nargs > 0;++i)
X a[i] = va_arg(ap,int);
X va_end(ap);
X while (i < sizeof(a)/sizeof(a[0]))
X a[i++] = -1;
X if (dbglvl > 1) fprintf(stderr,fmt,
X a[0],a[1],a[2],a[3],a[4],a[5],a[6],a[7]);
X}
X#else
X/*VARARGS1*/
XVOID DBG(fmt,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)
Xchar *fmt;
X{if (dbglvl > 0) fprintf(stderr,fmt,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8);}
X
X/*VARARGS1*/
XVOID VDBG(fmt,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8)
Xchar *fmt;
X{if (dbglvl > 1) fprintf(stderr,fmt,arg1,arg2,arg3,arg4,arg5,arg6,arg7,arg8);}
X#endif
X
X#endif
END_OF_sw.c
if test 5105 -ne `wc -c <sw.c`; then
echo shar: \"sw.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f upddbm.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"upddbm.c\"
else
echo shar: Extracting \"upddbm.c\" \(4553 characters\)
sed "s/^X//" >upddbm.c <<'END_OF_upddbm.c'
X/*
X * Spacewar - update dbm(3) records
X * for deleting old players and all associated records
X * and for creating super and priviledged crafts
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 "mlbx.h"
X#include "plyr.h"
X#include "ucmd.h"
X
Xmain()
X{
X datum srchkey,dbmkey,dbmdata;
X struct crftkey crk;
X static struct crftkey zcrk;
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 char *asctime(),*ctime(),*gets(),buf[32],dnam[100][8+1],*pnam;
X int i,nd=0,atoi();
X long atol();
X
X if (dbminit(SWDATABASE)) {
X perror(SWDATABASE);
X exit(1);
X }
X
X /* get all players */
X for (srchkey=firstkey();srchkey.dptr;srchkey=nextkey(srchkey)) {
X if (srchkey.dptr[0] != PLYR)
X continue;
X
X /* show player name, last login time, and # of logins */
X bcopy((char *)&plk,srchkey.dptr,sizeof(plk));
X printf("'%s' ",plk.pl_name);
X dbmdata = fetch(srchkey);
X if (!dbmdata.dptr) {
X printf("- can't fetch\n");
X continue;
X }
X bcopy((char *)&pld,dbmdata.dptr,sizeof(pld));
X printf("{%.24s} %d ",
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_numlgn);
X
X /* prompt for delete or craft name to endow */
Xgetcrnam: printf("(d/craftname)>");
X gets(buf);
X
X /* save player name to delete */
X if (!strcmp(buf,"d"))
X strcpy(dnam[nd++],plk.pl_name);
X
X /* try to get craft */
X else if (strlen(buf) > 1) {
X crk = zcrk;
X crk.cr_crftkey = CRAFT;
X strcpy(crk.cr_plyr,plk.pl_name);
X strcpy(crk.cr_name,buf);
X dbmkey.dptr = (char *)&crk;
X dbmkey.dsize = sizeof(crk);
X dbmdata = fetch(dbmkey);
X if (!dbmdata.dptr) {
X printf("No such craft\n");
X goto getcrnam; /* horrendous */
X }
X
X bcopy((char *)&crd,dbmdata.dptr,dbmdata.dsize);
X printf("[htyp=%d] flsp=%ld crew=%ld plvl=%d\n",
X crd.cr_htyp,crd.cr_flsp,crd.cr_crew,crd.cr_plvl);
X printf("flsp>");
X if (strlen(gets(buf)) > 0) crd.cr_flsp = atol(buf);
X printf("crew>");
X if (strlen(gets(buf)) > 0) crd.cr_crew = atol(buf);
X printf("plvl>");
X if (strlen(gets(buf)) > 0) crd.cr_plvl = atoi(buf);
X dbmkey.dptr = (char *)&crk;
X dbmdata.dptr = (char *)&crd;
X if (store(dbmkey,dbmdata))
X printf("Couldn't update craft\n");
X }
X }
X
X printf("\nStarting delete loop\n\n");
X
X /* go through all records requesting ok to delete those matching dnam */
X for (srchkey=firstkey();srchkey.dptr;srchkey=nextkey(srchkey)) {
X
X switch(srchkey.dptr[0]) {
X case CRAFT:
X bcopy((char *)&crk,srchkey.dptr,sizeof(crk));
X pnam = crk.cr_plyr;
X srchkey.dptr = (char *)&crk;
X srchkey.dsize = sizeof(crk);
X break;
X case MLBX:
X bcopy((char *)&mbk,srchkey.dptr,sizeof(mbk));
X pnam = mbk.mb_plyr;
X srchkey.dptr = (char *)&mbk;
X srchkey.dsize = sizeof(mbk);
X break;
X case PLYR:
X bcopy((char *)&plk,srchkey.dptr,sizeof(plk));
X pnam = plk.pl_name;
X srchkey.dptr = (char *)&plk;
X srchkey.dsize = sizeof(plk);
X break;
X case SUBSYS:
X bcopy((char *)&sk,srchkey.dptr,sizeof(sk));
X pnam = sk.s_plyr;
X srchkey.dptr = (char *)&sk;
X srchkey.dsize = sizeof(sk);
X break;
X case UCMD:
X bcopy((char *)&uck,srchkey.dptr,sizeof(uck));
X pnam = uck.uc_plyr;
X srchkey.dptr = (char *)&uck;
X srchkey.dsize = sizeof(uck);
X break;
X default:
X printf("Unknown key: '%c'\n",srchkey.dptr[0]);
X if (delete(srchkey))
X printf("Can't delete\n");
X continue;
X }
X
X /* only if the name matches one in the list */
X for (i=0;i < nd;++i)
X if (!strcmp(pnam,dnam[i]))
X break;
X if (i >= nd) continue;
X
X switch(srchkey.dptr[0]) {
X case CRAFT:
X printf("craft '%s' '%s'",crk.cr_plyr,crk.cr_name);
X break;
X case MLBX:
X printf("mlbx '%s' %d",mbk.mb_plyr,mbk.mb_mlbx);
X break;
X case PLYR:
X printf("plyr '%s'",plk.pl_name);
X break;
X case SUBSYS:
X printf("sys '%s' '%s' %d",sk.s_plyr,sk.s_crft,
X sk.s_type);
X break;
X case UCMD:
X printf("ucmd '%s' '%s' %d",uck.uc_plyr,uck.uc_name,
X uck.uc_ucmd);
X break;
X }
X printf(" (d/)>");
X if (!strcmp(gets(buf),"d") && delete(srchkey))
X printf("Can't delete\n");
X }
X}
END_OF_upddbm.c
if test 4553 -ne `wc -c <upddbm.c`; then
echo shar: \"upddbm.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f upddmg.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"upddmg.c\"
else
echo shar: Extracting \"upddmg.c\" \(5048 characters\)
sed "s/^X//" >upddmg.c <<'END_OF_upddmg.c'
X/*
X * Spacewar - update damage from hull damage and do damage control
X * hull %dmg>=60 more damage, >=80 destroys
X * works for both crfts and alns
X * works for torp dmg >= 100
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 "build.h"
X#include "aln.h"
X#include "flds.h"
X#include "obj.h"
X#include "torp.h"
X
XVOID upddmg()
X{
X struct universe *puniv;
X register struct sys *psys,*pdmgcon;
X register struct crft *pcrft,*phit;
X struct aln *paln;
X struct torp *ptorp;
X struct login *plogin;
X int i;
X
X#ifdef DEBUG
X DBG("upddmg()\n");
X#endif
X
X for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) {
X
X /**********/
X /* set up */
X /**********/
X switch(puniv->uv_type) {
X case 'A':
X paln = puniv->uv_ptr.uv_aln;
X if (paln->al_lhit.ip_ptr &&
X paln->al_lhit.ip_ptr->uv_type == 'P')
X phit = paln->al_lhit.ip_ptr->uv_ptr.uv_crft;
X else
X phit = NULL;
X psys = paln->al_sys;
X pcrft = NULL;
X break;
X case 'P':
X pcrft = puniv->uv_ptr.uv_crft;
X if (pcrft->cr_lhit.ip_ptr &&
X pcrft->cr_lhit.ip_ptr->uv_type == 'P')
X phit = pcrft->cr_lhit.ip_ptr->uv_ptr.uv_crft;
X else
X phit = NULL;
X psys = pcrft->cr_sys;
X paln = NULL;
X break;
X case 'T':
X ptorp = puniv->uv_ptr.uv_torp;
X if (ptorp->tp_dmg >= 100) {
X
X /* hit by a player, credit and report destruction */
X if (ptorp->tp_lhit.ip_ptr &&
X ptorp->tp_lhit.ip_ptr->uv_type == 'P') {
X phit = ptorp->tp_lhit.ip_ptr->uv_ptr.uv_crft;
X phit->cr_pnts += 200;
X output(phit->cr_lgn,'B',0,0);
X setrpt(phit);
X rpt(phit,"Torpedo destroyed by you");
X fnshrpt(phit,1);
X }
X
X /* report destroyed torpedo to firing player */
X if (ptorp->tp_fby.ip_ptr &&
X ptorp->tp_fby.ip_ptr->uv_type == 'P') {
X phit = ptorp->tp_fby.ip_ptr->uv_ptr.uv_crft;
X output(phit->cr_lgn,'B',0,0);
X setrpt(phit);
X rpt(phit,"Your torpedo destroyed");
X fnshrpt(phit,1);
X }
X
X /* remove torpedo */
X remove(ptorp->tp_univ);
X }
X continue;
X default:
X continue;
X }
X
X /*******************************/
X /* hull damage >= 80% destroys */
X /*******************************/
X if (psys[HULL].s_dmg >= 80) {
X
X /* alien */
X if (paln) {
X
X /* hit by another player, credit and report destruction */
X if (phit) {
X phit->cr_kill += 1;
X output(phit->cr_lgn,'B',0,0);
X setrpt(phit);
X rpt(phit,"Alien destroyed by you");
X fnshrpt(phit,1);
X }
X remove(paln->al_univ);
X
X /* craft */
X } else {
X pcrft->cr_dock.ip_ptr = NULL; /* assure destruction */
X pcrft->cr_sens[1] = 1; /* assure destruction */
X unplay(plogin=pcrft->cr_lgn); /* *pcrft gets zeroed out */
X output(plogin,'E',0,0);
X output(plogin,'B',0,0);
X output(plogin,'C',0,"You are destroyed (hull broke up)\n");
X output(plogin,'C',0,PROMPT);
X output(plogin,0,0,0);
X }
X
X /**************************************************************/
X /* hull damage >= 60% causes gradual damage to all subsystems */
X /**************************************************************/
X } else if (psys[HULL].s_dmg >= 60)
X damage(NULL,puniv,1.,DIV(FLOAT(RANDOM(100)),69000.),
X "Hull damage >=60%");
X
X /******************/
X /* damage control */
X /******************/
X pdmgcon = psys + DMGCON;
X
X /* only if damage control subsystem is present */
X if (pdmgcon->s_cap) {
X
X /* not fixing a specific system */
X if (!pdmgcon->s_lvl) {
X
X /* reduce damage by 1% for randomly chosen subsystems */
X for (i=pdmgcon->s_pct*(100-pdmgcon->s_dmg)/1500+1;i-- > 0;) {
X pdmgcon = psys + RANDOM(MSYS);
X if (pdmgcon->s_dmg <= 0 || pdmgcon->s_dmg == 45)
X continue; /* already as low as it can go */
X pdmgcon->s_dmg -= 1;
X if (pcrft)
X biton(pcrft->cr_chng,
X BIT_SDMG+(pdmgcon-psys)*flds[FLD_SDMG].f_grpw);
X if (pdmgcon == psys)
X puniv->uv_mass = pdmgcon->s_dmg;
X }
X
X /* fixing a specific system */
X } else {
X i = pdmgcon->s_pct*(100-pdmgcon->s_dmg)/1500 + 1;
X i = (i*2)/3; /* diminishing returns */
X pdmgcon = psys + pdmgcon->s_lvl - 1;
X if (pdmgcon->s_cap) { /* only if subsystem is present */
X if (pdmgcon->s_dmg > 0 && pdmgcon->s_dmg != 45 && i) {
X pdmgcon->s_dmg -= i;
X biton(pcrft->cr_chng,
X BIT_SDMG+(pdmgcon-psys)*flds[FLD_SDMG].f_grpw);
X if (pdmgcon->s_dmg < 0)
X pdmgcon->s_dmg = 0;
X if (pdmgcon->s_dmg < 45 && pdmgcon->s_dmg+i > 45)
X pdmgcon->s_dmg = 45;
X } else { /* can't be fixed any further */
X psys[DMGCON].s_lvl = NULL;
X biton(pcrft->cr_chng,
X BIT_SLEVEL+DMGCON*flds[FLD_SLEVEL].f_grpw);
X }
X if (pdmgcon == psys)
X puniv->uv_mass = pdmgcon->s_dmg;
X }
X }
X }
X }
X
X#ifdef DEBUG
X VDBG("upddmg return\n");
X#endif
X}
END_OF_upddmg.c
if test 5048 -ne `wc -c <upddmg.c`; then
echo shar: \"upddmg.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f updsys.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"updsys.c\"
else
echo shar: Extracting \"updsys.c\" \(4397 characters\)
sed "s/^X//" >updsys.c <<'END_OF_updsys.c'
X/*
X * Spacewar - update energy subsystems (solar, antm, dilith, shield, warp)
X * works for both aliens and crafts
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 "obj.h"
X#include "aln.h"
X#include "crft.h"
X#include "build.h"
X#include "flds.h"
X#include "torp.h"
X
Xstatic long prtlvl(),strlvl();
X
XVOID updsys()
X{
X register struct universe *puniv;
X register struct obj *pobj;
X register struct sys *psys,*psh;
X char *pchng;
X double vdist(),ftmp;
X long i,elvl;
X dsplcmnt tmpdspl;
X
X#ifdef DEBUG
X DBG("updsys()\n");
X#endif
X
X for (puniv=univlst+MAXUNIVERSE;puniv-- > univlst;) {
X
X /**********/
X /* set up */
X /**********/
X switch(puniv->uv_type) {
X case 'A':
X psys = puniv->uv_ptr.uv_aln->al_sys;
X pchng = NULL;
X break;
X case 'P':
X psys = puniv->uv_ptr.uv_crft->cr_sys;
X pchng = puniv->uv_ptr.uv_crft->cr_chng;
X break;
X default:
X continue;
X }
X elvl = 0L;
X
X /****************/
X /* solar energy */
X /****************/
X if (psys[SOLARE].s_cap) {
X for (i=0,pobj=objlst+MAXOBJ;pobj-- > objlst;) {
X if (pobj->oj_rep != '*') continue;
X /*ftmp = vdist(univlst[pobj-objlst].uv_pstn,puniv->uv_pstn);*/
X tmpdspl = vdisp(&univlst[pobj-objlst],puniv,'d');
X ftmp = tmpdspl.dst;
X i += INT(DIV(1.e9,SQUARE(ftmp)));
X }
X elvl += strlvl(psys,SOLARE,prtlvl(psys,SOLARE,i),pchng);
X }
X
X /*********************/
X /* antimatter energy */
X /*********************/
X if (i=psys[ANTME].s_cap)
X elvl += strlvl(psys,ANTME,prtlvl(psys,ANTME,i),pchng);
X
X /* dilithium storage - increase from solar and antimatter */
X /* no dilithium ==> energy flow but no storage */
X /* shields consume energy - reduce shields if not enough */
X /* remaining gets stored into dilithium (if present) */
X if (psys[DILITH].s_cap)
X elvl += psys[DILITH].s_lvl;
X if ((psh=psys+SHIELDS)->s_cap) {
X
X /* alien shields to 75+hulldamage+? if */
X /* attacking otherwise 25+hulldamage */
X if (!pchng) {
X psh->s_lvl = 25 + puniv->uv_mass;
X if (puniv->uv_ptr.uv_aln->al_atck.ip_ptr)
X psh->s_lvl += 50 + puniv->uv_ptr.uv_aln->al_aeval/20;
X if (psh->s_lvl > 100) psh->s_lvl = 100;
X }
X
X /* energy required to maintain shields (gag awful !@#$%^&) */
X /* capacity reduced by %level and %subsystem, again reduced*/
X /* by some type of squaring of %damage; keep reducing lvl */
X /* until energy required does not exceed energy available */
X for (;;) {
X i = psh->s_cap;
X i *= psh->s_pct;
X i *= psh->s_lvl;
X i /= (100L*100L);
X i *= 10201L;
X i /= 10201L + (psh->s_dmg-202L)*psh->s_dmg;
X if (i <= elvl) break;
X psh->s_lvl -= 1;
X if (pchng)
X biton(pchng,BIT_SLEVEL+SHIELDS*flds[FLD_SLEVEL].f_grpw);
X }
X elvl -= i;
X }
X if (psys[DILITH].s_cap)
X strlvl(psys,DILITH,elvl,pchng);
X
X /***************/
X /* warp energy */
X /***************/
X if (psys[WARP].s_cap) {
X int savpct=psys[WARP].s_pct,savdmg=psys[WARP].s_dmg;
X i = psys[WARP].s_cap;
X i *= psys[WARP].s_pct;
X i /= 100L*100L*2L;
X i += psys[WARP].s_lvl;
X
X /* maximum level (capacity) unaffected by %lvl or %dmg */
X psys[WARP].s_pct = 100;
X psys[WARP].s_dmg = 0;
X strlvl(psys,WARP,i,pchng);
X psys[WARP].s_pct = savpct;
X psys[WARP].s_dmg = savdmg;
X }
X }
X
X#ifdef DEBUG
X VDBG("updsys return\n");
X#endif
X}
X
X/* pro-rate level for %, %dmg */
Xstatic long prtlvl(psys,isys,lvl)
Xregister struct sys *psys;
Xint isys;
Xlong lvl;
X{
X psys += isys;
X if (psys->s_cap) {
X lvl = (lvl*psys->s_pct)/100;
X lvl = (lvl*(100-psys->s_dmg))/100;
X } else
X lvl = 0L;
X return(lvl);
X}
X
X/* limit lvl to capacity (capacity reduced by %dmg) */
X/* store new level and indicate if changed */
Xstatic long strlvl(psys,isys,lvl,pchng)
Xstruct sys *psys;
Xint isys;
Xlong lvl;
Xchar *pchng;
X{
X long maxcap;
X
X psys += isys;
X if (psys->s_cap) {
X maxcap = psys->s_cap;
X maxcap *= psys->s_pct;
X maxcap *= 100L-psys->s_dmg;
X maxcap /= 100L*100L;
X if (lvl > maxcap)
X lvl = maxcap;
X if (lvl != psys->s_lvl) {
X psys->s_lvl = lvl;
X if (pchng)
X biton(pchng,BIT_SLEVEL+isys*flds[FLD_SLEVEL].f_grpw);
X }
X } else
X lvl = 0L;
X return(lvl);
X}
END_OF_updsys.c
if test 4397 -ne `wc -c <updsys.c`; then
echo shar: \"updsys.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f usrcmd.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"usrcmd.c\"
else
echo shar: Extracting \"usrcmd.c\" \(3783 characters\)
sed "s/^X//" >usrcmd.c <<'END_OF_usrcmd.c'
X/*
X * Spacewar - user-command (play) subsystem
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 "ucmd.h"
X
X#define UCMDPROMPT "\ncommand/L(ist)/.(quit)>"
X
XVOID usrcmd(plogin)
Xregister struct login *plogin;
X{
X struct ucmdkey *pucmdkey;
X struct ucmdkey getuckey;
X datum dbmkey,dbmdata;
X char buf[40+1];
X extern char *malloc();
X
X#ifdef DEBUG
X DBG("usrcmd(#%d/%s)\n",plogin-loginlst,plogin->ln_name);
X#endif
X
X /**************/
X /* first time */
X /**************/
X if (!strcmp(plogin->ln_input,".")) goto done;
X if (!(pucmdkey = (struct ucmdkey *)plogin->ln_substat)) {
X#ifdef DEBUG
X VDBG("usrcmd: inp '%s'\n",plogin->ln_input);
X#endif
X
X /* subtask prompt */
X if (!plogin->ln_input[0]) {
X output(plogin,'C',0,UCMDPROMPT);
X
X /* one letter command - list all user-defined command names */
X } else if (!plogin->ln_input[1]) {
X
X strcpy(buf,"\n");
X dbmkey = firstkey();
X while (dbmkey.dptr) {
X bcopy((char *)&getuckey,dbmkey.dptr,sizeof(getuckey));
X if (getuckey.uc_ucmdkey == UCMD &&
X !strcmp(getuckey.uc_plyr,plogin->ln_name) &&
X getuckey.uc_ucmd == 1) {
X if (strlen(buf) + 1 + strlen(getuckey.uc_name) >=
X sizeof(buf)) {
X output(plogin,'C',0,buf);
X strcpy(buf,"\n");
X }
X strcat(buf,getuckey.uc_name);
X strcat(buf," ");
X }
X dbmkey = nextkey(dbmkey);
X }
X if (strlen(buf) > 1) {
X output(plogin,'C',0,buf);
X output(plogin,'C',0,"\n");
X }
X goto done;
X
X /* command name - show existing and set up for re-entry */
X } else {
X if (!(pucmdkey = (struct ucmdkey *)
X malloc(sizeof(struct ucmdkey)))) {
X perror("usrcmd: out of memory");
X goto done;
X }
X plogin->ln_substat = (char *) pucmdkey;
X
X output(plogin,'C',0,
X "\nThe currently defined command (if any) will be displayed.\n");
X output(plogin,'C',0,
X "A single dot (.) at the first prompt will retain it.\n");
X
X /* create subtask structure */
X binit((char *)pucmdkey,sizeof(*pucmdkey));
X pucmdkey->uc_ucmdkey = UCMD;
X strcpy(pucmdkey->uc_plyr,plogin->ln_name);
X plogin->ln_input[sizeof(pucmdkey->uc_name)-1] = NULL;
X strcpy(pucmdkey->uc_name,plogin->ln_input);
X pucmdkey->uc_ucmd = 1;
X
X /* show existing */
X dbmkey.dptr = (char *)pucmdkey;
X dbmkey.dsize = sizeof(*pucmdkey);
X dbmdata = fetch(dbmkey);
X if (dbmdata.dptr) output(plogin,'C',0,"\n");
X while (dbmdata.dptr) {
X output(plogin,'C',0,dbmdata.dptr);
X output(plogin,'C',0,"\n");
X ++pucmdkey->uc_ucmd;
X dbmdata = fetch(dbmkey);
X }
X
X /* prompt for new */
X pucmdkey->uc_ucmd = 1;
X output(plogin,'C',0,"\n>");
X }
X
X /***************/
X /* new command */
X /***************/
X } else {
X
X /* delete old stuff */
X if (pucmdkey->uc_ucmd == 1) {
X dbmkey.dptr = (char *)pucmdkey;
X dbmkey.dsize = sizeof(*pucmdkey);
X while (!delete(dbmkey))
X ++pucmdkey->uc_ucmd;
X pucmdkey->uc_ucmd = 1;
X }
X
X /* insert new line and set up for next */
X if (plogin->ln_input[0]) {
X dbmkey.dptr = (char *)pucmdkey;
X dbmkey.dsize = sizeof(*pucmdkey);
X dbmdata.dptr = plogin->ln_input;
X dbmdata.dsize = strlen(plogin->ln_input) + 1;
X if (store(dbmkey,dbmdata)) {
X perror("usrcmd: can't store ucmd");
X goto done;
X }
X pucmdkey->uc_ucmd += 1;
X }
X output(plogin,'C',0,">");
X }
X
X output(plogin,0,0,0);
X#ifdef DEBUG
X VDBG("usrcmd return\n");
X#endif
X return;
X
Xdone: plogin->ln_stat = NULL;
X if (plogin->ln_substat) {
X free(plogin->ln_substat);
X plogin->ln_substat = NULL;
X }
X output(plogin,'C',0,PROMPT);
X output(plogin,0,0,0);
X#ifdef DEBUG
X VDBG("usrcmd return\n");
X#endif
X return;
X}
END_OF_usrcmd.c
if test 3783 -ne `wc -c <usrcmd.c`; then
echo shar: \"usrcmd.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
if test -f vmspsw.c -a "${1}" != "-c" ; then
echo shar: Will not over-write existing file \"vmspsw.c\"
else
echo shar: Extracting \"vmspsw.c\" \(5088 characters\)
sed "s/^X//" >vmspsw.c <<'END_OF_vmspsw.c'
X/*
X * Spacewar - program that a user runs to play spacewar - VMS ONLY!
X * show newsfile
X * start up the game if its not running including mailbox creation
X * notify spacewar of a new player
X * assign screen mailbox
X * get plogin value for rsw
X * spawn rsw
X * set 'raw' mode
X * read screen mailbox continually looking for shutdown msg
X *
X * Copyright 1985 obo Systems, Inc.
X * Copyright 1985 Dan Rosenblatt
X */
X
X#include "spacewar.h"
X#include "uio.h"
X#include <signal.h>
X#include <stdio.h>
X
X#include <descrip.h>
X#include <ssdef.h>
X#include <iodef.h>
X#include <psldef.h>
X#include <ttdef.h>
X#include <prvdef.h>
X
Xmain()
X{
X int i,j,rswpid;
X static $DESCRIPTOR(swmlbx,SWCOMFILE);
X short swchan,chan;
X static char waitmsg[]="\nJust a moment while the game cranks up ...\n";
X static $DESCRIPTOR(swgame,SWGAME);
X static $DESCRIPTOR(swerr,SWERR);
X static $DESCRIPTOR(swname,"sw");
X struct dsc$descriptor_d mlbx;
X int prv[2];
X struct uio uio;
X char buf[128];
X extern int errno;
X static $DESCRIPTOR(tty,"TT");
X short tchan;
X unsigned short speed,parity,fill;
X struct {
X unsigned char class,type;
X unsigned short width;
X unsigned mode : 24;
X unsigned char length;
X } swtty,savtty;
X
X
X /* if newsfile readable, show it */
X if ((i=open(SWNEWS,0)) >= 0) {
X char buf[512];
X int j;
X while ((j=read(i,buf,sizeof(buf))) > 0)
X write(2,buf,j);
X close(i);
X }
X
X /* if spacewar not running, run it */
X if (sys$assign(&swmlbx,&swchan,PSL$C_USER,0) != SS$_NORMAL) {
X write(2,waitmsg,strlen(waitmsg));
X if ((i=sys$crembx(1,&swchan,0,0,0,PSL$C_USER,&swmlbx)) !=
X SS$_NORMAL) {
X perror("crembx 1");
X sprintf(buf,"vmspsw crembx()=%d, errno=%d\n",i,errno);
X write(2,buf,strlen(buf));
X exit(SS$_ABORT);
X }
X prv[0] = 1<<PRV$V_PRMMBX | 1<<PRV$V_SYSNAM;
X prv[1] = 0;
X if ((i=sys$creprc(0,&swgame,0,&swerr,&swerr,prv,0,&swname,15,
X 0,0,512/*PRC$M_DETACH*/)) != SS$_NORMAL) {
X perror(SWGAME);
X sprintf(buf,"vmspsw creprc()=%d, errno=%d\n",i,errno);
X write(2,buf,strlen(buf));
X if ((i=sys$delmbx(swchan)) != SS$_NORMAL) {
X perror("delete mbx");
X sprintf(buf,"vmspsw delmbx()=%d, errno=%d\n",
X i,errno);
X write(2,buf,strlen(buf));
X }
X exit(SS$_ABORT);
X }
X }
X
X /* notify spacewar of a new player */
X sprintf(uio.uio_chrs,"sw%x",getpid());
X uio.uio_lgn = 0;
X if ((i=sys$qiow(0,swchan,IO$_WRITEVBLK,0,0,0,&uio,sizeof(uio),0,0,0,0))
X != SS$_NORMAL) {
X sprintf(buf,"vmspsw qiow(WRITEVBLK)=%d, errno=%d\n",i,errno);
X write(2,buf,strlen(buf));
X exit(SS$_ABORT);
X }
X
X /* assign the screen mailbox */
X mlbx.dsc$w_length = strlen(uio.uio_chrs);
X mlbx.dsc$b_dtype = DSC$K_DTYPE_T;
X mlbx.dsc$b_class = DSC$K_CLASS_S;
X mlbx.dsc$a_pointer = uio.uio_chrs;
X for (j=10;j-- > 0;)
X if ((i=sys$assign(&mlbx,&chan,PSL$C_USER,0)) != SS$_NORMAL) {
X if (j) {
X sleep(1);
X continue;
X }
X perror("assign mbx");
X sprintf(buf,"vmspsw assignmbx()=%d, errno=%d\n",i,errno);
X write(2,buf,strlen(buf));
X exit(SS$_ABORT);
X } else
X break;
X
X /* get plogin value for rsw */
X if ((i=sys$qiow(0,chan,IO$_READVBLK,0,0,0,buf,sizeof(buf),0,0,0,0)) !=
X SS$_NORMAL) {
X sprintf(buf,"vmspsw qiow(READVBLK)=%d, errno=%d\n",i,errno);
X write(2,buf,strlen(buf));
X }
X
X /* spawn rsw */
X switch(rswpid=vfork()) {
X case -1: /* failed */
X perror("vfork");
X uio.uio_lgn = SIGHUP;
X if ((i=sys$qiow(0,swchan,IO$_WRITEVBLK,0,0,0,&uio,
X sizeof(uio),0,0,0,0)) != SS$_NORMAL) {
X sprintf(buf,"vmspsw qiow(WRITEVBLK)=%d, errno=%d\n",
X i,errno);
X write(2,buf,strlen(buf));
X }
X exit(SS$_ABORT);
X
X case 0: /* child */
X execl(SWREAD,"vmsrsw",buf,uio.uio_chrs,0);
X perror(SWREAD);
X uio.uio_lgn = SIGHUP;
X if ((i=sys$qiow(0,swchan,IO$_WRITEVBLK,0,0,0,&uio,
X sizeof(uio),0,0,0,0)) != SS$_NORMAL) {
X sprintf(buf,"vmspsw qiow(WRITEVBLK)=%d, errno=%d\n",
X i,errno);
X write(2,buf,strlen(buf));
X }
X exit(SS$_ABORT);
X }
X
X /* set 'raw' mode */
X if ((i=sys$assign(&tty,&tchan,PSL$C_USER,0)) != SS$_NORMAL) {
X sprintf(buf,"vmspsw assign()=%d, errno=%d\n",i,errno);
X write(2,buf,strlen(buf));
X }
X if ((i=sys$qiow(0,tchan,IO$_SENSEMODE,0,0,0,&savtty,0,&speed,&fill,
X &parity,0)) != SS$_NORMAL) {
X sprintf(buf,"vmspsw qiow(SENSE)=%d, errno=%d\n",i,errno);
X write(2,buf,strlen(buf));
X }
X swtty = savtty;
X swtty.mode |= TT$M_PASSALL+TT$M_NOECHO;
X if ((i=sys$qiow(0,tchan,IO$_SETMODE,0,0,0,&swtty,0,speed,fill,parity,
X 0)) != SS$_NORMAL) {
X sprintf(buf,"vmspsw qiow(SET)=%d, errno=%d\n",i,errno);
X write(2,buf,strlen(buf));
X }
X
X /* read screen mailbox continually looking for shutdown msg */
X for (;;) {
X if ((i=sys$qiow(0,chan,IO$_READVBLK,0,0,0,buf,sizeof(buf),
X 0,0,0,0)) != SS$_NORMAL) {
X sprintf(buf,"vmspsw qiow(READVBLK)=%d, errno=%d\n",i,errno);
X write(2,buf,strlen(buf));
X }
X if (!strcmp(buf,"ShUtDoWn")) break;
X write(1,buf,strlen(buf));
X }
X kill(rswpid,SIGTERM);
X
X /* reset terminal */
X if ((i=sys$qiow(0,tchan,IO$_SETMODE,0,0,0,&savtty,0,speed,fill,parity,
X 0)) != SS$_NORMAL) {
X sprintf(buf,"vmspsw qiow(SET)=%d, errno=%d\n",i,errno);
X write(2,buf,strlen(buf));
X }
X
X exit(SS$_NORMAL);
X}
END_OF_vmspsw.c
if test 5088 -ne `wc -c <vmspsw.c`; then
echo shar: \"vmspsw.c\" unpacked with wrong size!
fi
# end of overwriting check
fi
echo shar: End of archive 4 \(of 6\).
cp /dev/null ark4isdone
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