home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / x / volume12 / acm / part06 < prev    next >
Internet Message Format  |  1991-03-01  |  57KB

  1. From: riley@mipsdal.mips.com (Riley Rainey)
  2. Newsgroups: comp.sources.x
  3. Subject: v12i011: acm - X aerial combat simulation, Part06/09
  4. Message-ID: <8988@exodus.Eng.Sun.COM>
  5. Date: 2 Mar 91 08:32:43 GMT
  6. Approved: argv@sun.com
  7.  
  8. Submitted-by: riley@mipsdal.mips.com (Riley Rainey)
  9. Posting-number: Volume 12, Issue 11
  10. Archive-name: acm/part06
  11.  
  12. #! /bin/sh
  13. # This is a shell archive.  Remove anything before this line, then unpack
  14. # it by saving it into a file and typing "sh file".  To overwrite existing
  15. # files, type "sh file -c".  You can also feed this as standard input via
  16. # unshar, or by typing "sh <file", e.g..  If this archive is complete, you
  17. # will see the following message at the end:
  18. #        "End of archive 6 (of 9)."
  19. # Contents:  acm/fsim/Makefile acm/fsim/doViews.c acm/fsim/newPlayer.c
  20. #   acm/fsim/pm.h
  21. # Wrapped by riley@mipsdal on Thu Feb 14 10:09:19 1991
  22. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  23. if test -f 'acm/fsim/Makefile' -a "${1}" != "-c" ; then 
  24.   echo shar: Will not clobber existing file \"'acm/fsim/Makefile'\"
  25. else
  26. echo shar: Extracting \"'acm/fsim/Makefile'\" \(12313 characters\)
  27. sed "s/^X//" >'acm/fsim/Makefile' <<'END_OF_FILE'
  28. X# Makefile generated by imake - do not edit!
  29. X# $XConsortium: imake.c,v 1.51 89/12/12 12:37:30 jim Exp $
  30. X
  31. X###########################################################################
  32. X# Makefile generated from "Imake.tmpl" and <Imakefile>
  33. X# $XConsortium: Imake.tmpl,v 1.77 89/12/18 17:01:37 jim Exp $
  34. X#
  35. X# Platform-specific parameters may be set in the appropriate .cf
  36. X# configuration files.  Site-wide parameters may be set in the file
  37. X# site.def.  Full rebuilds are recommended if any parameters are changed.
  38. X#
  39. X# If your C preprocessor doesn't define any unique symbols, you'll need
  40. X# to set BOOTSTRAPCFLAGS when rebuilding imake (usually when doing
  41. X# "make Makefile", "make Makefiles", or "make World").
  42. X#
  43. X# If you absolutely can't get imake to work, you'll need to set the
  44. X# variables at the top of each Makefile as well as the dependencies at the
  45. X# bottom (makedepend will do this automatically).
  46. X#
  47. X
  48. X###########################################################################
  49. X# platform-specific configuration parameters - edit Mips.cf to change
  50. X
  51. X# platform:  $XConsortium: Mips.cf,v 1.2 89/01/11 14:58:19 jim Exp $
  52. X# operating system:             RISCOS
  53. X
  54. X         SYSVTYPE = -systype sysv
  55. X          BSDTYPE = -systype bsd43
  56. X         SYSVDEFS = -DMips -DSYSV
  57. X          BSDDEFS = -DMips -DBSD43
  58. X         SYSVINCS = -I$(DESTDIR)/usr/include/bsd
  59. X          BSDINCS =
  60. X         SYSVLIBS = -lbsd -lmld
  61. X          BSDLIBS = -lmld
  62. X
  63. X          SYSTYPE = $(BSDTYPE)
  64. X          SYSDEFS = $(BSDDEFS)
  65. X          SYSINCS = $(BSDINCS)
  66. X          SYSLIBS = $(BSDLIBS)
  67. X
  68. X     OPTIM = -O -Olimit 2000 -Wf,-XNd8400,-XNp12000
  69. X     CCOPT = -signed
  70. X   DEFINES = -D_NO_PROTO
  71. XSYSVCFLAGS = $(OPTIM) $(CCOPT) $(SYSVTYPE) $(INCLUDES) $(SYSVDEFS) $(SYSVINCS) $(DEFINES)
  72. X BSDCFLAGS = $(OPTIM) $(CCOPT) $(BSDTYPE)  $(INCLUDES) $(BSDDEFS)  $(BSDINCS)  $(DEFINES)
  73. X
  74. X           ETCDIR = /etc
  75. X          ULIBDIR = /usr/lib
  76. X
  77. X      XINSTALLDIR = RISCwindows4.0
  78. X     INSTALLFLAGS = -m 0555
  79. X        RS1210DIR = $(DESTDIR)/usr/$(XINSTALLDIR)/RS1210
  80. X    CONTRIBBINDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/contrib/bin
  81. XCONTRIBAPPSDEFDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/contrib/lib/app-defaults
  82. X    CONTRIBMANDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/contrib/man
  83. X    CONTRIBSRCDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/contrib/src
  84. X     RS1210LIBDIR = $(LIBDIR)/ncd
  85. X
  86. X          BINPATH = /usr/bin/X11
  87. X          LIBPATH = /usr/lib/X11
  88. X          ETCPATH = /usr/etc/X11
  89. X          ADMPATH = /usr/adm
  90. X          NCDPATH = /usr/X11/ncd
  91. X       NCDLIBPATH = $(LIBPATH)/ncd
  92. X        XINITPATH = $(LIBPATH)/xinit
  93. X          XDMPATH = $(ETCPATH)/xdm
  94. X          UWMPATH = $(LIBPATH)/uwm
  95. X          AWMPATH = $(LIBPATH)/awm
  96. X          MWMPATH = $(LIBPATH)/mwm
  97. X          TWMPATH = $(LIBPATH)/twm
  98. X     XAPPLOADPATH = $(LIBPATH)/app-defaults
  99. X        RS1210SRC = $(TOP)/rs1210
  100. X
  101. X       MOTIFSRC = $(TOP)/motif
  102. X        MLIBSRC = $(MOTIFSRC)/lib
  103. X     MCLIENTSRC = $(MOTIFSRC)/clients
  104. X       MDEMOSRC = $(MOTIFSRC)/demos
  105. X    MTOOLKITSRC = $(MOTIFSRC)/X11R4/lib/Xt
  106. X     MWIDGETSRC = $(MLIBSRC)/Xm
  107. X   INCLUDEXMSRC = $(MLIBSRC)/Xm
  108. X   MRESOURCESRC = $(MLIBSRC)/Mrm
  109. X         MWMDIR = $(LIBDIR)/Mwm
  110. X     DEMOBINDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/demos/bin
  111. X     DEMOSRCDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/demos/src
  112. X       MINCLUDE = $(TOP)/include
  113. X         UILSRC = $(MCLIENTSRC)/uil
  114. X            UIL = $(UILSRC)/uil
  115. X
  116. X      XMTOOLLIB = $(MTOOLKITSRC)/libXt.a
  117. X          XMLIB = $(MWIDGETSRC)/libXm.a
  118. X   MRESOURCELIB = $(MRESOURCESRC)/libMrm.a
  119. X         UILLIB = $(UILSRC)/libUil.a
  120. X
  121. X  BUILDTOOLSDIR = $(TOP)/buildtools
  122. XCROSSENVOVERRIDE= DESTROOT=/ COMP_TARGET_ROOT=/ ETCDIR=/etc ULIBDIR=/usr/lib
  123. X
  124. X###########################################################################
  125. X# site-specific configuration parameters - edit site.def to change
  126. X
  127. X# site:  $XConsortium: site.def,v 1.21 89/12/06 11:46:50 jim Exp $
  128. X
  129. X            SHELL =     /bin/sh
  130. X
  131. X              TOP = ../.
  132. X      CURRENT_DIR = ./fsim
  133. X
  134. X               AR = ar clr
  135. X  BOOTSTRAPCFLAGS = $(SYSDEFS)
  136. X               CC = cc
  137. X
  138. X         COMPRESS = compress
  139. X              CPP = /lib/cpp $(STD_CPP_DEFINES)
  140. X    PREPROCESSCMD = cc -E $(STD_CPP_DEFINES)
  141. X          INSTALL = $(ETCDIR)/mipsinstall
  142. X               LD = ld
  143. X             LINT = lint
  144. X      LINTLIBFLAG = -C
  145. X         LINTOPTS = -axz
  146. X               LN = ln -s
  147. X             MAKE = make ETCDIR='$(ETCDIR)' ULIBDIR='$(ULIBDIR)'
  148. X               MV = mv
  149. X               CP = cp
  150. X           RANLIB = /bin/true
  151. X  RANLIBINSTFLAGS =
  152. X               RM = rm -f
  153. X     STD_INCLUDES =
  154. X  STD_CPP_DEFINES = $(SYSDEFS)
  155. X      STD_DEFINES = $(SYSDEFS) $(SYSINCS)
  156. X EXTRA_LOAD_FLAGS =
  157. X  EXTRA_LIBRARIES = $(SYSLIBS)
  158. X             TAGS = ctags
  159. X
  160. X   SIGNAL_DEFINES = -DSIGNALRETURNSINT
  161. X
  162. X    PROTO_DEFINES =
  163. X
  164. X     INSTPGMFLAGS =
  165. X
  166. X     INSTBINFLAGS = -m 0755
  167. X     INSTUIDFLAGS = -m 4755
  168. X     INSTLIBFLAGS = -m 0664
  169. X     INSTINCFLAGS = -m 0444
  170. X     INSTMANFLAGS = -m 0444
  171. X     INSTDATFLAGS = -m 0444
  172. X    INSTKMEMFLAGS = -g sys -m 2755
  173. X
  174. X          DESTDIR = $(DESTROOT)
  175. X
  176. X     TOP_INCLUDES = -I$(INCROOT)
  177. X
  178. X      CDEBUGFLAGS = $(OPTIM) $(CCOPT) $(SYSTYPE)
  179. X        CCOPTIONS =
  180. X      COMPATFLAGS =
  181. X
  182. X      ALLINCLUDES = $(STD_INCLUDES) $(TOP_INCLUDES) $(INCLUDES) $(EXTRA_INCLUDES)
  183. X       ALLDEFINES = $(ALLINCLUDES) $(STD_DEFINES) $(PROTO_DEFINES) $(DEFINES) $(COMPATFLAGS) $(EXT_DEFINES)
  184. X           CFLAGS = $(CDEBUGFLAGS) $(CCOPTIONS) $(ALLDEFINES)
  185. X        LINTFLAGS = $(LINTOPTS) -DLINT $(ALLDEFINES)
  186. X           LDLIBS = $(SYS_LIBRARIES) $(EXTRA_LIBRARIES)
  187. X        LDOPTIONS = $(CDEBUGFLAGS) $(CCOPTIONS)
  188. X   LDCOMBINEFLAGS = -X -r
  189. X
  190. X        MACROFILE = Mips.cf
  191. X           RM_CMD = $(RM) *.CKP *.ln *.BAK *.bak *.o core errs ,* *~ *.a .emacs_* tags TAGS make.log MakeOut *.u *.b
  192. X
  193. X    IMAKE_DEFINES =
  194. X
  195. X         IRULESRC = $(CONFIGDIR)
  196. X        IMAKE_CMD = $(IMAKE) -DUseInstalled -I$(IRULESRC) $(IMAKE_DEFINES)
  197. X
  198. X     ICONFIGFILES = $(IRULESRC)/Imake.tmpl $(IRULESRC)/Imake.rules \
  199. X            $(IRULESRC)/Project.tmpl $(IRULESRC)/site.def \
  200. X            $(IRULESRC)/$(MACROFILE) $(EXTRA_ICONFIGFILES)
  201. X
  202. X###########################################################################
  203. X# X Window System Build Parameters
  204. X# $XConsortium: Project.tmpl,v 1.63 89/12/18 16:46:44 jim Exp $
  205. X
  206. X###########################################################################
  207. X# X Window System make variables; this need to be coordinated with rules
  208. X# $XConsortium: Project.tmpl,v 1.63 89/12/18 16:46:44 jim Exp $
  209. X
  210. X          PATHSEP = /
  211. X        USRLIBDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/lib
  212. X           BINDIR = $(DESTDIR)/usr/$(XINSTALLDIR)/bin
  213. X          INCROOT = $(DESTDIR)/usr/$(XINSTALLDIR)/include
  214. X     BUILDINCROOT = $(TOP)
  215. X      BUILDINCDIR = $(BUILDINCROOT)/X11
  216. X      BUILDINCTOP = ..
  217. X           INCDIR = $(INCROOT)/X11
  218. X           ADMDIR = $(DESTDIR)/usr/adm
  219. X           LIBDIR = $(USRLIBDIR)/X11
  220. X        CONFIGDIR = $(LIBDIR)/config
  221. X       LINTLIBDIR = $(USRLIBDIR)/lint
  222. X
  223. X          FONTDIR = $(LIBDIR)/fonts
  224. X         XINITDIR = $(LIBDIR)/xinit
  225. X           XDMDIR = $(DESTDIR)/usr/X11/etc/xdm
  226. X           AWMDIR = $(LIBDIR)/awm
  227. X           TWMDIR = $(LIBDIR)/twm
  228. X           GWMDIR = $(LIBDIR)/gwm
  229. X          MANPATH = $(DESTDIR)/usr/$(XINSTALLDIR)/man/cat
  230. X    MANSOURCEPATH = $(MANPATH)/man
  231. X           MANDIR = $(MANSOURCEPATH)1
  232. X        LIBMANDIR = $(MANSOURCEPATH)3
  233. X      XAPPLOADDIR = $(LIBDIR)/app-defaults
  234. X
  235. X       FONTCFLAGS = -t
  236. X
  237. X     INSTAPPFLAGS = $(INSTDATFLAGS)
  238. X
  239. X            IMAKE = imake
  240. X           DEPEND = makedepend
  241. X              RGB = rgb
  242. X            FONTC = bdftosnf
  243. X        MKFONTDIR = mkfontdir
  244. X        MKDIRHIER =     /bin/sh $(BINDIR)/mkdirhier.sh
  245. X
  246. X        CONFIGSRC = $(TOP)/config
  247. X        CLIENTSRC = $(TOP)/clients
  248. X          DEMOSRC = $(TOP)/demos
  249. X           LIBSRC = $(TOP)/lib
  250. X          FONTSRC = $(TOP)/fonts
  251. X       INCLUDESRC = $(TOP)/X11
  252. X        SERVERSRC = $(TOP)/server
  253. X          UTILSRC = $(TOP)/util
  254. X        SCRIPTSRC = $(UTILSRC)/scripts
  255. X       EXAMPLESRC = $(TOP)/examples
  256. X       CONTRIBSRC = $(TOP)/../contrib
  257. X           DOCSRC = $(TOP)/doc
  258. X           RGBSRC = $(TOP)/rgb
  259. X        DEPENDSRC = $(UTILSRC)/makedepend
  260. X         IMAKESRC = $(CONFIGSRC)
  261. X         XAUTHSRC = $(LIBSRC)/Xau
  262. X          XLIBSRC = $(LIBSRC)/X
  263. X           XMUSRC = $(LIBSRC)/Xmu
  264. X       TOOLKITSRC = $(LIBSRC)/Xt
  265. X       AWIDGETSRC = $(LIBSRC)/Xaw
  266. X       OLDXLIBSRC = $(LIBSRC)/oldX
  267. X      XDMCPLIBSRC = $(LIBSRC)/Xdmcp
  268. X      BDFTOSNFSRC = $(FONTSRC)/bdftosnf
  269. X     MKFONTDIRSRC = $(FONTSRC)/mkfontdir
  270. X     EXTENSIONSRC = $(TOP)/extensions
  271. X
  272. X  DEPEXTENSIONLIB =  $(USRLIBDIR)/libXext.a
  273. X     EXTENSIONLIB =               -lXext
  274. X
  275. X          DEPXLIB = $(DEPEXTENSIONLIB)  $(USRLIBDIR)/libX11.a
  276. X             XLIB = $(EXTENSIONLIB)               -lX11
  277. X
  278. X      DEPXAUTHLIB =  $(USRLIBDIR)/libXau.a
  279. X         XAUTHLIB =               -lXau
  280. X
  281. X        DEPXMULIB =  $(USRLIBDIR)/libXmu.a
  282. X           XMULIB =               -lXmu
  283. X
  284. X       DEPOLDXLIB =  $(USRLIBDIR)/liboldX.a
  285. X          OLDXLIB =               -loldX
  286. X
  287. X      DEPXTOOLLIB =  $(USRLIBDIR)/libXt.a
  288. X         XTOOLLIB =               -lXt
  289. X
  290. X        DEPXAWLIB =  $(USRLIBDIR)/libXaw.a
  291. X           XAWLIB =               -lXaw
  292. X
  293. X LINTEXTENSIONLIB =  $(USRLIBDIR)/llib-lXext.ln
  294. X         LINTXLIB =  $(USRLIBDIR)/llib-lX11.ln
  295. X          LINTXMU =  $(USRLIBDIR)/llib-lXmu.ln
  296. X        LINTXTOOL =  $(USRLIBDIR)/llib-lXt.ln
  297. X          LINTXAW =  $(USRLIBDIR)/llib-lXaw.ln
  298. X
  299. X          DEPLIBS = $(LOCAL_LIBRARIES)
  300. X
  301. X         DEPLIBS1 = $(DEPLIBS)
  302. X         DEPLIBS2 = $(DEPLIBS)
  303. X         DEPLIBS3 = $(DEPLIBS)
  304. X
  305. X###########################################################################
  306. X# Imake rules for building libraries, programs, scripts, and data files
  307. X# rules:  $XConsortium: Imake.rules,v 1.70 90/05/04 16:57:30 keith Exp $
  308. X
  309. X###########################################################################
  310. X# start of Imakefile
  311. X
  312. XCDEBUGFLAGS = -systype bsd43 -O
  313. X
  314. XCDEBUGFLAGS = -systype bsd43 $(STD_INCLUDES) -O
  315. XXLIB = -lX11
  316. X
  317. XSRCS1=         server.c pm.c flaps.c droneCalc.c init.c aim9m.c\
  318. X        m61a1.c weapon.c newPlayer.c newPlane.c missile.c\
  319. X        missileCalc.c update.c doEvents.c getStick.c\
  320. X        damage.c panel.c doViews.c\
  321. X        doRadar.c placeCraft.c transpose.c doScale.c
  322. XOBJS1=        server.o pm.o flaps.o droneCalc.o init.o aim9m.o\
  323. X        m61a1.o weapon.o newPlayer.o newPlane.o missile.o\
  324. X        missileCalc.o update.o doEvents.o getStick.o\
  325. X        damage.o panel.o doViews.o\
  326. X        doRadar.o placeCraft.o transpose.o doScale.o
  327. XDEPLIBS1=    ../V/lib/libV.a
  328. X
  329. XSRCS2=        acm.c
  330. XOBJS2=        acm.o
  331. XDEPLIBS2=
  332. X
  333. XSRCS3=        V2tgif.c
  334. XOBJS3=        V2tgif.o
  335. XDEPLIBS3=    ../V/lib/libV.a
  336. X
  337. XPROGRAMS=        acm acms v2tgif
  338. XSTD_INCLUDES=        -I../V/lib
  339. X
  340. XLOCAL_LIBRARIES=    ../V/lib/libV.a
  341. XSYS_LIBRARIES=        -lm $(XLIB)
  342. X
  343. XOBJS= $(OBJS1) $(OBJS2) $(OBJS3)
  344. XSRCS= $(SRCS1) $(SRCS2) $(SRCS3)
  345. X
  346. Xall:: $(PROGRAMS)
  347. X
  348. Xacms: $(OBJS1) $(DEPLIBS1)
  349. X     $(RM) $@
  350. X    $(CC) -o $@ $(OBJS1) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS)  $(EXTRA_LOAD_FLAGS)
  351. X
  352. Xclean::
  353. X    $(RM) acms
  354. X
  355. Xinstall:: acms
  356. X    $(INSTALL) -c -s $(INSTPGMFLAGS)   acms $(BINDIR)
  357. X
  358. Xacm: $(OBJS2) $(DEPLIBS2)
  359. X     $(RM) $@
  360. X    $(CC) -o $@ $(OBJS2) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS)  $(EXTRA_LOAD_FLAGS)
  361. X
  362. Xclean::
  363. X    $(RM) acm
  364. X
  365. Xinstall:: acm
  366. X    $(INSTALL) -c -s $(INSTPGMFLAGS)   acm $(BINDIR)
  367. X
  368. Xacm.1:: acm.man
  369. X    nroff -man $? > $@
  370. X
  371. Xall:: acm.1
  372. X
  373. Xclean::
  374. X    rm -f acm.1
  375. X
  376. Xinstall.man:: acm.1
  377. X    $(INSTALL) -c $(INSTMANFLAGS) -f acm.1 $(MANDIR)/acm.1
  378. X
  379. Xv2tgif: $(OBJS3) $(DEPLIBS3)
  380. X     $(RM) $@
  381. X    $(CC) -o $@ $(OBJS3) $(LDOPTIONS) $(LOCAL_LIBRARIES) $(LDLIBS)  $(EXTRA_LOAD_FLAGS)
  382. X
  383. Xclean::
  384. X    $(RM) v2tgif
  385. X
  386. Xdepend::
  387. X    $(DEPEND) -s "# DO NOT DELETE" -- $(ALLDEFINES) -- $(SRCS)
  388. X
  389. Xlint:
  390. X    $(LINT) $(LINTFLAGS) $(SRCS) $(LINTLIBS)
  391. Xlint1:
  392. X    $(LINT) $(LINTFLAGS) $(FILE) $(LINTLIBS)
  393. X
  394. Xinstall:: install.man
  395. X
  396. Xtar:
  397. X    tar cv acm acms f16 mig23 aim-9 rwy rwy2 tower mtn bullet
  398. X
  399. X###########################################################################
  400. X# common rules for all Makefiles - do not edit
  401. X
  402. Xemptyrule::
  403. X
  404. Xclean::
  405. X    $(RM_CMD) \#*
  406. X
  407. XMakefile::
  408. X    -@if [ -f Makefile ]; then \
  409. X        echo "    $(RM) Makefile.bak; $(MV) Makefile Makefile.bak"; \
  410. X        $(RM) Makefile.bak; $(MV) Makefile Makefile.bak; \
  411. X    else exit 0; fi
  412. X    $(IMAKE_CMD) -DTOPDIR=$(TOP) -DCURDIR=$(CURRENT_DIR)
  413. X
  414. Xtags::
  415. X    $(TAGS) -w *.[ch]
  416. X    $(TAGS) -xw *.[ch] > TAGS
  417. X
  418. X###########################################################################
  419. X# empty rules for directories that do not have SUBDIRS - do not edit
  420. X
  421. Xinstall::
  422. X    @echo "install in $(CURRENT_DIR) done"
  423. X
  424. Xinstall.man::
  425. X    @echo "install.man in $(CURRENT_DIR) done"
  426. X
  427. XMakefiles::
  428. X
  429. Xincludes::
  430. X
  431. X###########################################################################
  432. X# dependencies generated by makedepend
  433. X
  434. END_OF_FILE
  435. if test 12313 -ne `wc -c <'acm/fsim/Makefile'`; then
  436.     echo shar: \"'acm/fsim/Makefile'\" unpacked with wrong size!
  437. fi
  438. # end of 'acm/fsim/Makefile'
  439. fi
  440. if test -f 'acm/fsim/doViews.c' -a "${1}" != "-c" ; then 
  441.   echo shar: Will not clobber existing file \"'acm/fsim/doViews.c'\"
  442. else
  443. echo shar: Extracting \"'acm/fsim/doViews.c'\" \(12851 characters\)
  444. sed "s/^X//" >'acm/fsim/doViews.c' <<'END_OF_FILE'
  445. X/*
  446. X *    xflight : an aerial combat simulator for X
  447. X *
  448. X *    Written by Riley Rainey,  riley@mips.com
  449. X *
  450. X *    Permission to use, copy, modify and distribute (without charge) this
  451. X *    software, documentation, images, etc. is granted, provided that this 
  452. X *    comment and the author's name is retained.
  453. X *
  454. X */
  455. X#include "pm.h"
  456. X#include <math.h>
  457. X#include <stdio.h>
  458. X
  459. Xextern char *ItoA();
  460. Xextern void doDroneRadar(), doTEWS();
  461. Xextern void placeCraft();
  462. Xextern void doScale(), doCompassScale();
  463. X
  464. X#define lim    ((double) -1052500.0)
  465. X
  466. X#define MAXPOLYGONS    8192
  467. X
  468. Xstatic VPolygon *poly[MAXPOLYGONS];
  469. X
  470. Xstatic craft *sortList;
  471. X
  472. Xvoid insertCraft();
  473. X
  474. Xvoid doViews() {
  475. X
  476. X    int    polyCount;
  477. X    register unsigned long curPixel;
  478. X    register craft    *c, *p;
  479. X    register int    i, j, k;
  480. X    register viewer *q;
  481. X    VPoint         vp, fwd, up;
  482. X    VPoint        horiz[4];
  483. X    int        mono;
  484. X
  485. X/*
  486. X *  Build a vector of polygons for all objects in the scene.
  487. X *
  488. X *  This vector should be ordered from "most distant" to "closest" so that
  489. X *  the final display will end up correct.  Rather than generalizing this
  490. X *  to death, we'll use a few heuristics to get very close to what we need:
  491. X *
  492. X *  (0) Build a single polygon to represent the ground.
  493. X *  (1) Objects on the surface (stbl) are collected first.
  494. X *  (2) Planes and projectiles (ptbl and mtbl) are first sorted in descending
  495. X *      order by their distance from the observer and then polygons are
  496. X *    collected.
  497. X */
  498. X
  499. X
  500. X    for ((i=0, c=ptbl); i<MAXPLAYERS; (++i, ++c)) {
  501. X
  502. X    if (c->type == CT_DRONE)
  503. X        doDroneRadar (c);
  504. X
  505. X    if (c->type != CT_PLANE)
  506. X        continue;
  507. X
  508. X/*
  509. X *  Set up the eyespace transformation for this viewpoint
  510. X */
  511. X
  512. X    VTransform (&c->cinfo->viewPoint, &(c->trihedral), &vp);
  513. X    vp.x += c->Sg.x;
  514. X    vp.y += c->Sg.y;
  515. X    vp.z += c->Sg.z;
  516. X
  517. X    VTransform (&c->viewDirection, &(c->trihedral), &fwd);
  518. X    fwd.x += vp.x;
  519. X    fwd.y += vp.y;
  520. X    fwd.z += vp.z;
  521. X
  522. X    VTransform (&c->viewUp, &(c->trihedral), &up);
  523. X    up.x += vp.x;
  524. X    up.y += vp.y;
  525. X    up.z += vp.z;
  526. X
  527. X    VGetEyeSpace (c->vl->v, vp, fwd, up);
  528. X
  529. X    polyCount = 0;
  530. X    sortList = (craft *) NULL;
  531. X
  532. X    horiz[0].x = c->Sg.x - lim;
  533. X    horiz[0].y = c->Sg.y - lim;
  534. X    horiz[0].z = 0.0;
  535. X    horiz[1].x = c->Sg.x - lim;
  536. X    horiz[1].y = c->Sg.y + lim;
  537. X    horiz[1].z = 0.0;
  538. X    horiz[2].x = c->Sg.x + lim;
  539. X    horiz[2].y = c->Sg.y + lim;
  540. X    horiz[2].z = 0.0;
  541. X    horiz[3].x = c->Sg.x + lim;
  542. X    horiz[3].y = c->Sg.y - lim;
  543. X    horiz[3].z = 0.0;
  544. X    
  545. X    poly[0] = VCreatePolygon (4, &horiz[0], groundColor);
  546. X    polyCount = 1;
  547. X
  548. X    for ((j=0, p=stbl); j<MAXSURFACE; (++j, ++p)) {
  549. X        if (p->type != CT_FREE)
  550. X        insertCraft (c, p);
  551. X    }
  552. X
  553. X    for ((j=0, p=ptbl); j<MAXPLAYERS; (++j, ++p)) {
  554. X        if (p->type != CT_FREE && p != c) {
  555. X        insertCraft (c, p);
  556. X        }
  557. X    }
  558. X
  559. X    for ((j=0, p=mtbl); j<MAXPROJECTILES; (++j, ++p)) {
  560. X        if (p->type != CT_FREE)
  561. X        insertCraft (c, p);
  562. X    }
  563. X
  564. X    for (p=sortList; p != (craft *) NULL; p=(craft *)p->next)
  565. X        placeCraft (p, poly, &polyCount);
  566. X
  567. X/*
  568. X *  Clip all polygons
  569. X */
  570. X
  571. X        for (j=0; j<polyCount; ++j) {
  572. X            VTransformPolygon (poly[j], &(c->vl->v->eyeSpace));
  573. X            poly[j] = VClipPolygon(poly[j], c->vl->v->clipPoly);
  574. X    }
  575. X
  576. X/*
  577. X *  Display this image for each viewer associated with this craft
  578. X */
  579. X
  580. X    for (q=c->vl; q != NULL; q = q->next) {
  581. X
  582. X            mono = q->v->flags & VPMono;
  583. X        curPixel = -1;
  584. X            for (j=0; j<polyCount; ++j) {
  585. X                if (poly[j]) {
  586. X                    if (mono == 0 &&
  587. X            curPixel != (k=q->v->pixel[poly[j]->color->index]))
  588. X            {
  589. X                        XSetForeground (q->dpy, q->gc, k);
  590. X                        curPixel = k;
  591. X                    }
  592. X            if (mono)
  593. X            VDrawPolygon (q->v, q->win, q->gc, poly[j]);
  594. X            else
  595. X            VFillPolygon (q->v, q->win, q->gc, poly[j]);
  596. X                }
  597. X
  598. X           }
  599. X
  600. X/*  Draw Head-Up Display and instrument panel */
  601. X
  602. X        doHUD(c, q);
  603. X        doRadar (c, q);
  604. X        doTEWS (c, q);        /* doRadar must be called first */
  605. X        doRPM(c, q);
  606. X        doPanel (c,q);
  607. X
  608. X/*  Expose the completed drawing  */
  609. X
  610. X            VExposeBuffer (q->v, q->gc);
  611. X
  612. X/*
  613. X * Erase the un-displayed planes.
  614. X */
  615. X
  616. X        if (mono == 0) {
  617. X                curPixel = *(q->v->pixel);
  618. X                XSetForeground (q->dpy, q->gc, curPixel);
  619. X#ifdef USE_PIXMAP_ANIMATION
  620. X        if (q->v->flags & VPPixmap)
  621. X            XFillRectangle (q->dpy, q->v->monoPixmap, q->gc,
  622. X                0, 0, q->v->width, q->v->height);
  623. X        else
  624. X#endif
  625. X                    XFillRectangle (q->dpy, q->win, q->gc,
  626. X                0, 0, q->width, q->height);
  627. X        }
  628. X
  629. X    }
  630. X
  631. X/*
  632. X *  Release polygons
  633. X */
  634. X
  635. X        for (j=0; j<polyCount; ++j)
  636. X            if (poly[j])
  637. X            VDestroyPolygon (poly[j]);
  638. X
  639. X    }
  640. X}
  641. X
  642. X/*
  643. X *  insertCraft :  Insert a craft into sortList in descending order.
  644. X */
  645. X
  646. Xvoid insertCraft (c, p)
  647. Xcraft *c, *p; {
  648. X
  649. X    double dist, offset;
  650. X    VPoint ds;
  651. X    craft  *q, *prev;
  652. X
  653. X/*
  654. X *  Here's a kludge for you:  to avoid polygon clipping, I'm going to 
  655. X *  cheat and hack a way to get ground objects to display properly.
  656. X *  if the Z coordinate of an object is zero (i.e. on ground objects),
  657. X *  I'll add a huge offset to their distance values to force them to be
  658. X *  plotted first -- and in roughly their correct drawing order.
  659. X *
  660. X */
  661. X
  662. X    offset = (p->Sg.z == 0.0) ? 1000.0 * NM : 0.0;
  663. X
  664. X    ds.x = p->Sg.x - c->Sg.x;
  665. X    ds.y = p->Sg.y - c->Sg.y;
  666. X    ds.z = p->Sg.z - c->Sg.z;
  667. X    p->order = dist = mag (ds) + offset;
  668. X
  669. X    if (sortList != (craft *) NULL) {
  670. X        for ((q=sortList, prev=(craft *) NULL); q != (craft *) NULL;) {
  671. X        if (q->order < dist) {
  672. X        p->next = (struct _craft *) q;
  673. X        if (prev == (craft *) NULL)
  674. X            sortList = p;
  675. X        else
  676. X            prev->next = (struct _craft *) p;
  677. X        break;
  678. X        }
  679. X        prev = q;
  680. X        q = (craft *) q->next;
  681. X        }
  682. X        if (q == (craft *) NULL) {
  683. X        prev->next = (struct _craft *) p;
  684. X        p->next = (struct _craft *) NULL;
  685. X        }
  686. X    }
  687. X    else {
  688. X        sortList = p;
  689. X        p->next = (struct _craft *) NULL;
  690. X    }
  691. X}
  692. X
  693. Xint doHUD (c, u)
  694. Xcraft  *c;
  695. Xviewer *u; {
  696. X
  697. X    char    buffer[80];
  698. X    int    i, x, x1, y;
  699. X    Drawable d;
  700. X
  701. X    d = (u->v->flags & VPMono) ? (Drawable) u->v->monoPixmap :
  702. X        (Drawable) u->win;
  703. X
  704. X    if (c->viewDirection.x < 0.90)
  705. X        return 0;
  706. X    XSetFont (u->dpy, u->gc, u->font->fid);
  707. X    if (u->v->flags & VPMono)
  708. X        XSetForeground (u->dpy, u->gc,
  709. X                BlackPixel(u->v->dpy, u->v->screen));
  710. X    else
  711. X        XSetForeground (u->dpy, u->gc, u->v->pixel[HUDPixel]);
  712. X    sprintf (buffer, "a=%.1f", RADtoDEG(c->alpha));
  713. X    x = 730 * u->width / VIEW_WINDOW_WIDTH;
  714. X    y = 130 * u->height / VIEW_WINDOW_HEIGHT;
  715. X    XDrawString (u->dpy, d, u->gc, x, y, buffer, strlen(buffer));
  716. X
  717. X    x1 = 410 * u->width / VIEW_WINDOW_WIDTH;
  718. X    sprintf (buffer, "%4.1f", c->G.z);
  719. X    XDrawString (u->dpy, d, u->gc, x1, y, buffer, strlen(buffer));    
  720. X
  721. X    y = 390 * u->height / VIEW_WINDOW_HEIGHT;
  722. X    sprintf (buffer, "%7d", (int)(-c->Cg.z * 60.0));
  723. X    XDrawString (u->dpy, d, u->gc, x, y, buffer, strlen(buffer));
  724. X
  725. X    x = 410 * u->width / VIEW_WINDOW_WIDTH;
  726. X    doCompassScale (u->dpy, d, u->gc, &(u->hdgScale), RADtoDEG(c->curHeading)*100.0,
  727. X        u->fth, u->ftw);
  728. X    doScale (u->dpy, d, u->gc, &(u->altScale), -c->Sg.z, u->fth, u->ftw);
  729. X    doScale (u->dpy, d, u->gc, &(u->velScale), FPStoKTS(mag(c->Cg)),
  730. X        u->fth, u->ftw);
  731. X
  732. X    sprintf (buffer, "%3d%% %s", (int)((double)c->throttle/327.68),
  733. X        (c->flags & FL_AFTERBURNER) ? "AB" : "");
  734. X    XDrawString (u->dpy, d, u->gc, x, y, buffer, strlen(buffer));
  735. X
  736. X    x = 380 * u->width / VIEW_WINDOW_WIDTH;
  737. X    y = 420 * u->height / VIEW_WINDOW_HEIGHT;
  738. X
  739. X    doLadder (c, u);
  740. X
  741. X    for (i=0; i<3; ++i) {
  742. X        XDrawString (u->dpy, d, u->gc, x, y, c->leftHUD[i],
  743. X            strlen (c->leftHUD[i]));
  744. X        y += u->fth;
  745. X    }
  746. X
  747. X    return 0;
  748. X
  749. X}
  750. X
  751. X
  752. Xint    doLadder (c, u)
  753. Xcraft *c;
  754. Xviewer *u;{
  755. X
  756. X    double         x = c->curPitch, cx, s;
  757. X    double        sinP, cosP, pixelsPerDegree;
  758. X    XSegment    seg[24];
  759. X    XRectangle    rect[1];
  760. X    int        i, rung, windX, windY, w, tx, ty;
  761. X    char        buf[16];
  762. X    VPoint        tmp;
  763. X    Drawable d;
  764. X
  765. X    double L_half_width = 90.0 * u->scaleFactor;
  766. X    double L_end = 25.0 * u->scaleFactor;
  767. X    double L_major_tick_interval = 10.0;
  768. X    double L_major_tick_height = 90.0 * u->scaleFactor;
  769. X
  770. X    d = (u->v->flags & VPMono) ? (Drawable) u->v->monoPixmap :
  771. X        (Drawable) u->win;
  772. X
  773. X    rect[0].x = u->xCenter - (int) (125.0 * u->scaleFactor + 0.5);
  774. X    rect[0].y = u->yCenter - (int) (110.0 * u->scaleFactor + 0.5);
  775. X    rect[0].width = 250.0 * u->scaleFactor + 0.5;
  776. X    rect[0].height = 220.0 * u->scaleFactor + 0.5;
  777. X
  778. X    s = ((int)(RADtoDEG(x)) / 10 * 10) - 20;
  779. X    rung = s;
  780. X
  781. X    pixelsPerDegree = L_major_tick_height / L_major_tick_interval;
  782. X    cx = (RADtoDEG(x) - s) * pixelsPerDegree;
  783. X    sinP = cos(c->curRoll);
  784. X    cosP = sin(c->curRoll);
  785. X    for (i=0; i<5; ++i, cx -= L_major_tick_height, rung +=10) {
  786. X        seg[i*2].x1 = L_half_width * sinP + cx * cosP + u->xCenter;
  787. X        seg[i*2].y1 = -L_half_width * cosP + cx * sinP + u->yCenter;
  788. X        seg[i*2].x2 =  L_end * sinP + cx * cosP + u->xCenter;
  789. X        seg[i*2].y2 = -L_end * cosP + cx * sinP + u->yCenter;
  790. X        seg[i*2+1].x1 = -L_end * sinP + cx * cosP + u->xCenter;
  791. X        seg[i*2+1].y1 = L_end * cosP + cx * sinP + u->yCenter;
  792. X        seg[i*2+1].x2 =  -L_half_width * sinP + cx * cosP + u->xCenter;
  793. X        seg[i*2+1].y2 = L_half_width * cosP + cx * sinP + u->yCenter;
  794. X        sprintf (buf, "%d", rung);
  795. X        if (seg[i*2].x1 >= rect[0].x && seg[i*2].x1 <
  796. X            rect[0].x+rect[0].width &&
  797. X            seg[i*2].y1 >= rect[0].y && seg[i*2].y1 <
  798. X            rect[0].y+rect[0].height)
  799. X            XDrawString (u->dpy, d, u->gc, 
  800. X                seg[i*2].x1 + 2, seg[i*2].y1 + 5,
  801. X                buf, strlen(buf));
  802. X    }
  803. X
  804. X    i = i * 2;
  805. X
  806. X    XSetClipRectangles (u->dpy, u->gc, 0, 0, rect, 1, YXBanded);
  807. X
  808. X/*
  809. X *  Determine the location of the flight path marker
  810. X */
  811. X
  812. X    VTransform (&c->Cg, &c->Itrihedral, &tmp);
  813. X    if (mag(c->Cg) == 0.0 || tmp.x == 0.0) {
  814. X        windX = u->xCenter;
  815. X        windY = u->yCenter;
  816. X    }
  817. X    else {
  818. X        windX = u->xCenter + tmp.y * u->v->Scale.x / tmp.x + 0.5;
  819. X        windY = u->yCenter + tmp.z * u->v->Scale.y / tmp.x + 0.5;
  820. X    }
  821. X
  822. X    seg[i].x1 = windX - 18;
  823. X    seg[i].y1 = windY;
  824. X    seg[i].x2 = windX - 9;
  825. X    seg[i++].y2 = windY;
  826. X
  827. X    seg[i].x1 = windX + 18;
  828. X    seg[i].y1 = windY;
  829. X    seg[i].x2 = windX + 9;
  830. X    seg[i++].y2 = windY;
  831. X
  832. X    seg[i].x1 = windX;
  833. X    seg[i].y1 = windY - 9;
  834. X    seg[i].x2 = windX;
  835. X    seg[i++].y2 = windY - 15;
  836. X
  837. X/*
  838. X *  Gether weapon display info (and maybe draw a reticle).
  839. X */
  840. X
  841. X    doWeaponDisplay (c, u);
  842. X
  843. X/*
  844. X *  Draw a target designator around the current primary radar target.
  845. X */
  846. X
  847. X    if (c->curRadarTarget >= 0) {
  848. X
  849. X        w = DESIGNATOR_SIZE * u->height / VIEW_WINDOW_HEIGHT * 0.5;
  850. X
  851. X        VTransform (&(ptbl[c->curRadarTarget].Sg),
  852. X            &u->v->eyeSpace, &tmp);
  853. X
  854. X/* radar target is assumed to be ahead of us (tmp.z > 0.0) */
  855. X        
  856. X        tx = u->v->Middl.x + tmp.x * u->v->Scale.x / tmp.z;
  857. X        ty = u->v->Middl.y - tmp.y * u->v->Scale.y / tmp.z;
  858. X
  859. X        seg[i].x1 = tx - w;
  860. X        seg[i].y1 = ty - w;
  861. X        seg[i].x2 = tx + w;
  862. X        seg[i++].y2 = ty - w;
  863. X
  864. X        seg[i].x1 = tx + w;
  865. X        seg[i].y1 = ty - w;
  866. X        seg[i].x2 = tx + w;
  867. X        seg[i++].y2 = ty + w;
  868. X
  869. X        seg[i].x1 = tx + w;
  870. X        seg[i].y1 = ty + w;
  871. X        seg[i].x2 = tx - w;
  872. X        seg[i++].y2 = ty + w;
  873. X
  874. X        seg[i].x1 = tx - w;
  875. X        seg[i].y1 = ty + w;
  876. X        seg[i].x2 = tx - w;
  877. X        seg[i++].y2 = ty - w;
  878. X    }
  879. X
  880. X    XDrawSegments (u->dpy, d, u->gc, seg, i);
  881. X    XDrawArc (u->dpy, d, u->gc, u->xCenter-2, u->yCenter-2, 4, 4, 0, 360*64);
  882. X    XDrawArc (u->dpy, d, u->gc, windX-8, windY-8, 16, 16, 0, 360*64);
  883. X
  884. X    XSetClipMask (u->dpy, u->gc, None);
  885. X
  886. X    return 0;
  887. X}
  888. X
  889. Xint    doRPM (c, u)
  890. Xcraft *c;
  891. Xviewer *u;{
  892. X
  893. X    int    x, y, x1, y1, len, i;
  894. X    double  percent, p;
  895. X    char    s[32], s1[32];
  896. X
  897. X    x = ENG_X * u->width / FS_WINDOW_WIDTH;
  898. X    y = ENG_Y * u->width / FS_WINDOW_WIDTH;
  899. X    len = (eng_x_hot - 6)* u->width / FS_WINDOW_WIDTH;
  900. X
  901. X    XSetForeground (u->dpy, u->gc, u->v->flags & VPMono ?
  902. X            WhitePixel(u->v->dpy, u->v->screen) :
  903. X            u->v->pixel[whitePixel]);
  904. X    XSetBackground (u->dpy, u->gc, u->v->flags & VPMono ?
  905. X            BlackPixel(u->v->dpy, u->v->screen) :
  906. X            u->v->pixel[blackPixel]);
  907. X    XCopyPlane (u->dpy, u->eng, u->win, u->gc, 0, 0, eng_width,eng_height,
  908. X        x - eng_x_hot, y - eng_y_hot, 1);
  909. X
  910. X    if (isFunctioning (c, SYS_ENGINE1))
  911. X        percent = (double) c->throttle / 32768.0 * 100.0;
  912. X    else
  913. X        percent = 0.0;
  914. X    if (percent < 60.0) {
  915. X        p = (60.0 - percent) / 120.0 * pi;
  916. X        x1 = x + len * cos(p);
  917. X        y1 = y - len * sin(p);
  918. X    }
  919. X    else {
  920. X        p = (percent - 60.0) / 40.0 * pi;
  921. X        x1 = x + len * cos(p);
  922. X        y1 = y + len * sin(p); 
  923. X    }
  924. X
  925. X    XDrawLine (u->dpy, u->win, u->gc, x, y, x1, y1);
  926. X
  927. X/*
  928. X *  Print Fuel and Fuel consumption rate
  929. X */
  930. X
  931. X    XSetBackground (u->dpy, u->gc, BlackPixel(u->v->dpy, u->v->screen));
  932. X
  933. X    sprintf (s, "%7s lbs Total", ItoA ((int) c->fuel, s1));
  934. X    XDrawImageString (u->dpy, u->win, u->gc, x-30, y+68, s, strlen(s));
  935. X    sprintf (s, "%7s lbs/hour", ItoA ((int) (fuelUsed(c)*3600.0/deltaT), s1));
  936. X    XDrawImageString (u->dpy, u->win, u->gc, x-30, y+68+u->fth, s, strlen(s));
  937. X
  938. X/*
  939. X *  Display Flap Setting
  940. X */
  941. X
  942. X    if (c->flapSetting > DEGtoRAD(29.0))
  943. X        i=3;
  944. X    else if (c->flapSetting > DEGtoRAD(19.0))
  945. X        i=2;
  946. X    else if (c->flapSetting > DEGtoRAD(9.0))
  947. X        i=1;
  948. X    else
  949. X        i=0;
  950. X
  951. X    x = FLAP_X * u->width / FS_WINDOW_WIDTH;
  952. X    y = FLAP_Y * u->width / FS_WINDOW_WIDTH;
  953. X
  954. X    XCopyPlane (u->dpy, u->flap[i], u->win, u->gc, 0, 0, flaps0_width,
  955. X        flaps0_height, x, y, 1);
  956. X    sprintf (s, "Flaps: %d", (int) RADtoDEG(c->curFlap));
  957. X    XDrawImageString (u->dpy, u->win, u->gc, x+flaps0_x_hot, y+flaps0_y_hot,
  958. X        s, strlen(s));
  959. X
  960. X    return 0;
  961. X}
  962. END_OF_FILE
  963. if test 12851 -ne `wc -c <'acm/fsim/doViews.c'`; then
  964.     echo shar: \"'acm/fsim/doViews.c'\" unpacked with wrong size!
  965. fi
  966. # end of 'acm/fsim/doViews.c'
  967. fi
  968. if test -f 'acm/fsim/newPlayer.c' -a "${1}" != "-c" ; then 
  969.   echo shar: Will not clobber existing file \"'acm/fsim/newPlayer.c'\"
  970. else
  971. echo shar: Extracting \"'acm/fsim/newPlayer.c'\" \(13579 characters\)
  972. sed "s/^X//" >'acm/fsim/newPlayer.c' <<'END_OF_FILE'
  973. X/*
  974. X *    xflight : an aerial combat simulator for X
  975. X *
  976. X *    Written by Riley Rainey,  riley@mips.com
  977. X *
  978. X *    Permission to use, copy, modify and distribute (without charge) this
  979. X *    software, documentation, images, etc. is granted, provided that this 
  980. X *    comment and the author's name is retained.
  981. X *
  982. X */
  983. X#include "pm.h"
  984. X#include <stdio.h>
  985. X#include <X11/Xutil.h>
  986. X#ifndef hpux
  987. X#include <X11/Xos.h>
  988. X#endif
  989. X#include <X11/cursorfont.h>
  990. X
  991. X#define BORDER    1
  992. X
  993. X#ifdef dec
  994. X#define FONT            "courier_18"
  995. X#else
  996. X#if SunOSPlatform
  997. X#define FONT            "9x15"
  998. X#else
  999. X#define FONT            "*courier-bold-r-normal--17*"
  1000. X#endif
  1001. X#endif
  1002. X
  1003. X#define    ARG_FONT        "font"
  1004. X#define ARG_RADAR_FONT        "radarFont"
  1005. X#define    ARG_BORDER_COLOR    "borderColor"
  1006. X#define ARG_BORDER        "borderWidth"
  1007. X#define    ARG_GEOMETRY        "geometry"
  1008. X#define DEFAULT_BACKGROUND    "#93bde4"    /* my version of sky blue */
  1009. X#define DEFAULT_BORDER        "black"
  1010. X#define DEFAULT_RADAR_FONT    "fixed"
  1011. X
  1012. X#define SW_BORDER    1
  1013. X#define SW_BACKGROUND    2
  1014. X#define SW_HUDFONT    3
  1015. X#define SW_GEOM        4
  1016. X#define SW_RADARFONT    5
  1017. X#define SW_TEAM        6
  1018. X#define SW_OBSERVE    7
  1019. X
  1020. Xstruct {
  1021. X    char    *sw;
  1022. X    int    value;
  1023. X    }    swt[] = {
  1024. X    "-bw", SW_BORDER,
  1025. X    "-skycolor", SW_BACKGROUND,
  1026. X    "-hudfont",  SW_HUDFONT,
  1027. X    "-radarfont",SW_RADARFONT,
  1028. X    "-geometry", SW_GEOM,
  1029. X    "-team",     SW_TEAM,
  1030. X    "-chase",    SW_OBSERVE,
  1031. X    NULL, 0}, *swp;
  1032. X
  1033. Xvoid    recoverAcmArgv (args, argc, argv)
  1034. Xchar    *args;
  1035. Xint    *argc;
  1036. Xchar    *argv[]; {
  1037. X
  1038. X    char *s;
  1039. X
  1040. X    argv[0] = ACM;
  1041. X    argv[1] = args;
  1042. X
  1043. X    if (*args == '\0') {
  1044. X        *argc = 1;
  1045. X        argv[1] = (char *) NULL;
  1046. X        return;
  1047. X    }
  1048. X    else
  1049. X        *argc = 2;
  1050. X
  1051. X    for (s=args; *s;) {
  1052. X        if (*s == '|') {
  1053. X            *s = '\0';
  1054. X            argv[(*argc)++] = ++s;
  1055. X        }
  1056. X        else
  1057. X            ++s;
  1058. X    }
  1059. X
  1060. X    argv[*argc] = (char *) NULL;
  1061. X}
  1062. X
  1063. Xint    newPlayer(s, display, logname, switches)
  1064. Xint    s;
  1065. Xchar    *display;
  1066. Xchar    *logname;
  1067. Xchar    *switches; {
  1068. X
  1069. X    char       *fontName;    /* Name of font for string */
  1070. X    XSizeHints    xsh;        /* Size hints for window manager */
  1071. X    Colormap    cmap;
  1072. X    GC        curGC;
  1073. X    XGCValues    gcv;
  1074. X    unsigned long pad;        /* Font size parameters */
  1075. X    unsigned long bd;        /* Pixel values */
  1076. X    unsigned long bw;        /* Border width */
  1077. X    char       *tempstr;    /* Temporary string */
  1078. X    XColor      color;        /* Temporary color */
  1079. X    char       *geomSpec;    /* Window geometry string */
  1080. X    XSetWindowAttributes xswa;    /* Temporary Set Window Attribute struct */
  1081. X    XWMHints    xwmh;        /* Window manager hints */
  1082. X    Cursor    cursor;
  1083. X    char    **c;
  1084. X    char    err[64];
  1085. X    static char    *background = NULL;
  1086. X    int        borderWidth = -1;
  1087. X    int        player;
  1088. X    viewer    *u;
  1089. X    craft    *cf;
  1090. X    double    scale;
  1091. X    int        argc;
  1092. X    char    *argv[32];
  1093. X    int        screen, mono;
  1094. X    char    *hudfont = NULL, *radarfont = NULL;
  1095. X    int        team = 1;
  1096. X    char    *plane;        /* name of plane type */
  1097. X    int        observer = -1;
  1098. X
  1099. X    recoverAcmArgv (switches, &argc, argv);
  1100. X
  1101. X    geomSpec = NULL;
  1102. X    u = (viewer *) malloc (sizeof(viewer));
  1103. X
  1104. X/*
  1105. X *  Parse command line
  1106. X */
  1107. X
  1108. X    for (c = &argv[1]; *c != (char *) NULL; ++c)
  1109. X    if (**c == '-') {
  1110. X        for (swp = &swt[0]; swp->value != 0; ++swp)
  1111. X        if (strcmp (swp->sw, *c) == 0) {
  1112. X
  1113. X            switch (swp->value) {
  1114. X
  1115. X            case SW_GEOM: 
  1116. X                geomSpec = *(++c);
  1117. X                break;
  1118. X
  1119. X            case SW_BORDER:
  1120. X                borderWidth = atoi (*(++c));
  1121. X                break;
  1122. X
  1123. X            case SW_BACKGROUND:
  1124. X                background = *(++c);
  1125. X                break;
  1126. X
  1127. X            case SW_HUDFONT:
  1128. X                hudfont = *(++c);
  1129. X                break;
  1130. X
  1131. X            case SW_RADARFONT:
  1132. X                radarfont = *(++c);
  1133. X                break;
  1134. X
  1135. X            case SW_TEAM:
  1136. X                team = atoi (*(++c));
  1137. X                break;
  1138. X
  1139. X            case SW_OBSERVE:
  1140. X                observer = atoi (*(++c));
  1141. X                break;
  1142. X            }
  1143. X                break;
  1144. X        }
  1145. X        if (swp->value == 0) {
  1146. X        free ((char *) u);
  1147. X        sprintf (err, "%s: invalid switch %s", ACM, *c);
  1148. X        write (s, err, strlen(err));
  1149. X        exit (1);
  1150. X        }
  1151. X    }
  1152. X
  1153. X    if (team == 1)
  1154. X    plane = "f-16c";
  1155. X    else
  1156. X    plane = "mig-23";
  1157. X
  1158. X    if ((player = newPlane (plane)) < 0) {
  1159. X    sprintf (err, "Sorry, acm is popular -- no room for \
  1160. Xany more players at this moment.\n");
  1161. X    write (s, err, strlen(err));
  1162. X    return -1;
  1163. X    }
  1164. X
  1165. X/*
  1166. X *  assign a (kludged) team location.
  1167. X */
  1168. X
  1169. X    if (team == 2) {
  1170. X    ptbl[player].Sg.x = -0.6 * NM + 110.0;
  1171. X    ptbl[player].Sg.y = 49.0 * NM;
  1172. X    }
  1173. X
  1174. X    if ((u->dpy = XOpenDisplay(display)) == (Display *) NULL) {
  1175. X    free ((char *) u);
  1176. X    ptbl[player].type = CT_FREE;
  1177. X    sprintf(err, "%s: can't open %s\n", ACM, display);
  1178. X    write (s, err, strlen(err));
  1179. X    return -1;
  1180. X    }
  1181. X    screen = DefaultScreen (u->dpy);
  1182. X    mono = (DisplayPlanes (u->dpy, screen) == 1) ? 1 : 0;
  1183. X
  1184. X    if (hudfont)
  1185. X     fontName = hudfont;
  1186. X    else if ((fontName = XGetDefault(u->dpy, ACM, ARG_FONT)) == NULL) {
  1187. X    fontName = FONT;
  1188. X    }
  1189. X    if ((u->font = XLoadQueryFont(u->dpy, fontName)) == NULL) {
  1190. X    XCloseDisplay (u->dpy);
  1191. X    free ((char *) u);
  1192. X    ptbl[player].type = CT_FREE;
  1193. X    sprintf(err, "%s: display %s doesn't know font %s\n",
  1194. X        ACM, display, fontName);
  1195. X    write (s, err, strlen(err));
  1196. X    return -1;
  1197. X    }
  1198. X    u->fth = u->font->max_bounds.ascent + u->font->max_bounds.descent;
  1199. X    u->ftw = u->font->max_bounds.width;
  1200. X
  1201. X    if (radarfont)
  1202. X     fontName = radarfont;
  1203. X    else if ((fontName = XGetDefault(u->dpy, ACM, ARG_RADAR_FONT)) == NULL) {
  1204. X    fontName = DEFAULT_RADAR_FONT;
  1205. X    }
  1206. X    if ((u->rfont = XLoadQueryFont(u->dpy, fontName)) == NULL) {
  1207. X    XCloseDisplay (u->dpy);
  1208. X    free ((char *) u);
  1209. X    ptbl[player].type = CT_FREE;
  1210. X    sprintf(err, "%s: display %s doesn't know font %s\n",
  1211. X        ACM, display, fontName);
  1212. X    write (s, err, strlen(err));
  1213. X    return -1;
  1214. X    }
  1215. X    u->rfth = u->rfont->max_bounds.ascent + u->rfont->max_bounds.descent;
  1216. X    u->rftw = u->rfont->max_bounds.width;
  1217. X
  1218. X/*
  1219. X * Select colors for the border, the window background, and the
  1220. X * foreground.  We use the default colormap to allocate the colors in.
  1221. X */
  1222. X
  1223. X    cmap = DefaultColormap(u->dpy, screen);
  1224. X
  1225. X    if (background == NULL)
  1226. X    background = DEFAULT_BACKGROUND;
  1227. X
  1228. X    if ((tempstr = XGetDefault(u->dpy, ACM, ARG_BORDER_COLOR)) == NULL)
  1229. X    tempstr = DEFAULT_BORDER;
  1230. X    if (XParseColor(u->dpy, cmap, tempstr, &color) == 0) {
  1231. X    XCloseDisplay (u->dpy);
  1232. X    free ((char *) u);
  1233. X    ptbl[player].type = CT_FREE;
  1234. X    sprintf (err, "Can't get border color %s\n", tempstr);
  1235. X    write (s, err, strlen(err));
  1236. X    return -1;
  1237. X    }
  1238. X
  1239. X    if (mono)
  1240. X    bd = BlackPixel (u->dpy, screen);
  1241. X    else {
  1242. X        if (XAllocColor(u->dpy, cmap, &color) == 0) {
  1243. X        XCloseDisplay (u->dpy);
  1244. X        free ((char *) u);
  1245. X        ptbl[player].type = CT_FREE;
  1246. X        sprintf (err, "Cannot allocate color cells\n");
  1247. X        write (s, err, strlen(err));
  1248. X        return -1;
  1249. X    }
  1250. X    bd = color.pixel;
  1251. X    }
  1252. X
  1253. X/*
  1254. X * Set the border width of the window, and the gap between the text
  1255. X * and the edge of the window, "pad".
  1256. X */
  1257. X
  1258. X    pad = BORDER;
  1259. X    if (borderWidth >= 0)
  1260. X    bw = borderWidth;
  1261. X    else if ((tempstr = XGetDefault(u->dpy, ACM, ARG_BORDER)) == NULL)
  1262. X    bw = 1;
  1263. X    else
  1264. X    bw = atoi(tempstr);
  1265. X
  1266. X/*
  1267. X * Deal with providing the window with an initial position & size.
  1268. X * Fill out the XSizeHints struct to inform the window manager.
  1269. X */
  1270. X
  1271. X    if (geomSpec == NULL)
  1272. X        geomSpec = XGetDefault(u->dpy, ACM, ARG_GEOMETRY);
  1273. X
  1274. X/*
  1275. X * If the defaults database doesn't contain a specification of the
  1276. X * initial size & position - fit the window to the text and locate
  1277. X * it in the center of the screen.
  1278. X */
  1279. X
  1280. X    if (geomSpec == NULL) {
  1281. X    xsh.flags = PPosition | PSize;
  1282. X    xsh.height = FS_WINDOW_HEIGHT;
  1283. X    xsh.width =  FS_WINDOW_WIDTH;
  1284. X    xsh.x = (DisplayWidth(u->dpy, screen) - xsh.width) / 2;
  1285. X    xsh.y = (DisplayHeight(u->dpy, screen) - xsh.height) / 2;
  1286. X    }
  1287. X    else {
  1288. X    int         bitmask;
  1289. X
  1290. X    bzero((char *) &xsh, sizeof(xsh));
  1291. X    bitmask = XGeometry(u->dpy, screen, geomSpec, geomSpec,
  1292. X                bw, u->ftw, u->fth, pad, pad, &(xsh.x), &(xsh.y),
  1293. X                &(xsh.width), &(xsh.height));
  1294. X    if (bitmask & (XValue | YValue)) {
  1295. X        xsh.flags |= USPosition;
  1296. X    }
  1297. X    if (bitmask & (WidthValue | HeightValue)) {
  1298. X        xsh.flags |= USSize;
  1299. X    }
  1300. X    }
  1301. X
  1302. X/*
  1303. X * Create the Window with the information in the XSizeHints, the
  1304. X * border width,  and the border & background pixels.
  1305. X */
  1306. X
  1307. X    u->win = XCreateSimpleWindow(u->dpy, DefaultRootWindow(u->dpy),
  1308. X                  xsh.x, xsh.y, xsh.width, xsh.height,
  1309. X                  bw, bd, bd);
  1310. X
  1311. X    scale = (double) xsh.width / (double) FS_WINDOW_WIDTH;
  1312. X
  1313. X/*
  1314. X * Create a pixmap of the engine RPM gauge and flap indicators.
  1315. X */
  1316. X
  1317. X    u->eng = XCreateBitmapFromData (u->dpy, u->win, eng_bits, eng_width,
  1318. X    eng_height);
  1319. X    u->flap[0] = XCreateBitmapFromData (u->dpy, u->win, flaps0_bits,
  1320. X    flaps0_width, flaps0_height);
  1321. X    u->flap[1] = XCreateBitmapFromData (u->dpy, u->win, flaps1_bits,
  1322. X    flaps1_width, flaps1_height);
  1323. X    u->flap[2] = XCreateBitmapFromData (u->dpy, u->win, flaps2_bits,
  1324. X    flaps2_width, flaps2_height);
  1325. X    u->flap[3] = XCreateBitmapFromData (u->dpy, u->win, flaps3_bits,
  1326. X    flaps3_width, flaps3_height);
  1327. X
  1328. X/*
  1329. X * Set the standard properties and hints for the window managers.
  1330. X */
  1331. X
  1332. X    XSetStandardProperties(u->dpy, u->win, ACM, ACM, None, argv, argc, &xsh);
  1333. X    xwmh.flags = InputHint | StateHint;
  1334. X    xwmh.input = True;
  1335. X    xwmh.initial_state = NormalState;
  1336. X    XSetWMHints(u->dpy, u->win, &xwmh);
  1337. X    cursor = XCreateFontCursor (u->dpy, XC_tcross);
  1338. X    XDefineCursor (u->dpy, u->win, cursor);
  1339. X
  1340. X    xsh.width = RADAR_WINDOW_WIDTH * scale;
  1341. X    xsh.height = RADAR_WINDOW_HEIGHT * scale;
  1342. X    xsh.x = RADAR_X * scale;
  1343. X    xsh.y = RADAR_Y * scale;
  1344. X    u->rwin = XCreateWindow (u->dpy, u->win, xsh.x, xsh.y, xsh.width,
  1345. X    xsh.height, 0, CopyFromParent, CopyFromParent, CopyFromParent,
  1346. X    0, NULL);
  1347. X
  1348. X/*
  1349. X * Ensure that the window's colormap field points to the default
  1350. X * colormap,  so that the window manager knows the correct colormap to
  1351. X * use for the window.  Also,  set the window's Bit
  1352. X * Gravity to reduce Expose events.
  1353. X */
  1354. X
  1355. X    xswa.colormap = DefaultColormap(u->dpy, screen);
  1356. X    xswa.bit_gravity = NorthWestGravity;
  1357. X    XChangeWindowAttributes(u->dpy, u->win, (CWColormap | CWBitGravity), &xswa);
  1358. X
  1359. X/*
  1360. X * Create the GC for drawing the picture.
  1361. X */
  1362. X
  1363. X    gcv.font = u->font->fid;
  1364. X    curGC = XCreateGC(u->dpy, u->win, GCFont, &gcv);
  1365. X    XSelectInput(u->dpy, u->win, KeyPressMask | ButtonPressMask |
  1366. X    StructureNotifyMask | ButtonReleaseMask);
  1367. X
  1368. X/*
  1369. X *  Fill-in the viewer structure
  1370. X */
  1371. X
  1372. X    cf = &ptbl[player];
  1373. X    cf->team = player;
  1374. X    cf->vl = u;
  1375. X    strncpy (cf->name, logname, sizeof (cf->name));
  1376. X    strncpy (cf->display, display, sizeof (cf->display));
  1377. X    u->next = (viewer *) NULL;
  1378. X    u->width = VIEW_WINDOW_WIDTH * scale;
  1379. X    u->height = VIEW_WINDOW_HEIGHT * scale;
  1380. X    u->xCenter = u->width / 2;
  1381. X    u->yCenter = u->height / 2;
  1382. X
  1383. X    u->radarWidth = RADAR_WINDOW_WIDTH * scale;
  1384. X    u->radarHeight = RADAR_WINDOW_HEIGHT * scale;
  1385. X    u->gc = curGC;
  1386. X
  1387. X    u->TEWSx = TEWS_X * scale;
  1388. X    u->TEWSy = TEWS_Y * scale;
  1389. X    u->TEWSSize = TEWS_SIZE * scale;
  1390. X    u->scaleFactor = scale;
  1391. X
  1392. X#ifdef USE_PIXMAP_ANIMATION
  1393. X    if (mono == 0)
  1394. X    usePixmaps = 1;
  1395. X#endif
  1396. X
  1397. X    u->v = VOpenViewport (u->dpy, screen, u->win,
  1398. X    12.0*25.4/1000.0, 0.5, scale * 0.70, u->width, u->height);
  1399. X
  1400. X    if (VBindColors (u->v, background) < 0) {
  1401. X    XCloseDisplay (u->dpy);
  1402. X    free ((char *) u);
  1403. X    ptbl[player].type = CT_FREE;
  1404. X    sprintf (err, "Error in binding colors.\n");
  1405. X    write (s, err, strlen(err));
  1406. X    return -1;
  1407. X    }
  1408. X
  1409. X/*
  1410. X *  Fill in the scale structures for the airspeed/altitude HUD scales.
  1411. X */
  1412. X
  1413. X    u->altScale.xorg = ALT_ORG_X * scale;
  1414. X    u->altScale.yorg = ALT_ORG_Y * scale;
  1415. X    u->altScale.length = ALT_LENGTH * scale;
  1416. X    u->altScale.orientation = ALT_ORIENT;
  1417. X    u->altScale.scale = ALT_SCALE / scale;
  1418. X    u->altScale.minorInterval = ALT_MIN_INTERVAL;
  1419. X    u->altScale.minorSize = ALT_MIN_SIZE * scale;
  1420. X    u->altScale.majorInterval = ALT_MAJ_INTERVAL;
  1421. X    u->altScale.majorSize = ALT_MAJ_SIZE * scale;
  1422. X    u->altScale.indexSize = ALT_INDEX_SIZE * scale;
  1423. X    u->altScale.divisor = ALT_DIVISOR;
  1424. X    u->altScale.format = ALT_FORMAT;
  1425. X
  1426. X    u->velScale.xorg = VEL_ORG_X * scale;
  1427. X    u->velScale.yorg = VEL_ORG_Y * scale;
  1428. X    u->velScale.length = VEL_LENGTH * scale;
  1429. X    u->velScale.orientation = VEL_ORIENT;
  1430. X    u->velScale.scale = VEL_SCALE / scale;
  1431. X    u->velScale.minorInterval = VEL_MIN_INTERVAL;
  1432. X    u->velScale.minorSize = VEL_MIN_SIZE * scale;
  1433. X    u->velScale.majorInterval = VEL_MAJ_INTERVAL;
  1434. X    u->velScale.majorSize = VEL_MAJ_SIZE * scale;
  1435. X    u->velScale.indexSize = VEL_INDEX_SIZE * scale;
  1436. X    u->velScale.divisor = VEL_DIVISOR;
  1437. X    u->velScale.format = VEL_FORMAT;
  1438. X
  1439. X    u->hdgScale.xorg = HDG_ORG_X * scale;
  1440. X    u->hdgScale.yorg = HDG_ORG_Y * scale;
  1441. X    u->hdgScale.length = HDG_LENGTH * scale;
  1442. X    u->hdgScale.orientation = HDG_ORIENT;
  1443. X    u->hdgScale.scale = HDG_SCALE / scale;
  1444. X    u->hdgScale.minorInterval = HDG_MIN_INTERVAL;
  1445. X    u->hdgScale.minorSize = HDG_MIN_SIZE * scale;
  1446. X    u->hdgScale.majorInterval = HDG_MAJ_INTERVAL;
  1447. X    u->hdgScale.majorSize = HDG_MAJ_SIZE * scale;
  1448. X    u->hdgScale.indexSize = HDG_INDEX_SIZE * scale;
  1449. X    u->hdgScale.divisor = HDG_DIVISOR;
  1450. X    u->hdgScale.format = HDG_FORMAT;
  1451. X                                           
  1452. X/*
  1453. X * Map the window to make it visible.
  1454. X */
  1455. X
  1456. X    XMapWindow(u->dpy, u->win);
  1457. X    XMapWindow(u->dpy, u->rwin);
  1458. X    if (mono == 0) {
  1459. X    register int curPixel;
  1460. X
  1461. X        VExposeBuffer (u->v, u->gc);
  1462. X    curPixel = *(u->v->pixel);
  1463. X    XSetForeground (u->dpy, u->gc, curPixel);
  1464. X    XFillRectangle (u->dpy, u->win, u->gc, 0, 0, u->width, u->height);
  1465. X    }
  1466. X
  1467. X    whitePixel = whiteColor->index;
  1468. X    blackPixel = blackColor->index;
  1469. X    HUDPixel = HUDColor->index;
  1470. X
  1471. X    return 0;
  1472. X
  1473. X}
  1474. X
  1475. Xint killPlayer (c)
  1476. Xcraft    *c; {
  1477. X
  1478. X    viewer    *v, *vn;
  1479. X    int    i;
  1480. X
  1481. X/*
  1482. X *  Erase our radar emissions
  1483. X */
  1484. X
  1485. X    for (i=0; i<MAXPLAYERS; ++i)
  1486. X        ptbl[i].rval[c->index] = 0.0;
  1487. X
  1488. X/*
  1489. X *  Free HUD string storage
  1490. X */
  1491. X
  1492. X    if (c->leftHUD[0] != (char *) NULL)
  1493. X        for (i=0; i<3; ++i) {
  1494. X            free (c->leftHUD[i]);
  1495. X            free (c->rightHUD[i]);
  1496. X        }
  1497. X
  1498. X/*
  1499. X *  Close viewers' display
  1500. X */
  1501. X
  1502. X    for (v=c->vl; v != (viewer *) NULL;) {
  1503. X        XCloseDisplay (v->dpy);
  1504. X        vn = (viewer *) v->next;
  1505. X        free ((char *) v);
  1506. X        v = vn;
  1507. X    }
  1508. X
  1509. X    if (c->flags && FL_RECORD)
  1510. X        -- recordCount;
  1511. X
  1512. X    c->type = CT_FREE;
  1513. X    return 0;
  1514. X}
  1515. END_OF_FILE
  1516. if test 13579 -ne `wc -c <'acm/fsim/newPlayer.c'`; then
  1517.     echo shar: \"'acm/fsim/newPlayer.c'\" unpacked with wrong size!
  1518. fi
  1519. # end of 'acm/fsim/newPlayer.c'
  1520. fi
  1521. if test -f 'acm/fsim/pm.h' -a "${1}" != "-c" ; then 
  1522.   echo shar: Will not clobber existing file \"'acm/fsim/pm.h'\"
  1523. else
  1524. echo shar: Extracting \"'acm/fsim/pm.h'\" \(13242 characters\)
  1525. sed "s/^X//" >'acm/fsim/pm.h' <<'END_OF_FILE'
  1526. X#include "manifest.h"
  1527. X#include "eng.xbm"
  1528. X#include "flaps0.xbm"
  1529. X#include "flaps1.xbm"
  1530. X#include "flaps2.xbm"
  1531. X#include "flaps3.xbm"
  1532. X#include "scale.h"
  1533. X#include "damage.h"
  1534. X#include <Vlib.h>
  1535. X
  1536. X#define MAXSURFACE    8
  1537. X#define MAXPLAYERS    16
  1538. X#define MAXPROJECTILES    MAXPLAYERS*8
  1539. X#define MAXCRAFTTYPES    16
  1540. X#define STATIONS    9
  1541. X#define WEAPONTYPES    4
  1542. X
  1543. Xtypedef struct _viewer {
  1544. X    struct _viewer *next;
  1545. X    Display            *dpy;        /* display for this user */
  1546. X    Window        win;        /* window for this user */
  1547. X    Window        twin, rwin;    /* threat window and radar window */
  1548. X    GC        gc;        /* GC for drawing */
  1549. X    XFontStruct    *font;        /* HUD font */
  1550. X    XFontStruct    *rfont;        /* radar font */
  1551. X    Viewport    *v;        /* Viewport for out-of-cockpit views */
  1552. X    Pixmap        eng;        /* Engine "RPM" gauge */
  1553. X    Pixmap        flap[5];    /* flap setting indicators */
  1554. X    int        cn;        /* X connection fd */
  1555. X    int        width, height;    /* width & height of viewing window */
  1556. X    int        xCenter, yCenter; /* center of viewing window */
  1557. X    int        ftw, fth;    /* HUD font width & height */
  1558. X    int        rftw, rfth;
  1559. X    int        radarWidth;
  1560. X    int        radarHeight;
  1561. X    scaleControl    altScale;    /* altitude scale control */
  1562. X    scaleControl    velScale;    /* airspeed scale control */
  1563. X    scaleControl    hdgScale;    /* heading scale control */
  1564. X    int        TEWSx, TEWSy;    /* location of center of TEWS display */
  1565. X    int        TEWSSize;    /* size of TEWS display, in pixels */
  1566. X    double        scaleFactor;    /* overall scaling factor for display */
  1567. X    }        viewer;
  1568. X
  1569. X/*
  1570. X *  This structure describes a class of aircraft.
  1571. X */
  1572. X
  1573. Xtypedef struct {
  1574. X    char    *name;        /* name of aircraft class */
  1575. X
  1576. X    double    aspectRatio;    /* wing aspect ratio */
  1577. X
  1578. X    double    CLOrigin, CLSlope; /* Defines the CL characteristic eqn */
  1579. X    double    CLNegStall, CLPosStall;
  1580. X    double    betaStall;    /* Stall angle for rudder */
  1581. X    double  CDOrigin, CDFactor; /* Defines the CD Characteristic eqn */
  1582. X    double    (*CDi)();    /* compute zero lift induced drag coefficient */
  1583. X    double  CDPhase;
  1584. X    double  CDBOrigin, CDBFactor; /* Defines the CD Characteristic eqn */
  1585. X    double  CDBPhase;
  1586. X    double    CLbeta;            /* coefficient rolling moment due to sideslip */
  1587. X    double  CMOrigin, CMFactor; /* Defines the CM Characteristic eqn */
  1588. X    double  CNOrigin, CNFactor; /* Defines the CM Characteristic eqn */
  1589. X    double    CYbeta;        /* Side-force from side-slip (dCY/dBeta) */
  1590. X
  1591. X    double    effAileron;    /* Aileron effectiveness */
  1592. X    double    effElevator;    /* Elevator effectiveness */
  1593. X    double    effRudder;    /* Rudder effectiveness */
  1594. X
  1595. X    VMatrix I;        /* Moments of Intertia about CG in [xyz] */
  1596. X    double    LDamp;        /* roll damping factor */
  1597. X    double    MDamp;        /* pitch damping factor */
  1598. X    double    NDamp;        /* yaw damping factor */
  1599. X    double    cmSlope; 
  1600. X    double  cmFactor;
  1601. X    double    cnSlope;
  1602. X    double    cnFactor;
  1603. X
  1604. X    double    maxFlap;    /* maximum flap setting (radians) */
  1605. X    double    cFlap;        /* lift coefficient of flaps */
  1606. X    double    cFlapDrag;    /* drag coefficient of lowered flaps */
  1607. X    double    flapRate;    /* flap movement rate (radians/sec) */
  1608. X
  1609. X    double    maxSpeedBrake;    /* maximum speed brake setting (radians) */
  1610. X    double    cSpeedBrake;    /* drag coefficient of 90 degree speed brake */
  1611. X    double    speedBrakeRate;    /* rate of speed brake movement (radians/sec) */
  1612. X    double    speedBrakeIncr;    /* number of radians than one keystroke moves brake */
  1613. X
  1614. X    double    wingS;        /* wing area (ft^2) */
  1615. X    double    emptyWeight;    /* empty weight (lbs.) */
  1616. X    double    maxFuel;    /* maximum internal fuel (lbs.) */
  1617. X
  1618. X    double  maxThrust;    /* maximum thrust, military power (lb) */
  1619. X    double  maxABThrust;    /* maximum thrust, afterburner on  (lb) */
  1620. X    double  spFuelConsump;    /* specific fuel consump(lb fuel/lb T x hr)*/
  1621. X    double    spABFuelConsump;
  1622. X    VPoint    groundingPoint;    /* hypothetical single pt of contact w/ground */
  1623. X    VPoint  viewPoint;    /* pilot's viewing location wrt CG */
  1624. X    double    crashC;        /* maximum tolerable touchdown z component */
  1625. X
  1626. X    double    muStatic;    /* static coefficient of friction no-brakes */
  1627. X    double    muKinetic;    /* moving coefficient of friction no-brakes */
  1628. X    double    muBStatic;    /* static brakes-on */
  1629. X    double  muBKinetic;    /* kinetic brakes-on */
  1630. X
  1631. X    double  maxNWDef;    /* maximum nosewheel deflection (radians) */
  1632. X    double  NWIncr;        /* deflection for each unit */
  1633. X    double  maxNWS;        /* maximum NWS velocity */
  1634. X    double    gearD1;        /* x station wrt nose gear of main gear */
  1635. X    double  gearD2;        /* x station wrt CG of main gear */
  1636. X    double    armDelay;    /* arming delay for missiles */
  1637. X
  1638. X    long    damageBits;    /* initial bit mask of damaged systems */
  1639. X    long    structurePts;    /* maximum structural damage */
  1640. X
  1641. X    double    radarOutput;    /* radar output (watts) */
  1642. X    double    radarTRange;    /* tracking radar range */
  1643. X    double    radarDRange;    /* detection radar range */
  1644. X    double    TEWSThreshold;
  1645. X
  1646. X    int    sCount;        /* number of weapon stations */
  1647. X    VPoint    wStation[STATIONS]; /* weapon's stations (launch points) */
  1648. X
  1649. X    int    (*placeProc)();    /* object placement procedure (for special craft) */
  1650. X    VObject *object;    /* what it looks like */
  1651. X    }    craftType;
  1652. X
  1653. Xtypedef struct _wdsc {
  1654. X    int        mask;        /* key mask */
  1655. X    int        (*select)();    /* weapon select procedure */
  1656. X    int        (*update)();    /* per tick update procedure */
  1657. X    int        (*display)();    /* display update procedure */
  1658. X    int        (*firePress)();    /* fire button pressed procedure */
  1659. X    int        (*fireRelease)(); /* fire button released */
  1660. X    craftType    *w;        /* description of this weapon */
  1661. X    }        weaponDesc;
  1662. X
  1663. Xtypedef struct _wctl {
  1664. X    int        type;        /* type of weapon at this station */
  1665. X    int        info;        /* extra info (weapon specific) */
  1666. X    int        info2;        /* "      " */
  1667. X    int        info3;        /* "      " */
  1668. X    }        weaponStation;
  1669. X
  1670. X#define WK_M61A1    0x01        /* M-61A1 Vulcan 20mm cannon */
  1671. X#define WK_AIM9M    0x02        /* Sidewinder missile */
  1672. X
  1673. X/*
  1674. X *  This structure describes a particular instance of aircraft.
  1675. X */
  1676. X
  1677. Xtypedef struct _craft {
  1678. X    int    index;        /* index number of this element in the vector */
  1679. X    int    type;        /* craft type */
  1680. X    int    team;        /* team number */
  1681. X    double    createTime;    /* creation time of this craft */
  1682. X    viewer    *vl;        /* list of viewers */
  1683. X    VMatrix trihedral;      /* transforms [x, y, z] to Geoparallel */
  1684. X                /* x = forward, y=right wing, z=down */
  1685. X                /* does not include origin translation */
  1686. X    VMatrix    Itrihedral;    /* transforms geoparallel to [x, y, z] */
  1687. X    VPoint    C;        /* Velocity vector in [x, y, z] */
  1688. X    VPoint    Cg;        /* Velocity vector in Geoparallel system */
  1689. X    VPoint    Sg;        /* Position in Geoparallel system */
  1690. X    double    rho;        /* current rho value */
  1691. X    double  mach1;        /* current value of mach 1.0 (fps) */
  1692. X    double    mach;        /* current mach number */
  1693. X    VPoint    G;        /* g-force vector in acft system */
  1694. X    VPoint    prevSg;        /* last interval's Sg value */
  1695. X    double    p, q, r;    /* roll, pitch, and yaw rates */
  1696. X    double    Se, Sa, Sr;    /* control settings */
  1697. X    double    curHeading, curPitch, curRoll; /* Euler angles for acft */
  1698. X    double    curThrust;    /* Current thrust value */
  1699. X    double    curFlap;    /* current flap setting (radians) */
  1700. X    double    flapSetting;    /* current target flap setting (radians) */
  1701. X    double    curSpeedBrake;    /* current speed brake position (radians) */
  1702. X    double    speedBrakeSetting; /* current target speed brake setting (radians) */
  1703. X    int    throttle;    /* thrust setting 0 - 32768 */
  1704. X    double    alpha, beta;    /* angles of attack and sideslip */
  1705. X    double    fuel;        /* current fuel on board */
  1706. X    int    groundContact;    /* 1, when on ground */
  1707. X    int    flags;        /* flag word */
  1708. X
  1709. X    long    damageBits;    /* bit flags of damaged subsystems */
  1710. X    long    structurePts;    /* damage pts that can be absorbed */
  1711. X    double    leakRate;    /* fuel leakage rate (lbs/second) */
  1712. X    double    damageCL;    /* damage induced roll */
  1713. X    double    damageCM;    /* damage induced pitch */
  1714. X
  1715. X    int    radarMode;    /* radar mode */
  1716. X    double  curNWDef;    /* Current nosewheel deflection (radians) */
  1717. X    int    armFuse;    /* missile arming countdown */
  1718. X    craftType *cinfo;    /* General craft information */
  1719. X    double    order;        /* temporary value used to sort craft */
  1720. X    struct  _craft *next;    /* next craft in sorted list */
  1721. X    VPoint    viewDirection;    /* where the pilot is currently looking */
  1722. X    VPoint    viewUp;        /* the "up" direction of the pilot's view */
  1723. X
  1724. X    char    name[32];    /* logname of player */
  1725. X    char    display[32];    /* display name of player */
  1726. X
  1727. X    short    curRadarTarget;    /* our primary "threat" */
  1728. X    double    targetDistance; /* distance to primary target */
  1729. X    double    targetClosure;    /* closure rate on primary target */
  1730. X    short    relValid[MAXPLAYERS];
  1731. X    VPoint    relPos[MAXPLAYERS];
  1732. X    double    rval[MAXPLAYERS];/* radar strength seen by us from other craft */
  1733. X                /* relative positions of possible targets */
  1734. X    char    *leftHUD[3];    /* strings in lower left corner of HUD */
  1735. X                /* (reserved for weapons' status */
  1736. X    char    *rightHUD[3];    /* strings in lower right corner of HUD */
  1737. X                /* (reserved for future use) */
  1738. X    int    curWeapon;    /* index of currently selected weapon */
  1739. X    weaponStation station[STATIONS]; /* what's at each weapon station */
  1740. X    }    craft;
  1741. X
  1742. X/*
  1743. X *  We'll use some defines to reduce the storage required for the craft
  1744. X *  (unions would be cleaner, perhaps).
  1745. X */
  1746. X
  1747. X#define    rounds    curRadarTarget
  1748. X#define    tracerMod groundContact
  1749. X#define tracerVal radarMode
  1750. X#define owner    curWeapon
  1751. X
  1752. X/*
  1753. X *  Craft type definitions
  1754. X */
  1755. X
  1756. X#define CT_FREE        0    /* an unused craft entry */
  1757. X#define CT_PLANE    1    /* a player */
  1758. X#define CT_MISSILE    2    /* an air to air missile */
  1759. X#define CT_CANNON    3    /* a stream of cannon fire */
  1760. X#define CT_SURFACE    4    /* surface object (e.g. a runway) */
  1761. X#define CT_OBSERVER    5    /* a non-player "watcher" */
  1762. X#define CT_DRONE    6    /* a target drone */
  1763. X
  1764. X#define FL_RECORD    0x01    /* activate recording function */
  1765. X#define FL_AFTERBURNER    0x02    /* afterburner state */
  1766. X#define FL_BRAKES    0x04    /* wheel brake state */
  1767. X#define    FL_NWS        0x08    /* nose-wheel steering mode */
  1768. X#define FL_HAS_GYRO    0x10    /* missile is gyroscope equiped */
  1769. X
  1770. X#define RM_OFF        0    /* radar is off */
  1771. X#define RM_STANDBY    1    /* standby */
  1772. X#define RM_GUN_DIRECTOR    2    /* gun director mode */
  1773. X#define RM_HUD        3    /* 20 degree scan */
  1774. X#define RM_NORMAL    4    /* 65 degree scan */
  1775. X
  1776. Xint        recordCount;    /* number of players recording info */
  1777. Xdouble        curTime;    /* current time */
  1778. X
  1779. Xcraft        stbl[MAXSURFACE]; /* table of surface objects */
  1780. Xcraft        ptbl[MAXPLAYERS]; /* table of player aircraft */
  1781. Xcraft        mtbl[MAXPROJECTILES]; /* table of missiles and cannon streams */
  1782. XweaponDesc    wtbl[WEAPONTYPES]; /* descriptions of different weapons */
  1783. X
  1784. Xdouble        deltaT;        /* Update interval in seconds */
  1785. Xdouble        halfDeltaTSquared; /* 0.5 * deltaT * deltaT */
  1786. Xint        HUDPixel;    /* index of HUD color in viewport(s) */
  1787. XVColor        *HUDColor;
  1788. Xint        whitePixel;    /* index of white in viewport(s) */
  1789. XVColor        *whiteColor;    /* white in viewport(s) */
  1790. Xint        blackPixel;    /* index of black in viewport(s) */
  1791. XVColor        *blackColor;    /* black in viewport(s) */
  1792. XVColor        *groundColor;    /* ground color in viewport(s) */
  1793. X
  1794. X#define a    32.15        /* acceleration due to gravity (fps^2) */
  1795. X#define pi    3.1415927
  1796. X#define mag(v)    (sqrt (v.x * v.x + v.y * v.y + v.z * v.z))
  1797. X#define calcAplha(p)    (atan2 (p.C.z, p.C.x))
  1798. X#define calcBeta(p)    (atan2 (p.C.y, sqrt (pow (mag(p.C), 2.0) \
  1799. X            + p.C.y * p.C.y)))
  1800. X#define unitVector(v)    {double m; m = mag(v); \
  1801. X            v.x /= m; v.y /= m; v.z /= m; }
  1802. X
  1803. X#define addHeading(c, dh) {c->curHeading = c->curHeading + dh; \
  1804. X        if (c->curHeading > pi * 2.0 || c->curHeading <= 0.0) \
  1805. X            c->curHeading = (c->curHeading <= 0.0) ? c->curHeading + \
  1806. X            2.0 * pi : c->curHeading - 2.0 * pi; }
  1807. X
  1808. X#define NM        6076.115
  1809. X#define FPStoMPH(v)    (v / 5280.0 * 3600.0)
  1810. X#define FPStoKTS(v)    (v / 6076.115 * 3600.0)
  1811. X#define RADtoDEG(a)    (a * 180.0 / pi)
  1812. X#define DEGtoRAD(a)    (a * pi / 180.0)
  1813. X#define fsign(d)    (d < 0 ? -1.0 : 1.0)
  1814. X#define calcThrust(c)    ((((c->flags & FL_AFTERBURNER) ? \
  1815. X    c->cinfo->maxABThrust : c->cinfo->maxThrust) - \
  1816. X    c->cinfo->maxThrust * (1.0 - (c->rho / 0.002377))) * \
  1817. X    pow ((double) c->throttle / 32768.0, 2.0))
  1818. X#define fuelUsed(c)    (((c->flags & FL_AFTERBURNER) ? \
  1819. X    c->cinfo->spABFuelConsump : c->cinfo->spFuelConsump) * c->curThrust * \
  1820. X    deltaT / 3600.0)
  1821. X
  1822. X#define VIEW_WINDOW_HEIGHT    500
  1823. X#define VIEW_WINDOW_WIDTH    1200
  1824. X#define RADAR_WINDOW_WIDTH    200
  1825. X#define RADAR_WINDOW_HEIGHT    200
  1826. X#define RADAR_X            (1200/2-200/2)
  1827. X#define RADAR_Y            (500)
  1828. X#define TEWS_X            (1200/2-200/2-100)
  1829. X#define TEWS_Y            (VIEW_WINDOW_HEIGHT+60)
  1830. X#define TEWS_SIZE        81
  1831. X#define FS_WINDOW_WIDTH        (VIEW_WINDOW_WIDTH)    
  1832. X#define FS_WINDOW_HEIGHT     (VIEW_WINDOW_HEIGHT+RADAR_WINDOW_HEIGHT)
  1833. X#define    FLAP_X            (1200/2-200/2-95)
  1834. X#define FLAP_Y            (FS_WINDOW_HEIGHT-53)
  1835. X#define DESIGNATOR_SIZE        40
  1836. X#define PANEL_X            (200)
  1837. X#define PANEL_Y            (RADAR_Y+50)
  1838. X
  1839. X/*
  1840. X *  Location of the center of the engine RPM gauge.
  1841. X */
  1842. X
  1843. X#define ENG_X            (FS_WINDOW_WIDTH-400)
  1844. X#define ENG_Y            (VIEW_WINDOW_HEIGHT+60)
  1845. X
  1846. X#define ALT_ORG_X        760
  1847. X#define ALT_ORG_Y        360
  1848. X#define ALT_LENGTH        199
  1849. X#define ALT_ORIENT        orientRight
  1850. X#define ALT_SCALE        (1700.0 / (double) ALT_LENGTH)
  1851. X#define ALT_INDEX_SIZE        30
  1852. X#define ALT_MIN_INTERVAL    100
  1853. X#define ALT_MIN_SIZE        8
  1854. X#define ALT_MAJ_INTERVAL    500
  1855. X#define ALT_MAJ_SIZE        15
  1856. X#define ALT_DIVISOR        1000.0
  1857. X#define ALT_FORMAT        "%4.3g"
  1858. X
  1859. X#define VEL_ORG_X        440
  1860. X#define VEL_ORG_Y        360
  1861. X#define VEL_LENGTH        ALT_LENGTH
  1862. X#define VEL_ORIENT        0
  1863. X#define VEL_SCALE        (170.0 / (double) VEL_LENGTH)
  1864. X#define VEL_INDEX_SIZE        30
  1865. X#define VEL_MIN_INTERVAL    10
  1866. X#define VEL_MIN_SIZE        8
  1867. X#define VEL_MAJ_INTERVAL    50
  1868. X#define VEL_MAJ_SIZE        15
  1869. X#define VEL_DIVISOR        10.0
  1870. X#define VEL_FORMAT        "%3.3g"
  1871. X
  1872. X#define HDG_ORG_X        (VIEW_WINDOW_WIDTH / 2 - (6*30+1) / 2)
  1873. X#define HDG_ORG_Y        400
  1874. X#define HDG_LENGTH        (6*30+1)
  1875. X#define HDG_ORIENT        0
  1876. X#define HDG_SCALE        (3000.0 / (double) VEL_LENGTH)
  1877. X#define HDG_INDEX_SIZE        10
  1878. X#define HDG_MIN_INTERVAL    500
  1879. X#define HDG_MIN_SIZE        5
  1880. X#define HDG_MAJ_INTERVAL    1000
  1881. X#define HDG_MAJ_SIZE        10
  1882. X#define HDG_DIVISOR        1000.0
  1883. X#define HDG_FORMAT        "%2.2g"
  1884. END_OF_FILE
  1885. if test 13242 -ne `wc -c <'acm/fsim/pm.h'`; then
  1886.     echo shar: \"'acm/fsim/pm.h'\" unpacked with wrong size!
  1887. fi
  1888. # end of 'acm/fsim/pm.h'
  1889. fi
  1890. echo shar: End of archive 6 \(of 9\).
  1891. cp /dev/null ark6isdone
  1892. MISSING=""
  1893. for I in 1 2 3 4 5 6 7 8 9 ; do
  1894.     if test ! -f ark${I}isdone ; then
  1895.     MISSING="${MISSING} ${I}"
  1896.     fi
  1897. done
  1898. if test "${MISSING}" = "" ; then
  1899.     echo You have unpacked all 9 archives.
  1900.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  1901. else
  1902.     echo You still need to unpack the following archives:
  1903.     echo "        " ${MISSING}
  1904. fi
  1905. ##  End of shell archive.
  1906. exit 0
  1907. -- 
  1908. Riley Rainey            Internet: riley@mips.com
  1909. MIPS Computer Systems        Phone:    +1 214 770-7979
  1910. Dallas, Texas
  1911.