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