[comp.sources.x] v12i011: acm - X aerial combat simulation, Part06/09

riley@mipsdal.mips.com (Riley Rainey) (03/02/91)

Submitted-by: riley@mipsdal.mips.com (Riley Rainey)
Posting-number: Volume 12, Issue 11
Archive-name: acm/part06

#! /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 6 (of 9)."
# Contents:  acm/fsim/Makefile acm/fsim/doViews.c acm/fsim/newPlayer.c
#   acm/fsim/pm.h
# Wrapped by riley@mipsdal on Thu Feb 14 10:09:19 1991
PATH=/bin:/usr/bin:/usr/ucb ; export PATH
if test -f 'acm/fsim/Makefile' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'acm/fsim/Makefile'\"
else
echo shar: Extracting \"'acm/fsim/Makefile'\" \(12313 characters\)
sed "s/^X//" >'acm/fsim/Makefile' <<'END_OF_FILE'
X# Makefile generated by imake - do not edit!
X# $XConsortium: imake.c,v 1.51 89/12/12 12:37:30 jim Exp $
X
X###########################################################################
X# Makefile generated from "Imake.tmpl" and <Imakefile>
X# $XConsortium: Imake.tmpl,v 1.77 89/12/18 17:01:37 jim Exp $
X#
X# Platform-specific parameters may be set in the appropriate .cf
X# configuration files.  Site-wide parameters may be set in the file
X# site.def.  Full rebuilds are recommended if any parameters are changed.
X#
X# If your C preprocessor doesn't define any unique symbols, you'll need
X# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
X# "make Makefile", "make Makefiles", or "make World").
X#
X# If you absolutely can't get imake to work, you'll need to set the
X# variables at the top of each Makefile as well as the dependencies at the
X# bottom (makedepend will do this automatically).
X#
X
X###########################################################################
X# platform-specific configuration parameters - edit Mips.cf to change
X
X# platform:  $XConsortium: Mips.cf,v 1.2 89/01/11 14:58:19 jim Exp $
X# operating system:             RISCOS
X
X         SYSVTYPE = -systype sysv
X          BSDTYPE = -systype bsd43
X         SYSVDEFS = -DMips -DSYSV
X          BSDDEFS = -DMips -DBSD43
X         SYSVINCS = -I$(DESTDIR)/usr/include/bsd
X          BSDINCS =
X         SYSVLIBS = -lbsd -lmld
X          BSDLIBS = -lmld
X
X          SYSTYPE = $(BSDTYPE)
X          SYSDEFS = $(BSDDEFS)
X          SYSINCS = $(BSDINCS)
X          SYSLIBS = $(BSDLIBS)
X
X     OPTIM = -O -Olimit 2000 -Wf,-XNd8400,-XNp12000
X     CCOPT = -signed
X   DEFINES = -D_NO_PROTO
XSYSVCFLAGS = $(OPTIM) $(CCOPT) $(SYSVTYPE) $(INCLUDES) $(SYSVDEFS) $(SYSVINCS) $(DEFINES)
X BSDCFLAGS = $(OPTIM) $(CCOPT) $(BSDTYPE)  $(INCLUDES) $(BSDDEFS)  $(BSDINCS)  $(DEFINES)
X
X           ETCDIR = /etc
X          ULIBDIR = /usr/lib
X
X      XINSTALLDIR = RISCwindows4.0
X     INSTALLFLAGS = -m 0555
X        RS1210DIR = $(DESTDIR)/usr/$(XINSTALLDIR)/RS1210
X    CONTRIBBINDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/contrib/bin
XCONTRIBAPPSDEFDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/contrib/lib/app-defaults
X    CONTRIBMANDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/contrib/man
X    CONTRIBSRCDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/contrib/src
X     RS1210LIBDIR = $(LIBDIR)/ncd
X
X          BINPATH = /usr/bin/X11
X          LIBPATH = /usr/lib/X11
X          ETCPATH = /usr/etc/X11
X          ADMPATH = /usr/adm
X          NCDPATH = /usr/X11/ncd
X       NCDLIBPATH = $(LIBPATH)/ncd
X        XINITPATH = $(LIBPATH)/xinit
X          XDMPATH = $(ETCPATH)/xdm
X          UWMPATH = $(LIBPATH)/uwm
X          AWMPATH = $(LIBPATH)/awm
X          MWMPATH = $(LIBPATH)/mwm
X          TWMPATH = $(LIBPATH)/twm
X     XAPPLOADPATH = $(LIBPATH)/app-defaults
X        RS1210SRC = $(TOP)/rs1210
X
X       MOTIFSRC = $(TOP)/motif
X        MLIBSRC = $(MOTIFSRC)/lib
X     MCLIENTSRC = $(MOTIFSRC)/clients
X       MDEMOSRC = $(MOTIFSRC)/demos
X    MTOOLKITSRC = $(MOTIFSRC)/X11R4/lib/Xt
X     MWIDGETSRC = $(MLIBSRC)/Xm
X   INCLUDEXMSRC = $(MLIBSRC)/Xm
X   MRESOURCESRC = $(MLIBSRC)/Mrm
X         MWMDIR = $(LIBDIR)/Mwm
X     DEMOBINDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/demos/bin
X     DEMOSRCDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/demos/src
X       MINCLUDE = $(TOP)/include
X         UILSRC = $(MCLIENTSRC)/uil
X            UIL = $(UILSRC)/uil
X
X      XMTOOLLIB = $(MTOOLKITSRC)/libXt.a
X          XMLIB = $(MWIDGETSRC)/libXm.a
X   MRESOURCELIB = $(MRESOURCESRC)/libMrm.a
X         UILLIB = $(UILSRC)/libUil.a
X
X  BUILDTOOLSDIR = $(TOP)/buildtools
XCROSSENVOVERRIDE= DESTROOT=/ COMP_TARGET_ROOT=/ ETCDIR=/etc ULIBDIR=/usr/lib
X
X###########################################################################
X# site-specific configuration parameters - edit site.def to change
X
X# site:  $XConsortium: site.def,v 1.21 89/12/06 11:46:50 jim Exp $
X
X            SHELL = 	/bin/sh
X
X              TOP = ../.
X      CURRENT_DIR = ./fsim
X
X               AR = ar clr
X  BOOTSTRAPCFLAGS = $(SYSDEFS)
X               CC = cc
X
X         COMPRESS = compress
X              CPP = /lib/cpp $(STD_CPP_DEFINES)
X    PREPROCESSCMD = cc -E $(STD_CPP_DEFINES)
X          INSTALL = $(ETCDIR)/mipsinstall
X               LD = ld
X             LINT = lint
X      LINTLIBFLAG = -C
X         LINTOPTS = -axz
X               LN = ln -s
X             MAKE = make ETCDIR='$(ETCDIR)' ULIBDIR='$(ULIBDIR)'
X               MV = mv
X               CP = cp
X           RANLIB = /bin/true
X  RANLIBINSTFLAGS =
X               RM = rm -f
X     STD_INCLUDES =
X  STD_CPP_DEFINES = $(SYSDEFS)
X      STD_DEFINES = $(SYSDEFS) $(SYSINCS)
X EXTRA_LOAD_FLAGS =
X  EXTRA_LIBRARIES = $(SYSLIBS)
X             TAGS = ctags
X
X   SIGNAL_DEFINES = -DSIGNALRETURNSINT
X
X    PROTO_DEFINES =
X
X     INSTPGMFLAGS =
X
X     INSTBINFLAGS = -m 0755
X     INSTUIDFLAGS = -m 4755
X     INSTLIBFLAGS = -m 0664
X     INSTINCFLAGS = -m 0444
X     INSTMANFLAGS = -m 0444
X     INSTDATFLAGS = -m 0444
X    INSTKMEMFLAGS = -g sys -m 2755
X
X          DESTDIR = $(DESTROOT)
X
X     TOP_INCLUDES = -I$(INCROOT)
X
X      CDEBUGFLAGS = $(OPTIM) $(CCOPT) $(SYSTYPE)
X        CCOPTIONS =
X      COMPATFLAGS =
X
X      ALLINCLUDES = $(STD_INCLUDES) $(TOP_INCLUDES) $(INCLUDES) $(EXTRA_INCLUDES)
X       ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(PROTO_DEFINES) $(DEFINES) $(COMPATFLAGS) $(EXT_DEFINES)
X           CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
X        LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
X           LDLIBS = $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
X        LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS)
X   LDCOMBINEFLAGS = -X -r
X
X        MACROFILE = Mips.cf
X           RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut *.u *.b
X
X    IMAKE_DEFINES =
X
X         IRULESRC = $(CONFIGDIR)
X        IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
X
X     ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules \
X			$(IRULESRC)/Project.tmpl $(IRULESRC)/site.def \
X			$(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
X
X###########################################################################
X# X Window System Build Parameters
X# $XConsortium: Project.tmpl,v 1.63 89/12/18 16:46:44 jim Exp $
X
X###########################################################################
X# X Window System make variables; this need to be coordinated with rules
X# $XConsortium: Project.tmpl,v 1.63 89/12/18 16:46:44 jim Exp $
X
X          PATHSEP = /
X        USRLIBDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/lib
X           BINDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/bin
X          INCROOT = $(DESTDIR)/usr/$(XINSTALLDIR)/include
X     BUILDINCROOT = $(TOP)
X      BUILDINCDIR = $(BUILDINCROOT)/X11
X      BUILDINCTOP = ..
X           INCDIR = $(INCROOT)/X11
X           ADMDIR = $(DESTDIR)/usr/adm
X           LIBDIR = $(USRLIBDIR)/X11
X        CONFIGDIR = $(LIBDIR)/config
X       LINTLIBDIR = $(USRLIBDIR)/lint
X
X          FONTDIR = $(LIBDIR)/fonts
X         XINITDIR = $(LIBDIR)/xinit
X           XDMDIR = $(DESTDIR)/usr/X11/etc/xdm
X           AWMDIR = $(LIBDIR)/awm
X           TWMDIR = $(LIBDIR)/twm
X           GWMDIR = $(LIBDIR)/gwm
X          MANPATH = $(DESTDIR)/usr/$(XINSTALLDIR)/man/cat
X    MANSOURCEPATH = $(MANPATH)/man
X           MANDIR = $(MANSOURCEPATH)1
X        LIBMANDIR = $(MANSOURCEPATH)3
X      XAPPLOADDIR = $(LIBDIR)/app-defaults
X
X       FONTCFLAGS = -t
X
X     INSTAPPFLAGS = $(INSTDATFLAGS)
X
X            IMAKE = imake
X           DEPEND = makedepend
X              RGB = rgb
X            FONTC = bdftosnf
X        MKFONTDIR = mkfontdir
X        MKDIRHIER = 	/bin/sh $(BINDIR)/mkdirhier.sh
X
X        CONFIGSRC = $(TOP)/config
X        CLIENTSRC = $(TOP)/clients
X          DEMOSRC = $(TOP)/demos
X           LIBSRC = $(TOP)/lib
X          FONTSRC = $(TOP)/fonts
X       INCLUDESRC = $(TOP)/X11
X        SERVERSRC = $(TOP)/server
X          UTILSRC = $(TOP)/util
X        SCRIPTSRC = $(UTILSRC)/scripts
X       EXAMPLESRC = $(TOP)/examples
X       CONTRIBSRC = $(TOP)/../contrib
X           DOCSRC = $(TOP)/doc
X           RGBSRC = $(TOP)/rgb
X        DEPENDSRC = $(UTILSRC)/makedepend
X         IMAKESRC = $(CONFIGSRC)
X         XAUTHSRC = $(LIBSRC)/Xau
X          XLIBSRC = $(LIBSRC)/X
X           XMUSRC = $(LIBSRC)/Xmu
X       TOOLKITSRC = $(LIBSRC)/Xt
X       AWIDGETSRC = $(LIBSRC)/Xaw
X       OLDXLIBSRC = $(LIBSRC)/oldX
X      XDMCPLIBSRC = $(LIBSRC)/Xdmcp
X      BDFTOSNFSRC = $(FONTSRC)/bdftosnf
X     MKFONTDIRSRC = $(FONTSRC)/mkfontdir
X     EXTENSIONSRC = $(TOP)/extensions
X
X  DEPEXTENSIONLIB =  $(USRLIBDIR)/libXext.a
X     EXTENSIONLIB = 			  -lXext
X
X          DEPXLIB = $(DEPEXTENSIONLIB)  $(USRLIBDIR)/libX11.a
X             XLIB = $(EXTENSIONLIB) 			  -lX11
X
X      DEPXAUTHLIB =  $(USRLIBDIR)/libXau.a
X         XAUTHLIB = 			  -lXau
X
X        DEPXMULIB =  $(USRLIBDIR)/libXmu.a
X           XMULIB = 			  -lXmu
X
X       DEPOLDXLIB =  $(USRLIBDIR)/liboldX.a
X          OLDXLIB = 			  -loldX
X
X      DEPXTOOLLIB =  $(USRLIBDIR)/libXt.a
X         XTOOLLIB = 			  -lXt
X
X        DEPXAWLIB =  $(USRLIBDIR)/libXaw.a
X           XAWLIB = 			  -lXaw
X
X LINTEXTENSIONLIB =  $(USRLIBDIR)/llib-lXext.ln
X         LINTXLIB =  $(USRLIBDIR)/llib-lX11.ln
X          LINTXMU =  $(USRLIBDIR)/llib-lXmu.ln
X        LINTXTOOL =  $(USRLIBDIR)/llib-lXt.ln
X          LINTXAW =  $(USRLIBDIR)/llib-lXaw.ln
X
X          DEPLIBS = $(LOCAL_LIBRARIES)
X
X         DEPLIBS1 = $(DEPLIBS)
X         DEPLIBS2 = $(DEPLIBS)
X         DEPLIBS3 = $(DEPLIBS)
X
X###########################################################################
X# Imake rules for building libraries, programs, scripts, and data files
X# rules:  $XConsortium: Imake.rules,v 1.70 90/05/04 16:57:30 keith Exp $
X
X###########################################################################
X# start of Imakefile
X
XCDEBUGFLAGS = -systype bsd43 -O
X
XCDEBUGFLAGS = -systype bsd43 $(STD_INCLUDES) -O
XXLIB = -lX11
X
XSRCS1= 		server.c pm.c flaps.c droneCalc.c init.c aim9m.c\
X		m61a1.c weapon.c newPlayer.c newPlane.c missile.c\
X		missileCalc.c update.c doEvents.c getStick.c\
X		damage.c panel.c doViews.c\
X		doRadar.c placeCraft.c transpose.c doScale.c
XOBJS1=		server.o pm.o flaps.o droneCalc.o init.o aim9m.o\
X		m61a1.o weapon.o newPlayer.o newPlane.o missile.o\
X		missileCalc.o update.o doEvents.o getStick.o\
X		damage.o panel.o doViews.o\
X		doRadar.o placeCraft.o transpose.o doScale.o
XDEPLIBS1=	../V/lib/libV.a
X
XSRCS2=		acm.c
XOBJS2=		acm.o
XDEPLIBS2=
X
XSRCS3=		V2tgif.c
XOBJS3=		V2tgif.o
XDEPLIBS3=	../V/lib/libV.a
X
XPROGRAMS=		acm acms v2tgif
XSTD_INCLUDES=		-I../V/lib
X
XLOCAL_LIBRARIES=	../V/lib/libV.a
XSYS_LIBRARIES=		-lm $(XLIB)
X
XOBJS= $(OBJS1) $(OBJS2) $(OBJS3)
XSRCS= $(SRCS1) $(SRCS2) $(SRCS3)
X
Xall:: $(PROGRAMS)
X
Xacms: $(OBJS1) $(DEPLIBS1)
X	 $(RM) $@
X	$(CC) -o $@ $(OBJS1) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS)  $(EXTRA_LOAD_FLAGS)
X
Xclean::
X	$(RM) acms
X
Xinstall:: acms
X	$(INSTALL) -c -s $(INSTPGMFLAGS)   acms $(BINDIR)
X
Xacm: $(OBJS2) $(DEPLIBS2)
X	 $(RM) $@
X	$(CC) -o $@ $(OBJS2) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS)  $(EXTRA_LOAD_FLAGS)
X
Xclean::
X	$(RM) acm
X
Xinstall:: acm
X	$(INSTALL) -c -s $(INSTPGMFLAGS)   acm $(BINDIR)
X
Xacm.1:: acm.man
X	nroff -man $? > $@
X
Xall:: acm.1
X
Xclean::
X	rm -f acm.1
X
Xinstall.man:: acm.1
X	$(INSTALL) -c $(INSTMANFLAGS) -f acm.1 $(MANDIR)/acm.1
X
Xv2tgif: $(OBJS3) $(DEPLIBS3)
X	 $(RM) $@
X	$(CC) -o $@ $(OBJS3) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS)  $(EXTRA_LOAD_FLAGS)
X
Xclean::
X	$(RM) v2tgif
X
Xdepend::
X	$(DEPEND) -s "# DO NOT DELETE" -- $(ALLDEFINES) -- $(SRCS)
X
Xlint:
X	$(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS)
Xlint1:
X	$(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
X
Xinstall:: install.man
X
Xtar:
X	tar cv acm acms f16 mig23 aim-9 rwy rwy2 tower mtn bullet
X
X###########################################################################
X# common rules for all Makefiles - do not edit
X
Xemptyrule::
X
Xclean::
X	$(RM_CMD) \#*
X
XMakefile::
X	-@if [ -f Makefile ]; then \
X		echo "	$(RM) Makefile.bak; $(MV) Makefile Makefile.bak"; \
X		$(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
X	else exit 0; fi
X	$(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
X
Xtags::
X	$(TAGS) -w *.[ch]
X	$(TAGS) -xw *.[ch] > TAGS
X
X###########################################################################
X# empty rules for directories that do not have SUBDIRS - do not edit
X
Xinstall::
X	@echo "install in $(CURRENT_DIR) done"
X
Xinstall.man::
X	@echo "install.man in $(CURRENT_DIR) done"
X
XMakefiles::
X
Xincludes::
X
X###########################################################################
X# dependencies generated by makedepend
X
END_OF_FILE
if test 12313 -ne `wc -c <'acm/fsim/Makefile'`; then
    echo shar: \"'acm/fsim/Makefile'\" unpacked with wrong size!
fi
# end of 'acm/fsim/Makefile'
fi
if test -f 'acm/fsim/doViews.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'acm/fsim/doViews.c'\"
else
echo shar: Extracting \"'acm/fsim/doViews.c'\" \(12851 characters\)
sed "s/^X//" >'acm/fsim/doViews.c' <<'END_OF_FILE'
X/*
X *	xflight : an aerial combat simulator for X
X *
X *	Written by Riley Rainey,  riley@mips.com
X *
X *	Permission to use, copy, modify and distribute (without charge) this
X *	software, documentation, images, etc. is granted, provided that this 
X *	comment and the author's name is retained.
X *
X */
X 
X#include "pm.h"
X#include <math.h>
X#include <stdio.h>
X
Xextern char *ItoA();
Xextern void doDroneRadar(), doTEWS();
Xextern void placeCraft();
Xextern void doScale(), doCompassScale();
X
X#define lim	((double) -1052500.0)
X
X#define MAXPOLYGONS	8192
X
Xstatic VPolygon *poly[MAXPOLYGONS];
X
Xstatic craft *sortList;
X
Xvoid insertCraft();
X
Xvoid doViews() {
X
X	int	polyCount;
X	register unsigned long curPixel;
X	register craft	*c, *p;
X	register int	i, j, k;
X	register viewer *q;
X	VPoint	 	vp, fwd, up;
X	VPoint		horiz[4];
X	int		mono;
X
X/*
X *  Build a vector of polygons for all objects in the scene.
X *
X *  This vector should be ordered from "most distant" to "closest" so that
X *  the final display will end up correct.  Rather than generalizing this
X *  to death, we'll use a few heuristics to get very close to what we need:
X *
X *  (0) Build a single polygon to represent the ground.
X *  (1) Objects on the surface (stbl) are collected first.
X *  (2) Planes and projectiles (ptbl and mtbl) are first sorted in descending
X *      order by their distance from the observer and then polygons are
X *	collected.
X */
X
X
X    for ((i=0, c=ptbl); i<MAXPLAYERS; (++i, ++c)) {
X
X	if (c->type == CT_DRONE)
X		doDroneRadar (c);
X
X	if (c->type != CT_PLANE)
X		continue;
X
X/*
X *  Set up the eyespace transformation for this viewpoint
X */
X
X	VTransform (&c->cinfo->viewPoint, &(c->trihedral), &vp);
X	vp.x += c->Sg.x;
X	vp.y += c->Sg.y;
X	vp.z += c->Sg.z;
X
X	VTransform (&c->viewDirection, &(c->trihedral), &fwd);
X	fwd.x += vp.x;
X	fwd.y += vp.y;
X	fwd.z += vp.z;
X
X	VTransform (&c->viewUp, &(c->trihedral), &up);
X	up.x += vp.x;
X	up.y += vp.y;
X	up.z += vp.z;
X
X	VGetEyeSpace (c->vl->v, vp, fwd, up);
X
X	polyCount = 0;
X	sortList = (craft *) NULL;
X
X	horiz[0].x = c->Sg.x - lim;
X	horiz[0].y = c->Sg.y - lim;
X	horiz[0].z = 0.0;
X	horiz[1].x = c->Sg.x - lim;
X	horiz[1].y = c->Sg.y + lim;
X	horiz[1].z = 0.0;
X	horiz[2].x = c->Sg.x + lim;
X	horiz[2].y = c->Sg.y + lim;
X	horiz[2].z = 0.0;
X	horiz[3].x = c->Sg.x + lim;
X	horiz[3].y = c->Sg.y - lim;
X	horiz[3].z = 0.0;
X	
X	poly[0] = VCreatePolygon (4, &horiz[0], groundColor);
X	polyCount = 1;
X
X	for ((j=0, p=stbl); j<MAXSURFACE; (++j, ++p)) {
X	    if (p->type != CT_FREE)
X		insertCraft (c, p);
X	}
X
X	for ((j=0, p=ptbl); j<MAXPLAYERS; (++j, ++p)) {
X	    if (p->type != CT_FREE && p != c) {
X		insertCraft (c, p);
X	    }
X	}
X
X	for ((j=0, p=mtbl); j<MAXPROJECTILES; (++j, ++p)) {
X	    if (p->type != CT_FREE)
X		insertCraft (c, p);
X	}
X
X	for (p=sortList; p != (craft *) NULL; p=(craft *)p->next)
X		placeCraft (p, poly, &polyCount);
X
X/*
X *  Clip all polygons
X */
X
X        for (j=0; j<polyCount; ++j) {
X            VTransformPolygon (poly[j], &(c->vl->v->eyeSpace));
X            poly[j] = VClipPolygon(poly[j], c->vl->v->clipPoly);
X	}
X
X/*
X *  Display this image for each viewer associated with this craft
X */
X
X	for (q=c->vl; q != NULL; q = q->next) {
X
X            mono = q->v->flags & VPMono;
X	    curPixel = -1;
X            for (j=0; j<polyCount; ++j) {
X                if (poly[j]) {
X                    if (mono == 0 &&
X			curPixel != (k=q->v->pixel[poly[j]->color->index]))
X		    {
X                        XSetForeground (q->dpy, q->gc, k);
X                        curPixel = k;
X                    }
X		    if (mono)
X			VDrawPolygon (q->v, q->win, q->gc, poly[j]);
X		    else
X			VFillPolygon (q->v, q->win, q->gc, poly[j]);
X                }
X
X           }
X
X/*  Draw Head-Up Display and instrument panel */
X
X	    doHUD(c, q);
X	    doRadar (c, q);
X	    doTEWS (c, q);		/* doRadar must be called first */
X	    doRPM(c, q);
X	    doPanel (c,q);
X
X/*  Expose the completed drawing  */
X
X            VExposeBuffer (q->v, q->gc);
X
X/*
X * Erase the un-displayed planes.
X */
X
X	    if (mono == 0) {
X                curPixel = *(q->v->pixel);
X                XSetForeground (q->dpy, q->gc, curPixel);
X#ifdef USE_PIXMAP_ANIMATION
X		if (q->v->flags & VPPixmap)
X			XFillRectangle (q->dpy, q->v->monoPixmap, q->gc,
X				0, 0, q->v->width, q->v->height);
X		else
X#endif
X                	XFillRectangle (q->dpy, q->win, q->gc,
X				0, 0, q->width, q->height);
X	    }
X
X	}
X
X/*
X *  Release polygons
X */
X
X        for (j=0; j<polyCount; ++j)
X            if (poly[j])
X	        VDestroyPolygon (poly[j]);
X
X    }
X}
X
X/*
X *  insertCraft :  Insert a craft into sortList in descending order.
X */
X
Xvoid insertCraft (c, p)
Xcraft *c, *p; {
X
X    double dist, offset;
X    VPoint ds;
X    craft  *q, *prev;
X
X/*
X *  Here's a kludge for you:  to avoid polygon clipping, I'm going to 
X *  cheat and hack a way to get ground objects to display properly.
X *  if the Z coordinate of an object is zero (i.e. on ground objects),
X *  I'll add a huge offset to their distance values to force them to be
X *  plotted first -- and in roughly their correct drawing order.
X *
X */
X
X    offset = (p->Sg.z == 0.0) ? 1000.0 * NM : 0.0;
X
X    ds.x = p->Sg.x - c->Sg.x;
X    ds.y = p->Sg.y - c->Sg.y;
X    ds.z = p->Sg.z - c->Sg.z;
X    p->order = dist = mag (ds) + offset;
X
X    if (sortList != (craft *) NULL) {
X        for ((q=sortList, prev=(craft *) NULL); q != (craft *) NULL;) {
X	    if (q->order < dist) {
X		p->next = (struct _craft *) q;
X		if (prev == (craft *) NULL)
X		    sortList = p;
X		else
X		    prev->next = (struct _craft *) p;
X		break;
X	    }
X	    prev = q;
X	    q = (craft *) q->next;
X        }
X        if (q == (craft *) NULL) {
X	    prev->next = (struct _craft *) p;
X	    p->next = (struct _craft *) NULL;
X        }
X    }
X    else {
X        sortList = p;
X        p->next = (struct _craft *) NULL;
X    }
X}
X
Xint doHUD (c, u)
Xcraft  *c;
Xviewer *u; {
X
X	char	buffer[80];
X	int	i, x, x1, y;
X	Drawable d;
X
X	d = (u->v->flags & VPMono) ? (Drawable) u->v->monoPixmap :
X	    (Drawable) u->win;
X
X	if (c->viewDirection.x < 0.90)
X		return 0;
X	XSetFont (u->dpy, u->gc, u->font->fid);
X	if (u->v->flags & VPMono)
X	    XSetForeground (u->dpy, u->gc,
X			    BlackPixel(u->v->dpy, u->v->screen));
X	else
X	    XSetForeground (u->dpy, u->gc, u->v->pixel[HUDPixel]);
X	sprintf (buffer, "a=%.1f", RADtoDEG(c->alpha));
X	x = 730 * u->width / VIEW_WINDOW_WIDTH;
X	y = 130 * u->height / VIEW_WINDOW_HEIGHT;
X	XDrawString (u->dpy, d, u->gc, x, y, buffer, strlen(buffer));
X
X	x1 = 410 * u->width / VIEW_WINDOW_WIDTH;
X	sprintf (buffer, "%4.1f", c->G.z);
X	XDrawString (u->dpy, d, u->gc, x1, y, buffer, strlen(buffer));	
X
X	y = 390 * u->height / VIEW_WINDOW_HEIGHT;
X	sprintf (buffer, "%7d", (int)(-c->Cg.z * 60.0));
X	XDrawString (u->dpy, d, u->gc, x, y, buffer, strlen(buffer));
X
X	x = 410 * u->width / VIEW_WINDOW_WIDTH;
X	doCompassScale (u->dpy, d, u->gc, &(u->hdgScale), RADtoDEG(c->curHeading)*100.0,
X		u->fth, u->ftw);
X	doScale (u->dpy, d, u->gc, &(u->altScale), -c->Sg.z, u->fth, u->ftw);
X	doScale (u->dpy, d, u->gc, &(u->velScale), FPStoKTS(mag(c->Cg)),
X		u->fth, u->ftw);
X
X	sprintf (buffer, "%3d%% %s", (int)((double)c->throttle/327.68),
X		(c->flags & FL_AFTERBURNER) ? "AB" : "");
X	XDrawString (u->dpy, d, u->gc, x, y, buffer, strlen(buffer));
X
X	x = 380 * u->width / VIEW_WINDOW_WIDTH;
X	y = 420 * u->height / VIEW_WINDOW_HEIGHT;
X
X	doLadder (c, u);
X
X	for (i=0; i<3; ++i) {
X		XDrawString (u->dpy, d, u->gc, x, y, c->leftHUD[i],
X			strlen (c->leftHUD[i]));
X		y += u->fth;
X	}
X
X	return 0;
X
X}
X
X
Xint	doLadder (c, u)
Xcraft *c;
Xviewer *u;{
X
X	double 		x = c->curPitch, cx, s;
X	double		sinP, cosP, pixelsPerDegree;
X	XSegment	seg[24];
X	XRectangle	rect[1];
X	int		i, rung, windX, windY, w, tx, ty;
X	char		buf[16];
X	VPoint		tmp;
X	Drawable d;
X
X	double L_half_width = 90.0 * u->scaleFactor;
X	double L_end = 25.0 * u->scaleFactor;
X	double L_major_tick_interval = 10.0;
X	double L_major_tick_height = 90.0 * u->scaleFactor;
X
X	d = (u->v->flags & VPMono) ? (Drawable) u->v->monoPixmap :
X	    (Drawable) u->win;
X
X	rect[0].x = u->xCenter - (int) (125.0 * u->scaleFactor + 0.5);
X	rect[0].y = u->yCenter - (int) (110.0 * u->scaleFactor + 0.5);
X	rect[0].width = 250.0 * u->scaleFactor + 0.5;
X	rect[0].height = 220.0 * u->scaleFactor + 0.5;
X
X	s = ((int)(RADtoDEG(x)) / 10 * 10) - 20;
X	rung = s;
X
X	pixelsPerDegree = L_major_tick_height / L_major_tick_interval;
X	cx = (RADtoDEG(x) - s) * pixelsPerDegree;
X	sinP = cos(c->curRoll);
X	cosP = sin(c->curRoll);
X	for (i=0; i<5; ++i, cx -= L_major_tick_height, rung +=10) {
X		seg[i*2].x1 = L_half_width * sinP + cx * cosP + u->xCenter;
X		seg[i*2].y1 = -L_half_width * cosP + cx * sinP + u->yCenter;
X		seg[i*2].x2 =  L_end * sinP + cx * cosP + u->xCenter;
X		seg[i*2].y2 = -L_end * cosP + cx * sinP + u->yCenter;
X		seg[i*2+1].x1 = -L_end * sinP + cx * cosP + u->xCenter;
X		seg[i*2+1].y1 = L_end * cosP + cx * sinP + u->yCenter;
X		seg[i*2+1].x2 =  -L_half_width * sinP + cx * cosP + u->xCenter;
X		seg[i*2+1].y2 = L_half_width * cosP + cx * sinP + u->yCenter;
X		sprintf (buf, "%d", rung);
X		if (seg[i*2].x1 >= rect[0].x && seg[i*2].x1 <
X			rect[0].x+rect[0].width &&
X			seg[i*2].y1 >= rect[0].y && seg[i*2].y1 <
X			rect[0].y+rect[0].height)
X			XDrawString (u->dpy, d, u->gc, 
X				seg[i*2].x1 + 2, seg[i*2].y1 + 5,
X				buf, strlen(buf));
X	}
X
X	i = i * 2;
X
X	XSetClipRectangles (u->dpy, u->gc, 0, 0, rect, 1, YXBanded);
X
X/*
X *  Determine the location of the flight path marker
X */
X
X	VTransform (&c->Cg, &c->Itrihedral, &tmp);
X	if (mag(c->Cg) == 0.0 || tmp.x == 0.0) {
X		windX = u->xCenter;
X		windY = u->yCenter;
X	}
X	else {
X		windX = u->xCenter + tmp.y * u->v->Scale.x / tmp.x + 0.5;
X		windY = u->yCenter + tmp.z * u->v->Scale.y / tmp.x + 0.5;
X	}
X
X	seg[i].x1 = windX - 18;
X	seg[i].y1 = windY;
X	seg[i].x2 = windX - 9;
X	seg[i++].y2 = windY;
X
X	seg[i].x1 = windX + 18;
X	seg[i].y1 = windY;
X	seg[i].x2 = windX + 9;
X	seg[i++].y2 = windY;
X
X	seg[i].x1 = windX;
X	seg[i].y1 = windY - 9;
X	seg[i].x2 = windX;
X	seg[i++].y2 = windY - 15;
X
X/*
X *  Gether weapon display info (and maybe draw a reticle).
X */
X
X	doWeaponDisplay (c, u);
X
X/*
X *  Draw a target designator around the current primary radar target.
X */
X
X	if (c->curRadarTarget >= 0) {
X
X		w = DESIGNATOR_SIZE * u->height / VIEW_WINDOW_HEIGHT * 0.5;
X
X		VTransform (&(ptbl[c->curRadarTarget].Sg),
X			&u->v->eyeSpace, &tmp);
X
X/* radar target is assumed to be ahead of us (tmp.z > 0.0) */
X		
X		tx = u->v->Middl.x + tmp.x * u->v->Scale.x / tmp.z;
X		ty = u->v->Middl.y - tmp.y * u->v->Scale.y / tmp.z;
X
X		seg[i].x1 = tx - w;
X		seg[i].y1 = ty - w;
X		seg[i].x2 = tx + w;
X		seg[i++].y2 = ty - w;
X
X		seg[i].x1 = tx + w;
X		seg[i].y1 = ty - w;
X		seg[i].x2 = tx + w;
X		seg[i++].y2 = ty + w;
X
X		seg[i].x1 = tx + w;
X		seg[i].y1 = ty + w;
X		seg[i].x2 = tx - w;
X		seg[i++].y2 = ty + w;
X
X		seg[i].x1 = tx - w;
X		seg[i].y1 = ty + w;
X		seg[i].x2 = tx - w;
X		seg[i++].y2 = ty - w;
X	}
X
X	XDrawSegments (u->dpy, d, u->gc, seg, i);
X	XDrawArc (u->dpy, d, u->gc, u->xCenter-2, u->yCenter-2, 4, 4, 0, 360*64);
X	XDrawArc (u->dpy, d, u->gc, windX-8, windY-8, 16, 16, 0, 360*64);
X
X	XSetClipMask (u->dpy, u->gc, None);
X
X	return 0;
X}
X
Xint	doRPM (c, u)
Xcraft *c;
Xviewer *u;{
X
X	int	x, y, x1, y1, len, i;
X	double  percent, p;
X	char	s[32], s1[32];
X
X	x = ENG_X * u->width / FS_WINDOW_WIDTH;
X	y = ENG_Y * u->width / FS_WINDOW_WIDTH;
X	len = (eng_x_hot - 6)* u->width / FS_WINDOW_WIDTH;
X
X	XSetForeground (u->dpy, u->gc, u->v->flags & VPMono ?
X			WhitePixel(u->v->dpy, u->v->screen) :
X			u->v->pixel[whitePixel]);
X	XSetBackground (u->dpy, u->gc, u->v->flags & VPMono ?
X			BlackPixel(u->v->dpy, u->v->screen) :
X			u->v->pixel[blackPixel]);
X	XCopyPlane (u->dpy, u->eng, u->win, u->gc, 0, 0, eng_width,eng_height,
X		x - eng_x_hot, y - eng_y_hot, 1);
X
X	if (isFunctioning (c, SYS_ENGINE1))
X		percent = (double) c->throttle / 32768.0 * 100.0;
X	else
X		percent = 0.0;
X	if (percent < 60.0) {
X		p = (60.0 - percent) / 120.0 * pi;
X		x1 = x + len * cos(p);
X		y1 = y - len * sin(p);
X	}
X	else {
X		p = (percent - 60.0) / 40.0 * pi;
X		x1 = x + len * cos(p);
X		y1 = y + len * sin(p); 
X	}
X
X	XDrawLine (u->dpy, u->win, u->gc, x, y, x1, y1);
X
X/*
X *  Print Fuel and Fuel consumption rate
X */
X
X	XSetBackground (u->dpy, u->gc, BlackPixel(u->v->dpy, u->v->screen));
X
X	sprintf (s, "%7s lbs Total", ItoA ((int) c->fuel, s1));
X	XDrawImageString (u->dpy, u->win, u->gc, x-30, y+68, s, strlen(s));
X	sprintf (s, "%7s lbs/hour", ItoA ((int) (fuelUsed(c)*3600.0/deltaT), s1));
X	XDrawImageString (u->dpy, u->win, u->gc, x-30, y+68+u->fth, s, strlen(s));
X
X/*
X *  Display Flap Setting
X */
X
X	if (c->flapSetting > DEGtoRAD(29.0))
X		i=3;
X	else if (c->flapSetting > DEGtoRAD(19.0))
X		i=2;
X	else if (c->flapSetting > DEGtoRAD(9.0))
X		i=1;
X	else
X		i=0;
X
X	x = FLAP_X * u->width / FS_WINDOW_WIDTH;
X	y = FLAP_Y * u->width / FS_WINDOW_WIDTH;
X
X	XCopyPlane (u->dpy, u->flap[i], u->win, u->gc, 0, 0, flaps0_width,
X		flaps0_height, x, y, 1);
X	sprintf (s, "Flaps: %d", (int) RADtoDEG(c->curFlap));
X	XDrawImageString (u->dpy, u->win, u->gc, x+flaps0_x_hot, y+flaps0_y_hot,
X		s, strlen(s));
X
X	return 0;
X}
END_OF_FILE
if test 12851 -ne `wc -c <'acm/fsim/doViews.c'`; then
    echo shar: \"'acm/fsim/doViews.c'\" unpacked with wrong size!
fi
# end of 'acm/fsim/doViews.c'
fi
if test -f 'acm/fsim/newPlayer.c' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'acm/fsim/newPlayer.c'\"
else
echo shar: Extracting \"'acm/fsim/newPlayer.c'\" \(13579 characters\)
sed "s/^X//" >'acm/fsim/newPlayer.c' <<'END_OF_FILE'
X/*
X *	xflight : an aerial combat simulator for X
X *
X *	Written by Riley Rainey,  riley@mips.com
X *
X *	Permission to use, copy, modify and distribute (without charge) this
X *	software, documentation, images, etc. is granted, provided that this 
X *	comment and the author's name is retained.
X *
X */
X 
X#include "pm.h"
X#include <stdio.h>
X#include <X11/Xutil.h>
X#ifndef hpux
X#include <X11/Xos.h>
X#endif
X#include <X11/cursorfont.h>
X
X#define BORDER	1
X
X#ifdef dec
X#define FONT			"courier_18"
X#else
X#if SunOSPlatform
X#define FONT			"9x15"
X#else
X#define FONT			"*courier-bold-r-normal--17*"
X#endif
X#endif
X
X#define	ARG_FONT		"font"
X#define ARG_RADAR_FONT		"radarFont"
X#define	ARG_BORDER_COLOR	"borderColor"
X#define ARG_BORDER		"borderWidth"
X#define	ARG_GEOMETRY		"geometry"
X#define DEFAULT_BACKGROUND	"#93bde4"	/* my version of sky blue */
X#define DEFAULT_BORDER		"black"
X#define DEFAULT_RADAR_FONT	"fixed"
X
X#define SW_BORDER	1
X#define SW_BACKGROUND	2
X#define SW_HUDFONT	3
X#define SW_GEOM		4
X#define SW_RADARFONT	5
X#define SW_TEAM		6
X#define SW_OBSERVE	7
X
Xstruct {
X	char	*sw;
X	int	value;
X	}	swt[] = {
X	"-bw", SW_BORDER,
X	"-skycolor", SW_BACKGROUND,
X	"-hudfont",  SW_HUDFONT,
X	"-radarfont",SW_RADARFONT,
X	"-geometry", SW_GEOM,
X	"-team",     SW_TEAM,
X	"-chase",    SW_OBSERVE,
X	NULL, 0}, *swp;
X
Xvoid	recoverAcmArgv (args, argc, argv)
Xchar	*args;
Xint	*argc;
Xchar	*argv[]; {
X
X	char *s;
X
X	argv[0] = ACM;
X	argv[1] = args;
X
X	if (*args == '\0') {
X		*argc = 1;
X		argv[1] = (char *) NULL;
X		return;
X	}
X	else
X		*argc = 2;
X
X	for (s=args; *s;) {
X		if (*s == '|') {
X			*s = '\0';
X			argv[(*argc)++] = ++s;
X		}
X		else
X			++s;
X	}
X
X	argv[*argc] = (char *) NULL;
X}
X
Xint	newPlayer(s, display, logname, switches)
Xint	s;
Xchar	*display;
Xchar	*logname;
Xchar	*switches; {
X
X    char       *fontName;	/* Name of font for string */
X    XSizeHints	xsh;		/* Size hints for window manager */
X    Colormap	cmap;
X    GC		curGC;
X    XGCValues	gcv;
X    unsigned long pad;		/* Font size parameters */
X    unsigned long bd;		/* Pixel values */
X    unsigned long bw;		/* Border width */
X    char       *tempstr;	/* Temporary string */
X    XColor      color;		/* Temporary color */
X    char       *geomSpec;	/* Window geometry string */
X    XSetWindowAttributes xswa;	/* Temporary Set Window Attribute struct */
X    XWMHints	xwmh;		/* Window manager hints */
X    Cursor	cursor;
X    char	**c;
X    char	err[64];
X    static char	*background = NULL;
X    int		borderWidth = -1;
X    int		player;
X    viewer	*u;
X    craft	*cf;
X    double	scale;
X    int		argc;
X    char	*argv[32];
X    int		screen, mono;
X    char	*hudfont = NULL, *radarfont = NULL;
X    int		team = 1;
X    char	*plane;		/* name of plane type */
X    int		observer = -1;
X
X    recoverAcmArgv (switches, &argc, argv);
X
X    geomSpec = NULL;
X    u = (viewer *) malloc (sizeof(viewer));
X
X/*
X *  Parse command line
X */
X
X    for (c = &argv[1]; *c != (char *) NULL; ++c)
X	if (**c == '-') {
X	    for (swp = &swt[0]; swp->value != 0; ++swp)
X		if (strcmp (swp->sw, *c) == 0) {
X
X			switch (swp->value) {
X
X			case SW_GEOM: 
X				geomSpec = *(++c);
X				break;
X
X			case SW_BORDER:
X				borderWidth = atoi (*(++c));
X				break;
X
X			case SW_BACKGROUND:
X				background = *(++c);
X				break;
X
X			case SW_HUDFONT:
X				hudfont = *(++c);
X				break;
X
X			case SW_RADARFONT:
X				radarfont = *(++c);
X				break;
X
X			case SW_TEAM:
X				team = atoi (*(++c));
X				break;
X
X			case SW_OBSERVE:
X				observer = atoi (*(++c));
X				break;
X			}
X		        break;
X		}
X	    if (swp->value == 0) {
X		free ((char *) u);
X		sprintf (err, "%s: invalid switch %s", ACM, *c);
X		write (s, err, strlen(err));
X		exit (1);
X	    }
X	}
X
X    if (team == 1)
X	plane = "f-16c";
X    else
X	plane = "mig-23";
X
X    if ((player = newPlane (plane)) < 0) {
X	sprintf (err, "Sorry, acm is popular -- no room for \
Xany more players at this moment.\n");
X	write (s, err, strlen(err));
X	return -1;
X    }
X
X/*
X *  assign a (kludged) team location.
X */
X
X    if (team == 2) {
X	ptbl[player].Sg.x = -0.6 * NM + 110.0;
X	ptbl[player].Sg.y = 49.0 * NM;
X    }
X
X    if ((u->dpy = XOpenDisplay(display)) == (Display *) NULL) {
X	free ((char *) u);
X	ptbl[player].type = CT_FREE;
X	sprintf(err, "%s: can't open %s\n", ACM, display);
X	write (s, err, strlen(err));
X	return -1;
X    }
X    screen = DefaultScreen (u->dpy);
X    mono = (DisplayPlanes (u->dpy, screen) == 1) ? 1 : 0;
X
X    if (hudfont)
X	 fontName = hudfont;
X    else if ((fontName = XGetDefault(u->dpy, ACM, ARG_FONT)) == NULL) {
X	fontName = FONT;
X    }
X    if ((u->font = XLoadQueryFont(u->dpy, fontName)) == NULL) {
X	XCloseDisplay (u->dpy);
X	free ((char *) u);
X	ptbl[player].type = CT_FREE;
X	sprintf(err, "%s: display %s doesn't know font %s\n",
X		ACM, display, fontName);
X	write (s, err, strlen(err));
X	return -1;
X    }
X    u->fth = u->font->max_bounds.ascent + u->font->max_bounds.descent;
X    u->ftw = u->font->max_bounds.width;
X
X    if (radarfont)
X	 fontName = radarfont;
X    else if ((fontName = XGetDefault(u->dpy, ACM, ARG_RADAR_FONT)) == NULL) {
X	fontName = DEFAULT_RADAR_FONT;
X    }
X    if ((u->rfont = XLoadQueryFont(u->dpy, fontName)) == NULL) {
X	XCloseDisplay (u->dpy);
X	free ((char *) u);
X	ptbl[player].type = CT_FREE;
X	sprintf(err, "%s: display %s doesn't know font %s\n",
X		ACM, display, fontName);
X	write (s, err, strlen(err));
X	return -1;
X    }
X    u->rfth = u->rfont->max_bounds.ascent + u->rfont->max_bounds.descent;
X    u->rftw = u->rfont->max_bounds.width;
X
X/*
X * Select colors for the border, the window background, and the
X * foreground.  We use the default colormap to allocate the colors in.
X */
X
X    cmap = DefaultColormap(u->dpy, screen);
X
X    if (background == NULL)
X	background = DEFAULT_BACKGROUND;
X
X    if ((tempstr = XGetDefault(u->dpy, ACM, ARG_BORDER_COLOR)) == NULL)
X	tempstr = DEFAULT_BORDER;
X    if (XParseColor(u->dpy, cmap, tempstr, &color) == 0) {
X	XCloseDisplay (u->dpy);
X	free ((char *) u);
X	ptbl[player].type = CT_FREE;
X	sprintf (err, "Can't get border color %s\n", tempstr);
X	write (s, err, strlen(err));
X	return -1;
X    }
X
X    if (mono)
X	bd = BlackPixel (u->dpy, screen);
X    else {
X        if (XAllocColor(u->dpy, cmap, &color) == 0) {
X	    XCloseDisplay (u->dpy);
X	    free ((char *) u);
X	    ptbl[player].type = CT_FREE;
X	    sprintf (err, "Cannot allocate color cells\n");
X	    write (s, err, strlen(err));
X	    return -1;
X	}
X	bd = color.pixel;
X    }
X
X/*
X * Set the border width of the window, and the gap between the text
X * and the edge of the window, "pad".
X */
X
X    pad = BORDER;
X    if (borderWidth >= 0)
X	bw = borderWidth;
X    else if ((tempstr = XGetDefault(u->dpy, ACM, ARG_BORDER)) == NULL)
X	bw = 1;
X    else
X	bw = atoi(tempstr);
X
X/*
X * Deal with providing the window with an initial position & size.
X * Fill out the XSizeHints struct to inform the window manager.
X */
X
X    if (geomSpec == NULL)
X        geomSpec = XGetDefault(u->dpy, ACM, ARG_GEOMETRY);
X
X/*
X * If the defaults database doesn't contain a specification of the
X * initial size & position - fit the window to the text and locate
X * it in the center of the screen.
X */
X
X    if (geomSpec == NULL) {
X	xsh.flags = PPosition | PSize;
X	xsh.height = FS_WINDOW_HEIGHT;
X	xsh.width =  FS_WINDOW_WIDTH;
X	xsh.x = (DisplayWidth(u->dpy, screen) - xsh.width) / 2;
X	xsh.y = (DisplayHeight(u->dpy, screen) - xsh.height) / 2;
X    }
X    else {
X	int         bitmask;
X
X	bzero((char *) &xsh, sizeof(xsh));
X	bitmask = XGeometry(u->dpy, screen, geomSpec, geomSpec,
X			    bw, u->ftw, u->fth, pad, pad, &(xsh.x), &(xsh.y),
X			    &(xsh.width), &(xsh.height));
X	if (bitmask & (XValue | YValue)) {
X	    xsh.flags |= USPosition;
X	}
X	if (bitmask & (WidthValue | HeightValue)) {
X	    xsh.flags |= USSize;
X	}
X    }
X
X/*
X * Create the Window with the information in the XSizeHints, the
X * border width,  and the border & background pixels.
X */
X
X    u->win = XCreateSimpleWindow(u->dpy, DefaultRootWindow(u->dpy),
X			      xsh.x, xsh.y, xsh.width, xsh.height,
X			      bw, bd, bd);
X
X    scale = (double) xsh.width / (double) FS_WINDOW_WIDTH;
X
X/*
X * Create a pixmap of the engine RPM gauge and flap indicators.
X */
X
X    u->eng = XCreateBitmapFromData (u->dpy, u->win, eng_bits, eng_width,
X	eng_height);
X    u->flap[0] = XCreateBitmapFromData (u->dpy, u->win, flaps0_bits,
X	flaps0_width, flaps0_height);
X    u->flap[1] = XCreateBitmapFromData (u->dpy, u->win, flaps1_bits,
X	flaps1_width, flaps1_height);
X    u->flap[2] = XCreateBitmapFromData (u->dpy, u->win, flaps2_bits,
X	flaps2_width, flaps2_height);
X    u->flap[3] = XCreateBitmapFromData (u->dpy, u->win, flaps3_bits,
X	flaps3_width, flaps3_height);
X
X/*
X * Set the standard properties and hints for the window managers.
X */
X
X    XSetStandardProperties(u->dpy, u->win, ACM, ACM, None, argv, argc, &xsh);
X    xwmh.flags = InputHint | StateHint;
X    xwmh.input = True;
X    xwmh.initial_state = NormalState;
X    XSetWMHints(u->dpy, u->win, &xwmh);
X    cursor = XCreateFontCursor (u->dpy, XC_tcross);
X    XDefineCursor (u->dpy, u->win, cursor);
X
X    xsh.width = RADAR_WINDOW_WIDTH * scale;
X    xsh.height = RADAR_WINDOW_HEIGHT * scale;
X    xsh.x = RADAR_X * scale;
X    xsh.y = RADAR_Y * scale;
X    u->rwin = XCreateWindow (u->dpy, u->win, xsh.x, xsh.y, xsh.width,
X	xsh.height, 0, CopyFromParent, CopyFromParent, CopyFromParent,
X	0, NULL);
X
X/*
X * Ensure that the window's colormap field points to the default
X * colormap,  so that the window manager knows the correct colormap to
X * use for the window.  Also,  set the window's Bit
X * Gravity to reduce Expose events.
X */
X
X    xswa.colormap = DefaultColormap(u->dpy, screen);
X    xswa.bit_gravity = NorthWestGravity;
X    XChangeWindowAttributes(u->dpy, u->win, (CWColormap | CWBitGravity), &xswa);
X
X/*
X * Create the GC for drawing the picture.
X */
X
X    gcv.font = u->font->fid;
X    curGC = XCreateGC(u->dpy, u->win, GCFont, &gcv);
X    XSelectInput(u->dpy, u->win, KeyPressMask | ButtonPressMask |
X	StructureNotifyMask | ButtonReleaseMask);
X
X/*
X *  Fill-in the viewer structure
X */
X
X    cf = &ptbl[player];
X    cf->team = player;
X    cf->vl = u;
X    strncpy (cf->name, logname, sizeof (cf->name));
X    strncpy (cf->display, display, sizeof (cf->display));
X    u->next = (viewer *) NULL;
X    u->width = VIEW_WINDOW_WIDTH * scale;
X    u->height = VIEW_WINDOW_HEIGHT * scale;
X    u->xCenter = u->width / 2;
X    u->yCenter = u->height / 2;
X
X    u->radarWidth = RADAR_WINDOW_WIDTH * scale;
X    u->radarHeight = RADAR_WINDOW_HEIGHT * scale;
X    u->gc = curGC;
X
X    u->TEWSx = TEWS_X * scale;
X    u->TEWSy = TEWS_Y * scale;
X    u->TEWSSize = TEWS_SIZE * scale;
X    u->scaleFactor = scale;
X
X#ifdef USE_PIXMAP_ANIMATION
X    if (mono == 0)
X	usePixmaps = 1;
X#endif
X
X    u->v = VOpenViewport (u->dpy, screen, u->win,
X	12.0*25.4/1000.0, 0.5, scale * 0.70, u->width, u->height);
X
X    if (VBindColors (u->v, background) < 0) {
X	XCloseDisplay (u->dpy);
X	free ((char *) u);
X	ptbl[player].type = CT_FREE;
X	sprintf (err, "Error in binding colors.\n");
X	write (s, err, strlen(err));
X	return -1;
X    }
X
X/*
X *  Fill in the scale structures for the airspeed/altitude HUD scales.
X */
X
X    u->altScale.xorg = ALT_ORG_X * scale;
X    u->altScale.yorg = ALT_ORG_Y * scale;
X    u->altScale.length = ALT_LENGTH * scale;
X    u->altScale.orientation = ALT_ORIENT;
X    u->altScale.scale = ALT_SCALE / scale;
X    u->altScale.minorInterval = ALT_MIN_INTERVAL;
X    u->altScale.minorSize = ALT_MIN_SIZE * scale;
X    u->altScale.majorInterval = ALT_MAJ_INTERVAL;
X    u->altScale.majorSize = ALT_MAJ_SIZE * scale;
X    u->altScale.indexSize = ALT_INDEX_SIZE * scale;
X    u->altScale.divisor = ALT_DIVISOR;
X    u->altScale.format = ALT_FORMAT;
X
X    u->velScale.xorg = VEL_ORG_X * scale;
X    u->velScale.yorg = VEL_ORG_Y * scale;
X    u->velScale.length = VEL_LENGTH * scale;
X    u->velScale.orientation = VEL_ORIENT;
X    u->velScale.scale = VEL_SCALE / scale;
X    u->velScale.minorInterval = VEL_MIN_INTERVAL;
X    u->velScale.minorSize = VEL_MIN_SIZE * scale;
X    u->velScale.majorInterval = VEL_MAJ_INTERVAL;
X    u->velScale.majorSize = VEL_MAJ_SIZE * scale;
X    u->velScale.indexSize = VEL_INDEX_SIZE * scale;
X    u->velScale.divisor = VEL_DIVISOR;
X    u->velScale.format = VEL_FORMAT;
X
X    u->hdgScale.xorg = HDG_ORG_X * scale;
X    u->hdgScale.yorg = HDG_ORG_Y * scale;
X    u->hdgScale.length = HDG_LENGTH * scale;
X    u->hdgScale.orientation = HDG_ORIENT;
X    u->hdgScale.scale = HDG_SCALE / scale;
X    u->hdgScale.minorInterval = HDG_MIN_INTERVAL;
X    u->hdgScale.minorSize = HDG_MIN_SIZE * scale;
X    u->hdgScale.majorInterval = HDG_MAJ_INTERVAL;
X    u->hdgScale.majorSize = HDG_MAJ_SIZE * scale;
X    u->hdgScale.indexSize = HDG_INDEX_SIZE * scale;
X    u->hdgScale.divisor = HDG_DIVISOR;
X    u->hdgScale.format = HDG_FORMAT;
X									       
X/*
X * Map the window to make it visible.
X */
X
X    XMapWindow(u->dpy, u->win);
X    XMapWindow(u->dpy, u->rwin);
X    if (mono == 0) {
X	register int curPixel;
X
X    	VExposeBuffer (u->v, u->gc);
X	curPixel = *(u->v->pixel);
X	XSetForeground (u->dpy, u->gc, curPixel);
X	XFillRectangle (u->dpy, u->win, u->gc, 0, 0, u->width, u->height);
X    }
X
X    whitePixel = whiteColor->index;
X    blackPixel = blackColor->index;
X    HUDPixel = HUDColor->index;
X
X    return 0;
X
X}
X
Xint killPlayer (c)
Xcraft	*c; {
X
X	viewer	*v, *vn;
X	int	i;
X
X/*
X *  Erase our radar emissions
X */
X
X	for (i=0; i<MAXPLAYERS; ++i)
X		ptbl[i].rval[c->index] = 0.0;
X
X/*
X *  Free HUD string storage
X */
X
X	if (c->leftHUD[0] != (char *) NULL)
X		for (i=0; i<3; ++i) {
X			free (c->leftHUD[i]);
X			free (c->rightHUD[i]);
X		}
X
X/*
X *  Close viewers' display
X */
X
X	for (v=c->vl; v != (viewer *) NULL;) {
X		XCloseDisplay (v->dpy);
X		vn = (viewer *) v->next;
X		free ((char *) v);
X		v = vn;
X	}
X
X	if (c->flags && FL_RECORD)
X		-- recordCount;
X
X	c->type = CT_FREE;
X	return 0;
X}
END_OF_FILE
if test 13579 -ne `wc -c <'acm/fsim/newPlayer.c'`; then
    echo shar: \"'acm/fsim/newPlayer.c'\" unpacked with wrong size!
fi
# end of 'acm/fsim/newPlayer.c'
fi
if test -f 'acm/fsim/pm.h' -a "${1}" != "-c" ; then 
  echo shar: Will not clobber existing file \"'acm/fsim/pm.h'\"
else
echo shar: Extracting \"'acm/fsim/pm.h'\" \(13242 characters\)
sed "s/^X//" >'acm/fsim/pm.h' <<'END_OF_FILE'
X#include "manifest.h"
X#include "eng.xbm"
X#include "flaps0.xbm"
X#include "flaps1.xbm"
X#include "flaps2.xbm"
X#include "flaps3.xbm"
X#include "scale.h"
X#include "damage.h"
X#include <Vlib.h>
X
X#define MAXSURFACE	8
X#define MAXPLAYERS	16
X#define MAXPROJECTILES	MAXPLAYERS*8
X#define MAXCRAFTTYPES	16
X#define STATIONS	9
X#define WEAPONTYPES	4
X
Xtypedef struct _viewer {
X	struct _viewer *next;
X	Display	        *dpy;		/* display for this user */
X	Window		win;		/* window for this user */
X	Window		twin, rwin;	/* threat window and radar window */
X	GC		gc;		/* GC for drawing */
X	XFontStruct	*font;		/* HUD font */
X	XFontStruct	*rfont;		/* radar font */
X	Viewport	*v;		/* Viewport for out-of-cockpit views */
X	Pixmap		eng;		/* Engine "RPM" gauge */
X	Pixmap		flap[5];	/* flap setting indicators */
X	int		cn;		/* X connection fd */
X	int		width, height;	/* width & height of viewing window */
X	int		xCenter, yCenter; /* center of viewing window */
X	int		ftw, fth;	/* HUD font width & height */
X	int		rftw, rfth;
X	int		radarWidth;
X	int		radarHeight;
X	scaleControl	altScale;	/* altitude scale control */
X	scaleControl	velScale;	/* airspeed scale control */
X	scaleControl	hdgScale;	/* heading scale control */
X	int		TEWSx, TEWSy;	/* location of center of TEWS display */
X	int		TEWSSize;	/* size of TEWS display, in pixels */
X	double		scaleFactor;	/* overall scaling factor for display */
X	}		viewer;
X
X/*
X *  This structure describes a class of aircraft.
X */
X
Xtypedef struct {
X	char	*name;		/* name of aircraft class */
X
X	double	aspectRatio;	/* wing aspect ratio */
X
X	double	CLOrigin, CLSlope; /* Defines the CL characteristic eqn */
X	double	CLNegStall, CLPosStall;
X	double	betaStall;	/* Stall angle for rudder */
X	double  CDOrigin, CDFactor; /* Defines the CD Characteristic eqn */
X	double	(*CDi)();	/* compute zero lift induced drag coefficient */
X	double  CDPhase;
X	double  CDBOrigin, CDBFactor; /* Defines the CD Characteristic eqn */
X	double  CDBPhase;
X	double	CLbeta;		    /* coefficient rolling moment due to sideslip */
X	double  CMOrigin, CMFactor; /* Defines the CM Characteristic eqn */
X	double  CNOrigin, CNFactor; /* Defines the CM Characteristic eqn */
X	double	CYbeta;		/* Side-force from side-slip (dCY/dBeta) */
X
X	double	effAileron;	/* Aileron effectiveness */
X	double	effElevator;	/* Elevator effectiveness */
X	double	effRudder;	/* Rudder effectiveness */
X
X	VMatrix I;		/* Moments of Intertia about CG in [xyz] */
X	double	LDamp;		/* roll damping factor */
X	double	MDamp;		/* pitch damping factor */
X	double	NDamp;		/* yaw damping factor */
X	double	cmSlope; 
X	double  cmFactor;
X	double	cnSlope;
X	double	cnFactor;
X
X	double	maxFlap;	/* maximum flap setting (radians) */
X	double	cFlap;		/* lift coefficient of flaps */
X	double	cFlapDrag;	/* drag coefficient of lowered flaps */
X	double	flapRate;	/* flap movement rate (radians/sec) */
X
X	double	maxSpeedBrake;	/* maximum speed brake setting (radians) */
X	double	cSpeedBrake;	/* drag coefficient of 90 degree speed brake */
X	double	speedBrakeRate;	/* rate of speed brake movement (radians/sec) */
X	double	speedBrakeIncr;	/* number of radians than one keystroke moves brake */
X
X	double	wingS;		/* wing area (ft^2) */
X	double	emptyWeight;	/* empty weight (lbs.) */
X	double	maxFuel;	/* maximum internal fuel (lbs.) */
X
X	double  maxThrust;	/* maximum thrust, military power (lb) */
X	double  maxABThrust;	/* maximum thrust, afterburner on  (lb) */
X	double  spFuelConsump;	/* specific fuel consump(lb fuel/lb T x hr)*/
X	double	spABFuelConsump;
X	VPoint	groundingPoint;	/* hypothetical single pt of contact w/ground */
X	VPoint  viewPoint;	/* pilot's viewing location wrt CG */
X	double	crashC;		/* maximum tolerable touchdown z component */
X
X	double	muStatic;	/* static coefficient of friction no-brakes */
X	double	muKinetic;	/* moving coefficient of friction no-brakes */
X	double	muBStatic;	/* static brakes-on */
X	double  muBKinetic;	/* kinetic brakes-on */
X
X	double  maxNWDef;	/* maximum nosewheel deflection (radians) */
X	double  NWIncr;		/* deflection for each unit */
X	double  maxNWS;		/* maximum NWS velocity */
X	double	gearD1;		/* x station wrt nose gear of main gear */
X	double  gearD2;		/* x station wrt CG of main gear */
X	double	armDelay;	/* arming delay for missiles */
X
X	long	damageBits;	/* initial bit mask of damaged systems */
X	long	structurePts;	/* maximum structural damage */
X
X	double	radarOutput;	/* radar output (watts) */
X	double	radarTRange;	/* tracking radar range */
X	double	radarDRange;	/* detection radar range */
X	double	TEWSThreshold;
X
X	int	sCount;		/* number of weapon stations */
X	VPoint	wStation[STATIONS]; /* weapon's stations (launch points) */
X
X	int	(*placeProc)();	/* object placement procedure (for special craft) */
X	VObject *object;	/* what it looks like */
X	}	craftType;
X
Xtypedef struct _wdsc {
X	int		mask;		/* key mask */
X	int		(*select)();	/* weapon select procedure */
X	int		(*update)();	/* per tick update procedure */
X	int		(*display)();	/* display update procedure */
X	int		(*firePress)();	/* fire button pressed procedure */
X	int		(*fireRelease)(); /* fire button released */
X	craftType	*w;		/* description of this weapon */
X	}		weaponDesc;
X
Xtypedef struct _wctl {
X	int		type;		/* type of weapon at this station */
X	int		info;		/* extra info (weapon specific) */
X	int		info2;		/* "      " */
X	int		info3;		/* "      " */
X	}		weaponStation;
X
X#define WK_M61A1	0x01		/* M-61A1 Vulcan 20mm cannon */
X#define WK_AIM9M	0x02		/* Sidewinder missile */
X
X/*
X *  This structure describes a particular instance of aircraft.
X */
X
Xtypedef struct _craft {
X	int	index;		/* index number of this element in the vector */
X	int	type;		/* craft type */
X	int	team;		/* team number */
X	double	createTime;	/* creation time of this craft */
X	viewer	*vl;		/* list of viewers */
X	VMatrix trihedral;  	/* transforms [x, y, z] to Geoparallel */
X				/* x = forward, y=right wing, z=down */
X				/* does not include origin translation */
X	VMatrix	Itrihedral;	/* transforms geoparallel to [x, y, z] */
X	VPoint	C;		/* Velocity vector in [x, y, z] */
X	VPoint	Cg;		/* Velocity vector in Geoparallel system */
X	VPoint	Sg;		/* Position in Geoparallel system */
X	double	rho;		/* current rho value */
X	double  mach1;		/* current value of mach 1.0 (fps) */
X	double	mach;		/* current mach number */
X	VPoint	G;		/* g-force vector in acft system */
X	VPoint	prevSg;		/* last interval's Sg value */
X	double	p, q, r;	/* roll, pitch, and yaw rates */
X	double	Se, Sa, Sr;	/* control settings */
X	double	curHeading, curPitch, curRoll; /* Euler angles for acft */
X	double	curThrust;	/* Current thrust value */
X	double	curFlap;	/* current flap setting (radians) */
X	double	flapSetting;	/* current target flap setting (radians) */
X	double	curSpeedBrake;	/* current speed brake position (radians) */
X	double	speedBrakeSetting; /* current target speed brake setting (radians) */
X	int	throttle;	/* thrust setting 0 - 32768 */
X	double	alpha, beta;	/* angles of attack and sideslip */
X	double	fuel;		/* current fuel on board */
X	int	groundContact;	/* 1, when on ground */
X	int	flags;		/* flag word */
X
X	long	damageBits;	/* bit flags of damaged subsystems */
X	long	structurePts;	/* damage pts that can be absorbed */
X	double	leakRate;	/* fuel leakage rate (lbs/second) */
X	double	damageCL;	/* damage induced roll */
X	double	damageCM;	/* damage induced pitch */
X
X	int	radarMode;	/* radar mode */
X	double  curNWDef;	/* Current nosewheel deflection (radians) */
X	int	armFuse;	/* missile arming countdown */
X	craftType *cinfo;	/* General craft information */
X	double	order;		/* temporary value used to sort craft */
X	struct  _craft *next;	/* next craft in sorted list */
X	VPoint	viewDirection;	/* where the pilot is currently looking */
X	VPoint	viewUp;		/* the "up" direction of the pilot's view */
X
X	char	name[32];	/* logname of player */
X	char	display[32];	/* display name of player */
X
X	short	curRadarTarget;	/* our primary "threat" */
X	double	targetDistance; /* distance to primary target */
X	double	targetClosure;	/* closure rate on primary target */
X	short	relValid[MAXPLAYERS];
X	VPoint	relPos[MAXPLAYERS];
X	double	rval[MAXPLAYERS];/* radar strength seen by us from other craft */
X				/* relative positions of possible targets */
X	char	*leftHUD[3];	/* strings in lower left corner of HUD */
X				/* (reserved for weapons' status */
X	char	*rightHUD[3];	/* strings in lower right corner of HUD */
X				/* (reserved for future use) */
X	int	curWeapon;	/* index of currently selected weapon */
X	weaponStation station[STATIONS]; /* what's at each weapon station */
X	}	craft;
X
X/*
X *  We'll use some defines to reduce the storage required for the craft
X *  (unions would be cleaner, perhaps).
X */
X
X#define	rounds	curRadarTarget
X#define	tracerMod groundContact
X#define tracerVal radarMode
X#define owner	curWeapon
X
X/*
X *  Craft type definitions
X */
X
X#define CT_FREE		0	/* an unused craft entry */
X#define CT_PLANE	1	/* a player */
X#define CT_MISSILE	2	/* an air to air missile */
X#define CT_CANNON	3	/* a stream of cannon fire */
X#define CT_SURFACE	4	/* surface object (e.g. a runway) */
X#define CT_OBSERVER	5	/* a non-player "watcher" */
X#define CT_DRONE	6	/* a target drone */
X
X#define FL_RECORD	0x01	/* activate recording function */
X#define FL_AFTERBURNER	0x02	/* afterburner state */
X#define FL_BRAKES	0x04	/* wheel brake state */
X#define	FL_NWS		0x08	/* nose-wheel steering mode */
X#define FL_HAS_GYRO	0x10	/* missile is gyroscope equiped */
X
X#define RM_OFF		0	/* radar is off */
X#define RM_STANDBY	1	/* standby */
X#define RM_GUN_DIRECTOR	2	/* gun director mode */
X#define RM_HUD		3	/* 20 degree scan */
X#define RM_NORMAL	4	/* 65 degree scan */
X
Xint		recordCount;	/* number of players recording info */
Xdouble		curTime;	/* current time */
X
Xcraft		stbl[MAXSURFACE]; /* table of surface objects */
Xcraft		ptbl[MAXPLAYERS]; /* table of player aircraft */
Xcraft		mtbl[MAXPROJECTILES]; /* table of missiles and cannon streams */
XweaponDesc	wtbl[WEAPONTYPES]; /* descriptions of different weapons */
X
Xdouble		deltaT;		/* Update interval in seconds */
Xdouble		halfDeltaTSquared; /* 0.5 * deltaT * deltaT */
Xint		HUDPixel;	/* index of HUD color in viewport(s) */
XVColor		*HUDColor;
Xint		whitePixel;	/* index of white in viewport(s) */
XVColor		*whiteColor;	/* white in viewport(s) */
Xint		blackPixel;	/* index of black in viewport(s) */
XVColor		*blackColor;	/* black in viewport(s) */
XVColor		*groundColor;	/* ground color in viewport(s) */
X
X#define a	32.15		/* acceleration due to gravity (fps^2) */
X#define pi	3.1415927
X#define mag(v)	(sqrt (v.x * v.x + v.y * v.y + v.z * v.z))
X#define calcAplha(p)	(atan2 (p.C.z, p.C.x))
X#define calcBeta(p)	(atan2 (p.C.y, sqrt (pow (mag(p.C), 2.0) \
X			+ p.C.y * p.C.y)))
X#define unitVector(v)	{double m; m = mag(v); \
X			v.x /= m; v.y /= m; v.z /= m; }
X
X#define addHeading(c, dh) {c->curHeading = c->curHeading + dh; \
X		if (c->curHeading > pi * 2.0 || c->curHeading <= 0.0) \
X		    c->curHeading = (c->curHeading <= 0.0) ? c->curHeading + \
X			2.0 * pi : c->curHeading - 2.0 * pi; }
X
X#define NM		6076.115
X#define FPStoMPH(v)	(v / 5280.0 * 3600.0)
X#define FPStoKTS(v)	(v / 6076.115 * 3600.0)
X#define RADtoDEG(a)	(a * 180.0 / pi)
X#define DEGtoRAD(a)	(a * pi / 180.0)
X#define fsign(d)	(d < 0 ? -1.0 : 1.0)
X#define calcThrust(c)	((((c->flags & FL_AFTERBURNER) ? \
X	c->cinfo->maxABThrust : c->cinfo->maxThrust) - \
X	c->cinfo->maxThrust * (1.0 - (c->rho / 0.002377))) * \
X	pow ((double) c->throttle / 32768.0, 2.0))
X#define fuelUsed(c)	(((c->flags & FL_AFTERBURNER) ? \
X	c->cinfo->spABFuelConsump : c->cinfo->spFuelConsump) * c->curThrust * \
X	deltaT / 3600.0)
X
X#define VIEW_WINDOW_HEIGHT	500
X#define VIEW_WINDOW_WIDTH	1200
X#define RADAR_WINDOW_WIDTH	200
X#define RADAR_WINDOW_HEIGHT	200
X#define RADAR_X			(1200/2-200/2)
X#define RADAR_Y			(500)
X#define TEWS_X			(1200/2-200/2-100)
X#define TEWS_Y			(VIEW_WINDOW_HEIGHT+60)
X#define TEWS_SIZE		81
X#define FS_WINDOW_WIDTH		(VIEW_WINDOW_WIDTH)	
X#define FS_WINDOW_HEIGHT 	(VIEW_WINDOW_HEIGHT+RADAR_WINDOW_HEIGHT)
X#define	FLAP_X			(1200/2-200/2-95)
X#define FLAP_Y			(FS_WINDOW_HEIGHT-53)
X#define DESIGNATOR_SIZE		40
X#define PANEL_X			(200)
X#define PANEL_Y			(RADAR_Y+50)
X
X/*
X *  Location of the center of the engine RPM gauge.
X */
X
X#define ENG_X			(FS_WINDOW_WIDTH-400)
X#define ENG_Y			(VIEW_WINDOW_HEIGHT+60)
X
X#define ALT_ORG_X		760
X#define ALT_ORG_Y		360
X#define ALT_LENGTH		199
X#define ALT_ORIENT		orientRight
X#define ALT_SCALE		(1700.0 / (double) ALT_LENGTH)
X#define ALT_INDEX_SIZE		30
X#define ALT_MIN_INTERVAL	100
X#define ALT_MIN_SIZE		8
X#define ALT_MAJ_INTERVAL	500
X#define ALT_MAJ_SIZE		15
X#define ALT_DIVISOR		1000.0
X#define ALT_FORMAT		"%4.3g"
X
X#define VEL_ORG_X		440
X#define VEL_ORG_Y		360
X#define VEL_LENGTH		ALT_LENGTH
X#define VEL_ORIENT		0
X#define VEL_SCALE		(170.0 / (double) VEL_LENGTH)
X#define VEL_INDEX_SIZE		30
X#define VEL_MIN_INTERVAL	10
X#define VEL_MIN_SIZE		8
X#define VEL_MAJ_INTERVAL	50
X#define VEL_MAJ_SIZE		15
X#define VEL_DIVISOR		10.0
X#define VEL_FORMAT		"%3.3g"
X
X#define HDG_ORG_X		(VIEW_WINDOW_WIDTH / 2 - (6*30+1) / 2)
X#define HDG_ORG_Y		400
X#define HDG_LENGTH		(6*30+1)
X#define HDG_ORIENT		0
X#define HDG_SCALE		(3000.0 / (double) VEL_LENGTH)
X#define HDG_INDEX_SIZE		10
X#define HDG_MIN_INTERVAL	500
X#define HDG_MIN_SIZE		5
X#define HDG_MAJ_INTERVAL	1000
X#define HDG_MAJ_SIZE		10
X#define HDG_DIVISOR		1000.0
X#define HDG_FORMAT		"%2.2g"
END_OF_FILE
if test 13242 -ne `wc -c <'acm/fsim/pm.h'`; then
    echo shar: \"'acm/fsim/pm.h'\" unpacked with wrong size!
fi
# end of 'acm/fsim/pm.h'
fi
echo shar: End of archive 6 \(of 9\).
cp /dev/null ark6isdone
MISSING=""
for I in 1 2 3 4 5 6 7 8 9 ; do
    if test ! -f ark${I}isdone ; then
	MISSING="${MISSING} ${I}"
    fi
done
if test "${MISSING}" = "" ; then
    echo You have unpacked all 9 archives.
    rm -f ark[1-9]isdone ark[1-9][0-9]isdone
else
    echo You still need to unpack the following archives:
    echo "        " ${MISSING}
fi
##  End of shell archive.
exit 0
-- 
Riley Rainey			Internet: riley@mips.com
MIPS Computer Systems		Phone:    +1 214 770-7979
Dallas, Texas