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

  1. From: riley@mipsdal.mips.com (Riley Rainey)
  2. Newsgroups: comp.sources.x
  3. Subject: v12i008: acm - X aerial combat simulation, Part03/09
  4. Message-ID: <8985@exodus.Eng.Sun.COM>
  5. Date: 2 Mar 91 08:32:22 GMT
  6. Approved: argv@sun.com
  7.  
  8. Submitted-by: riley@mipsdal.mips.com (Riley Rainey)
  9. Posting-number: Volume 12, Issue 8
  10. Archive-name: acm/part03
  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 3 (of 9)."
  19. # Contents:  acm/MANIFEST acm/README acm/V/lib/VBindColors.c
  20. #   acm/V/lib/Vlib.h acm/V/test/app.c acm/fsim/acm.man
  21. #   acm/fsim/aim9m.c acm/fsim/doEvents.c acm/fsim/doScale.c
  22. #   acm/fsim/server.c
  23. # Wrapped by riley@mipsdal on Thu Feb 14 10:09:18 1991
  24. PATH=/bin:/usr/bin:/usr/ucb ; export PATH
  25. if test -f 'acm/MANIFEST' -a "${1}" != "-c" ; then 
  26.   echo shar: Will not clobber existing file \"'acm/MANIFEST'\"
  27. else
  28. echo shar: Extracting \"'acm/MANIFEST'\" \(3444 characters\)
  29. sed "s/^X//" >'acm/MANIFEST' <<'END_OF_FILE'
  30. X   File Name        Archive #    Description
  31. X-----------------------------------------------------------
  32. X acm                        1    
  33. X acm/Imakefile              1    
  34. X acm/MANIFEST               3    
  35. X acm/Makefile               7    
  36. X acm/README                 3    
  37. X acm/V                      1    
  38. X acm/V/Imakefile            1    
  39. X acm/V/Makefile             7    
  40. X acm/V/lib                  1    
  41. X acm/V/lib/Imakefile        1    
  42. X acm/V/lib/Makefile         5    
  43. X acm/V/lib/VAllocColor.c    1    
  44. X acm/V/lib/VBindColors.c    3    
  45. X acm/V/lib/VClipPoly.c      2    
  46. X acm/V/lib/VCloseVp.c       1    
  47. X acm/V/lib/VCopyPoly.c      1    
  48. X acm/V/lib/VCrPoints.c      1    
  49. X acm/V/lib/VCrPoly.c        1    
  50. X acm/V/lib/VCrossProd.c     1    
  51. X acm/V/lib/VDispObjects.c   1    
  52. X acm/V/lib/VDotProd.c       1    
  53. X acm/V/lib/VDrawPoly.c      1    
  54. X acm/V/lib/VDrawString.c    1    
  55. X acm/V/lib/VExpBuffer.c     1    
  56. X acm/V/lib/VEyeToScr.c      1    
  57. X acm/V/lib/VFillPoly.c      1    
  58. X acm/V/lib/VGetEyeSpace.c   2    
  59. X acm/V/lib/VGetPlanes.c     1    
  60. X acm/V/lib/VIdentMat.c      1    
  61. X acm/V/lib/VMatDet.c        1    
  62. X acm/V/lib/VMatInvert.c     1    
  63. X acm/V/lib/VMatMult.c       1    
  64. X acm/V/lib/VOpenVp.c        2    
  65. X acm/V/lib/VPrintPoly.c     1    
  66. X acm/V/lib/VReadObject.c    1    
  67. X acm/V/lib/VResizeVp.c      1    
  68. X acm/V/lib/VRotate.c        1    
  69. X acm/V/lib/VTrans.c         1    
  70. X acm/V/lib/VTransPoly.c     1    
  71. X acm/V/lib/VWorldToScr.c    1    
  72. X acm/V/lib/VWriteObject.c   1    
  73. X acm/V/lib/Vlib.h           3    
  74. X acm/V/lib/Vmalloc.c        1    
  75. X acm/V/lib/strdup.c         1    
  76. X acm/V/test                 1    
  77. X acm/V/test/Imakefile       1    
  78. X acm/V/test/Makefile        4    
  79. X acm/V/test/animate.c       4    
  80. X acm/V/test/app.c           3    
  81. X acm/V/test/f               2    
  82. X acm/V/test/f16             2    
  83. X acm/V/test/fixf16.c        1    
  84. X acm/V/test/fixmig.c        1    
  85. X acm/V/test/fullrwy         5    
  86. X acm/V/test/mig23           2    
  87. X acm/V/test/rwy             5    
  88. X acm/acm.def                1    
  89. X acm/acmdoc.ps              9    
  90. X acm/fsim                   1    
  91. X acm/fsim/Imakefile         2    
  92. X acm/fsim/Makefile          6    
  93. X acm/fsim/V2tgif.c          1    
  94. X acm/fsim/acm.c             2    
  95. X acm/fsim/acm.man           3    
  96. X acm/fsim/aim-9             1    
  97. X acm/fsim/aim9m.c           3    
  98. X acm/fsim/bullet            1    
  99. X acm/fsim/damage.c          2    
  100. X acm/fsim/damage.h          1    
  101. X acm/fsim/doEvents.c        3    
  102. X acm/fsim/doRadar.c         4    
  103. X acm/fsim/doScale.c         3    
  104. X acm/fsim/doViews.c         6    
  105. X acm/fsim/droneCalc.c       1    
  106. X acm/fsim/eng.xbm           2    
  107. X acm/fsim/exp.xbm           2    
  108. X acm/fsim/exp1.xbm          2    
  109. X acm/fsim/f16               2    
  110. X acm/fsim/flaps.c           2    
  111. X acm/fsim/flaps0.xbm        1    
  112. X acm/fsim/flaps1.xbm        2    
  113. X acm/fsim/flaps2.xbm        1    
  114. X acm/fsim/flaps3.xbm        1    
  115. X acm/fsim/getStick.c        1    
  116. X acm/fsim/header            1    
  117. X acm/fsim/init.c            2    
  118. X acm/fsim/m61a1.c           7    
  119. X acm/fsim/manifest.h        1    
  120. X acm/fsim/mig23             2    
  121. X acm/fsim/missile.c         5    
  122. X acm/fsim/missileCalc.c     2    
  123. X acm/fsim/mtn               1    
  124. X acm/fsim/newPlane.c        4    
  125. X acm/fsim/newPlayer.c       6    
  126. X acm/fsim/panel.c           2    
  127. X acm/fsim/patchlevel.h      1    
  128. X acm/fsim/placeCraft.c      1    
  129. X acm/fsim/pm.c              8    
  130. X acm/fsim/pm.h              6    
  131. X acm/fsim/rwy               4    
  132. X acm/fsim/rwy2              1    
  133. X acm/fsim/scale.h           1    
  134. X acm/fsim/server.c          3    
  135. X acm/fsim/tower             1    
  136. X acm/fsim/transpose.c       1    
  137. X acm/fsim/update.c          1    
  138. X acm/fsim/weapon.c          1    
  139. X acm/install-objects        1    
  140. END_OF_FILE
  141. if test 3444 -ne `wc -c <'acm/MANIFEST'`; then
  142.     echo shar: \"'acm/MANIFEST'\" unpacked with wrong size!
  143. fi
  144. # end of 'acm/MANIFEST'
  145. fi
  146. if test -f 'acm/README' -a "${1}" != "-c" ; then 
  147.   echo shar: Will not clobber existing file \"'acm/README'\"
  148. else
  149. echo shar: Extracting \"'acm/README'\" \(5313 characters\)
  150. sed "s/^X//" >'acm/README' <<'END_OF_FILE'
  151. Xacm Flight Simulator version 2.0
  152. X
  153. XWhat is acm?
  154. X------------
  155. X
  156. XAcm is a LAN-oriented, multiplayer aerial combat simulation.  My main design
  157. Xobjective was to provide source code that could be easily compiled and
  158. Xexecuted on a wide variety of platforms.  To that end, acm is written entirely
  159. Xin C, exploiting the programming features of Unix, X11, and the BSD socket
  160. Xinterface.
  161. X
  162. XPlayers engage in air to air combat against one another using heat seeking
  163. Xmissiles and cannons.
  164. X
  165. XAcm exists as two programs.  The first, named "acm", is a small program
  166. Xthat, when invoked, starts a flight session on a given workstation.  The
  167. Xsecond component, named "acms", is a server process that manages the
  168. Xmultiplayer environment.  It also manages the flight simulation and
  169. Xdisplay management that is required.  Most players will prefer to run the
  170. Xacms process on a back-end server system on their local area network.  Players
  171. Xat client workstations can then invoke the acm program to begin play.
  172. X
  173. XI play acm using a server that is a Mips RC3240 (rated at roughly 18.5
  174. XSPECmarks).  I get very adequate display performance using a Mips RS2030
  175. Xcolor workstation (10.0 SPECmarks) or an NCD monochrome X terminal.  My
  176. Xchoice of servers is probably overkill.  I suspect that an 10+ SPECmark
  177. Xsystem could handle a typical mutiplayer load.
  178. X
  179. XThis is the second release of acm.  The original version has been ported
  180. Xto a variety of Unix derivatives and system architectures.
  181. X
  182. XRiley Rainey
  183. Xriley@mips.com
  184. XJanuary 26, 1991
  185. X
  186. X
  187. X
  188. XWhat's different with revision 2.0:
  189. X-----------------------------------
  190. X
  191. XThe flight simulation model has been substantially revamped.
  192. X
  193. XRudder controls have been added.
  194. X
  195. XMonochrome support has been added with the generous help of Glen Dudek
  196. X(dudek@ksr.com).
  197. X
  198. XFilenames have been shortened, where required, to get along with System V
  199. Xconventions.
  200. X
  201. XSubstantial corrections and enhancements to the portability of this code
  202. Xwere provided by Johnathan Kamens (jik@Athena.MIT.EDU).  imake can now
  203. Xbe used to build the entire product tree.
  204. X
  205. XSun-specific changes were provided by Dave Safford (auvsaff@auvsun.tamu.edu).
  206. X
  207. XA bug that prevented acm from operating with certain window managers
  208. Xhas been corrected.
  209. X
  210. XLead Computing Optical Sight (LCOS) support has been added to the
  211. Xcannon weapon display.  A reticle (sight) is displayed on the HUD, showing
  212. Xa good aiming sight for the cannon.
  213. X
  214. XCannons will now inflict damage on other aircraft.
  215. X
  216. XAircraft can now be damaged, but remain airworthy.
  217. X
  218. X
  219. X
  220. XGENERAL NOTES
  221. X-------------
  222. X
  223. XThis software is divided into two major parts: the 3-D graphics routines
  224. Xand the flight simulator itself.  The 3-D stuff is contained in the V
  225. Xdirectory.  V/lib holds the library itself.  V/test contains a program
  226. Xthat can be used to test your port of the V library.
  227. X
  228. XFsim contains the remainder of the flight simulator. imake and make files
  229. Xhave been provided.  The code has a Berkeley tilt to it in many
  230. Xplaces, so people with hybrid OS's will probably want to lean that
  231. Xdirection when selecting compiling and linking options.
  232. X
  233. XAcm binaries can be installed in your standard games directory.  In addition
  234. Xto running "make install" to install the executables, you must run the
  235. X"install-objects" script.
  236. X
  237. XThe acm server, acms, must currently be started manually.  It's intended
  238. Xthat it will eventually be managed automatically by inetd, but that's
  239. Xnot in the code yet.  I have access to a network that includes a 16+ SPECMark
  240. Xserver and 12 to 18 SPECMark workstations (i.e. a MIPS 3240 along with
  241. XMIPS 2030 and Magnum workstations) (translate SPECMarks into millions of
  242. Xinstructions per second by whatever formula you like ..).  I generally 
  243. Xrlogin to the 3240 and start the acms process on it and leave that xterm
  244. Xwindow hanging around;  then, from another xterm window, I'll fire off
  245. Xthe acm command that starts my flying session.  Other players enter the
  246. Xgame by simply firing off an "acm servername" command.
  247. X
  248. XI'm not saying that acm is a particularly accurate flight simulator. I'm
  249. Xnot an aero engineer, but I did spend a fair amount of time studying
  250. Xseveral college-level texts on the subject while I was designing this
  251. Xsoftware.  This probably doesn't resemble real-time flight simulators
  252. Xtoo much but, again, that's not my line of work.  Comments and
  253. Xsuggestions to improve this software are welcome.
  254. X
  255. XSeveral "features" in this revision of the software:
  256. X
  257. X    * landing gear is ignored.  Raise it, lower it; it's
  258. X      not handled by the software.
  259. X
  260. X    * flaps can be lowered at rediculously high speeds.
  261. X
  262. X    * you can fly through mountains.
  263. X
  264. X    * engines do not flame-out.  Fly really high (and fast enough)
  265. X      and you can just about get into orbit.  Non-afterburning
  266. X      engine performance does degrade as altitude increases, but
  267. X      afterburner performance gives the extra kick needed to fly
  268. X      much higher than you should be able to.
  269. X
  270. X
  271. XCREDITS
  272. X
  273. XIn the original release, I overlooked several important credits.  The
  274. Xinput routine at the heart of the acm server is based on code from xtrek
  275. Xthat was written by Dan A. Dickey, he has provided some valuable help in
  276. Ximproving the robustness of this code.  The 3-D routines were written by
  277. Xme, but are based closely on two valuable articles from the March and
  278. XApril 1981 issues of Byte Magazine titled "Three-Dimensional Computer
  279. XGraphics" by Franklin C. Crow.
  280. END_OF_FILE
  281. if test 5313 -ne `wc -c <'acm/README'`; then
  282.     echo shar: \"'acm/README'\" unpacked with wrong size!
  283. fi
  284. # end of 'acm/README'
  285. fi
  286. if test -f 'acm/V/lib/VBindColors.c' -a "${1}" != "-c" ; then 
  287.   echo shar: Will not clobber existing file \"'acm/V/lib/VBindColors.c'\"
  288. else
  289. echo shar: Extracting \"'acm/V/lib/VBindColors.c'\" \(4009 characters\)
  290. sed "s/^X//" >'acm/V/lib/VBindColors.c' <<'END_OF_FILE'
  291. X#include "Vlib.h"
  292. X#include <math.h>
  293. X
  294. Xint    pmap (vec, n)
  295. Xunsigned long    *vec;
  296. Xint        n; {
  297. X
  298. X    static int itbl[] = {1, 2, 4, 8};
  299. X    register int i, r=0;
  300. X
  301. X    for (i=0; i<4; ++i)
  302. X    if (itbl[i] & n)
  303. X       r += vec[i];
  304. X    return r;
  305. X}
  306. X
  307. Xint VBindColors (v, background)
  308. XViewport *v;
  309. Xchar * background; {
  310. X
  311. X    register int i, j, k, n, c;
  312. X    static   int parseComplete = 0;
  313. X    unsigned int pixel;
  314. X    VColor     *p;
  315. X    Display    *dpy;
  316. X    XColor    colorSet[MAXPCOLORS];
  317. X    unsigned long planemask[PLANES*2];
  318. X    unsigned long pixels[1];
  319. X
  320. X
  321. X    if (v->flags & VPMono)
  322. X    return 0;
  323. X
  324. X    dpy = v->dpy;
  325. X
  326. X    v->cmap = DefaultColormap(dpy, DefaultScreen(dpy));
  327. X
  328. X/*
  329. X *  If this is a color or greyscale pixmap, allocate color cells for each
  330. X *  color, and then set up the Viewport for drawing.
  331. X */
  332. X
  333. X    if (v->flags & VPPixmap) {
  334. X
  335. X    if (XParseColor(dpy, v->cmap, background, &colorSet[0]) == 0) {
  336. X        fprintf (stderr, "Can't parse color %s\n", background);
  337. X        return -1;
  338. X        }
  339. X    if (XAllocColor (dpy, v->cmap, &colorSet[0]) == 0) {
  340. X        fprintf (stderr, "Not enough pixel space for all colors\n");
  341. X        return -1;
  342. X    }
  343. X    v->aPixel[0] = colorSet[0].pixel;
  344. X
  345. X    for ((i=0, p=VColorList); p != (VColor *) 0; i++) {
  346. X
  347. X        if (i > MAXPCOLORS) {
  348. X            fprintf (stderr, "Too many colors selected.\n");
  349. X            return -1;
  350. X        }
  351. X
  352. X        if (XParseColor (dpy, v->cmap, p->color_name, &colorSet[i+1]) == 0) {
  353. X            fprintf (stderr, "Can't parse color %s\n", p->color_name);
  354. X            return -1;
  355. X        }
  356. X        p->xcolor = colorSet[i+1];
  357. X
  358. X        if (XAllocColor (dpy, v->cmap, &colorSet[i+1]) == 0) {
  359. X        fprintf (stderr, "Not enough pixel space for all colors\n");
  360. X        return -1;
  361. X        }
  362. X        v->aPixel[i+1] = colorSet[i+1].pixel;
  363. X        p->index = i+1;
  364. X        p = p->next;
  365. X    }
  366. X
  367. X    v->colors = i+1;
  368. X    v->set = 0;
  369. X    v->pixel = &(v->aPixel[0]);
  370. X    v->mask = AllPlanes;
  371. X
  372. X    return 0;
  373. X    }
  374. X
  375. X    n = PLANES;
  376. X    c = (int) (pow(2.0, (double) n) + 0.01);
  377. X
  378. X
  379. X    if (XAllocColorCells (dpy, v->cmap, False, planemask, n*2, pixels, 1) == 0) {
  380. X        fprintf (stderr, "Cannot allocate color cells\n");
  381. X        return -1;
  382. X    }
  383. X
  384. X/*
  385. X *  Parse background color
  386. X */
  387. X
  388. X    if (/*parseComplete == 0*/ 1) {
  389. X
  390. X    if (XParseColor(dpy, v->cmap, background, &colorSet[0]) == 0) {
  391. X        fprintf (stderr, "Can't parse color %s\n", background);
  392. X            return -1;
  393. X        }
  394. X
  395. X/*
  396. X *  Parse each color defined in the V Color List
  397. X */
  398. X
  399. X    for ((i=0, p=VColorList); p != (VColor *) 0; i++) {
  400. X        if (i > c) {
  401. X            fprintf (stderr, "Too many colors selected.\n");
  402. X            return -1;
  403. X        }
  404. X        if (XParseColor (dpy, v->cmap, p->color_name, &colorSet[i+1]) == 0) {
  405. X            fprintf (stderr, "Can't parse color %s\n", p->color_name);
  406. X            return -1;
  407. X        }
  408. X        p->xcolor = colorSet[i+1];
  409. X        p->index = i+1;
  410. X        p = p->next;
  411. X    }
  412. X
  413. X    parseComplete = 1;
  414. X    }
  415. X
  416. X    v->colors = i+1;
  417. X
  418. X#ifdef DEBUG
  419. X    fprintf (stderr, "%d colors defined in the V color list.\n", i);
  420. X#endif
  421. X
  422. X/*
  423. X *  PAY ATTENTION!
  424. X *
  425. X *  We will now create a two lists of XColors. Each will expose a particular
  426. X *  drawing buffer (there are two drawing buffers created here).
  427. X *  A drawing is exposed by passing one of these lists to the XSetColors
  428. X *  procedure.
  429. X *  We create a list by iterating through each possible combination of
  430. X *  pixel values, based on the values returned in pixel and planemask.
  431. X *  The pixel value is determined using a function called pmap.  Each pixel
  432. X *  value is assigned the appropriate XColor.
  433. X */
  434. X
  435. X    k = 0;
  436. X    for (i=0; i<v->colors; ++i) {
  437. X    pixel = v->aPixel[i] = pmap(&planemask[0], i) | pixels[0];
  438. X    for (j=0; j<v->colors; ++j) {
  439. X        v->aColor[k] = colorSet[i];
  440. X        v->aColor[k++].pixel = pixel | pmap (&planemask[n], j);
  441. X    }
  442. X    }
  443. X
  444. X    v->aMask = pmap(&planemask[0], (c-1)) | pixels[0];
  445. X
  446. X    k = 0;
  447. X    for (i=0; i<v->colors; ++i) {
  448. X    pixel = v->bPixel[i] = pmap(&planemask[n], i) | pixels[0];
  449. X    for (j=0; j<v->colors; ++j) {
  450. X        v->bColor[k] = colorSet[i];
  451. X        v->bColor[k++].pixel = pixel | pmap(&planemask[0], j);
  452. X    }
  453. X    }
  454. X
  455. X    v->bMask = pmap(&planemask[n], (c-1)) | pixels[0];
  456. X
  457. X    return 0;
  458. X}
  459. END_OF_FILE
  460. if test 4009 -ne `wc -c <'acm/V/lib/VBindColors.c'`; then
  461.     echo shar: \"'acm/V/lib/VBindColors.c'\" unpacked with wrong size!
  462. fi
  463. # end of 'acm/V/lib/VBindColors.c'
  464. fi
  465. if test -f 'acm/V/lib/Vlib.h' -a "${1}" != "-c" ; then 
  466.   echo shar: Will not clobber existing file \"'acm/V/lib/Vlib.h'\"
  467. else
  468. echo shar: Extracting \"'acm/V/lib/Vlib.h'\" \(4364 characters\)
  469. sed "s/^X//" >'acm/V/lib/Vlib.h' <<'END_OF_FILE'
  470. X#ifndef __Vlib
  471. X#define __Vlib
  472. X
  473. X#define VmaxVP    32        /* max # of vertices in a polygon */
  474. X
  475. X#define MAXCOLORS 8        /* max number of colors available */
  476. X                /* when double buffering */
  477. X
  478. X#define MAXPCOLORS    256    /* maximum colors available when */
  479. X                /* using a pixmap */
  480. X
  481. X#if (MAXCOLORS==4)
  482. X#define PLANES 2
  483. X#endif
  484. X#if (MAXCOLORS==8)
  485. X#define PLANES 3
  486. X#endif
  487. X#if (MAXCOLORS==16)
  488. X#define PLANES 4
  489. X#endif
  490. X
  491. X#include <X11/Xlib.h>
  492. X#include <stdio.h>
  493. X#include <memory.h>
  494. X
  495. Xtypedef struct _vcolor {
  496. X    char    *color_name;    /* text name */
  497. X    short    index;        /* index into pixel value table */
  498. X    XColor    xcolor;        /* representation of this color */
  499. X    struct _vcolor *next;
  500. X    } VColor;
  501. X
  502. Xtypedef struct {
  503. X    double    x, y, z;    /* A point or vector in 3-space */
  504. X    } VPoint;
  505. X
  506. Xtypedef struct {
  507. X    short    numVtces;    /* vertex count */
  508. X    VPoint    *vertex;    /* pointer to array of vertices */
  509. X    VColor    *color;        /* pointer to color descriptor */
  510. X    } VPolygon;
  511. X
  512. Xtypedef struct {
  513. X    char    *name;        /* object name */
  514. X    int    numPolys;    /* polygon count */
  515. X    VPolygon **polygon;    /* pointer to array of polygon pointers */
  516. X    } VObject;
  517. X
  518. Xtypedef struct {
  519. X    double    m[4][4];
  520. X    } VMatrix;
  521. X
  522. Xtypedef struct {
  523. X    unsigned long flags;    /* viewport flags */
  524. X    VMatrix      eyeSpace;    /* transforms from world to eyeSpace system */
  525. X    VPolygon  *clipPoly;    /* planes to clip viewed polygons */
  526. X    double      units;    /* world units expressed in meters */
  527. X    double      dist;        /* distance in units from eye to screen */
  528. X    double      xres;        /* x screen resolution in dots per unit */
  529. X    double      yres;        /* y screen resolution in dots per unit */
  530. X    int      width;    /* width of window in dots */
  531. X    int      height;    /* height of window in dots */
  532. X    VPoint      Middl;    /* center of window */
  533. X    VPoint      Scale;    /* scaling factor */
  534. X    Display      *dpy;        /* Display associated with this viewport */
  535. X    int      screen;    /* X screen number */
  536. X    Window      win;
  537. X    Pixmap      monoPixmap;    /* Pixmap used to buffer drawing */
  538. X
  539. X    int      colors;    /* color count */
  540. X    int      set;        /* id of buffer currently in use */
  541. X    unsigned long mask;    /* current plane mask */
  542. X    unsigned long aMask, bMask;
  543. X    unsigned long *pixel;    /* current pixel drawing values */
  544. X    unsigned long aPixel[MAXPCOLORS];
  545. X    unsigned long bPixel[MAXCOLORS];
  546. X    XColor      aColor[MAXCOLORS*MAXCOLORS];
  547. X    XColor      bColor[MAXCOLORS*MAXCOLORS];
  548. X    Colormap  cmap;
  549. X    } Viewport;
  550. X
  551. X#define VGetPolygonPixel(p)        (p->color->xcolor.pixel)
  552. X#define VLookupViewportColor(v,n)    (v->pixel[n])
  553. X#define VGetViewportMask(v)         (v->mask)
  554. X
  555. X/*
  556. X *  Globals
  557. X */
  558. X
  559. XVColor   *VColorList;        /* list of colors needed for drawing */
  560. Xint     usePixmaps;        /* set to one to use Pixmaps on color
  561. X                    viewports */
  562. X
  563. X/*
  564. X *  V macros and function prototypes
  565. X */
  566. X
  567. X#define VDestroyPoints(a)    free((char *) a)
  568. X#define VDestroyPolygon(a)    {free((char *) a->vertex); free((char *) a);}
  569. X
  570. XViewport *VOpenViewport();     /* (Display *, .. ) */
  571. Xvoid     VResizeViewport();    /* (Viewport *, ... ) */
  572. Xvoid     VCloseViewport();    /* (Viewport *) */
  573. XVPolygon *VCreatePolygon();    /* (VPoint *, int, VColor *) */
  574. XVPolygon *VCopyPolygon();    /* (VPolygon *) */
  575. XVPolygon *VClipPolygon();    /* (VPolygon *, VPoint) */
  576. XVPoint     *VCreatePoints();    /* (int) */
  577. XVColor     *VAllocColor();    /* (char *) */
  578. Xint     VBindColors();        /* (Viewport *, char *) */
  579. Xvoid     VExposeBuffer();    /* (Viewport *, GC) */
  580. XVObject     *VReadObject();    /* (FILE *) */
  581. Xint     VWriteObject();    /* (FILE *, VObject *) */
  582. XVMatrix     *VRotate();        /* (VMatrix *, int) */
  583. XVMatrix  *VTranslate();        /* (VMatrix *, double, double, double) */
  584. XVMatrix  *VTranslatePoint();    /* (VMatrix *, VPoint) */
  585. Xdouble     VMatrixDeterminant();    /* (VMatrix *) */
  586. XVMatrix  *VMatrixInvert();    /* (VMatrix *, VMatrix *) */
  587. Xvoid     VTransform();        /* (VPoint *, VMatrix *, VPoint *) */
  588. Xdouble     VDotProd();        /* (Vpoint *, VPoint *) */
  589. Xvoid     VCrossProd();        /* (Vpoint *, VPoint *, VPoint *) */
  590. Xchar     *Vmalloc();        /* (int) */
  591. Xint     VEyeToScreen();
  592. Xint     VWorldToScreen();
  593. X
  594. X/*
  595. X *  Viewport flags (must be changed manually after VOpenViewport for now)
  596. X */
  597. X
  598. X#define    VPClip        1    /* polygons should be clipped before drawing */
  599. X#define VPPerspective    2    /* Z coordinate used for depth information */
  600. X#define VPMono        4    /* Monochrome environment */
  601. X#define VPPixmap    8    /* Use color Pixmap rather than double
  602. X                    buffering */
  603. X
  604. X/*
  605. X *  VRotate options
  606. X */
  607. X
  608. X#define XRotation    1    /* rotate about X axis */
  609. X#define YRotation    2    /* rotate about Y axis */
  610. X#define ZRotation    3    /* rotate about Z axis */
  611. X
  612. X#ifndef SYSV
  613. Xextern char *strdup();
  614. X#endif
  615. X
  616. X#endif
  617. END_OF_FILE
  618. if test 4364 -ne `wc -c <'acm/V/lib/Vlib.h'`; then
  619.     echo shar: \"'acm/V/lib/Vlib.h'\" unpacked with wrong size!
  620. fi
  621. # end of 'acm/V/lib/Vlib.h'
  622. fi
  623. if test -f 'acm/V/test/app.c' -a "${1}" != "-c" ; then 
  624.   echo shar: Will not clobber existing file \"'acm/V/test/app.c'\"
  625. else
  626. echo shar: Extracting \"'acm/V/test/app.c'\" \(5373 characters\)
  627. sed "s/^X//" >'acm/V/test/app.c' <<'END_OF_FILE'
  628. X#include "../lib/Vlib.h"
  629. X#include <X11/Xutil.h>
  630. X#include <math.h>
  631. X
  632. X#define VIEW1
  633. X
  634. Xextern Display  *dpy;
  635. Xextern Window   win;
  636. Xextern GC       curGC;
  637. Xextern XSizeHints xsh;
  638. Xextern int    mono;
  639. X
  640. XVPolygon *poly[1024];
  641. X
  642. Xvoid placeObject (obj, loc, roll, pitch, yaw, poly, cnt)
  643. XVObject *obj;
  644. XVPoint  loc;
  645. Xdouble roll;
  646. Xdouble pitch;
  647. Xdouble yaw;
  648. XVPolygon **poly;
  649. Xint     *cnt; {
  650. X
  651. X    int     i, j, k;
  652. X    VPoint     *q, tmp;
  653. X    VMatrix     mtx;
  654. X
  655. X    j = *cnt;
  656. X
  657. X    VIdentMatrix (&mtx);
  658. X    if (roll != 0.0)
  659. X        VRotate (&mtx, XRotation, roll);
  660. X    if (pitch != 0.0)
  661. X        VRotate (&mtx, YRotation, pitch);
  662. X    if (yaw != 0.0)
  663. X        VRotate (&mtx, ZRotation, yaw);
  664. X    VTranslatePoint (&mtx, loc);
  665. X
  666. X    for (i=0; i<obj->numPolys; ++i) {
  667. X
  668. X        if (poly[j] != (VPolygon *) NULL)
  669. X            VDestroyPolygon (poly[j]);
  670. X
  671. X        poly[j] = VCopyPolygon(obj->polygon[i]);
  672. X        for ((k=0, q=poly[j]->vertex); k<poly[j]->numVtces; (++k, ++q)) {
  673. X            VTransform(q, &mtx, &tmp);
  674. X            *q = tmp;
  675. X        }
  676. X        ++j;
  677. X    }
  678. X
  679. X    *cnt = j;
  680. X}
  681. X
  682. Xapp(background)
  683. Xchar *background; {
  684. X
  685. X    int    i, cnt, black;
  686. X    unsigned int j, curPixel = 0;
  687. X    char    *str;
  688. X    FILE    *file;
  689. X    VObject    *obj, *ftr, *mig;
  690. X    VPoint    viewPt, centerInt, up, ftrLoc, ftrLoc2, ftrLoc3, migLoc1, migLoc2;
  691. X    Viewport *v;
  692. X    double    dist, p, migV, v1, a, migRoll;
  693. X    double    updateRate = 5.0;
  694. X
  695. X    str = "fullrwy";
  696. X
  697. X    if ((file = fopen(str, "r")) == (FILE *) NULL) {
  698. X        perror ("Cannot open object file");
  699. X        exit (1);
  700. X    }
  701. X
  702. X    if ((obj = VReadObject(file)) == (VObject *) NULL) {
  703. X        fprintf (stderr, "Error reading the object definition.\n");
  704. X        exit (1);
  705. X    }
  706. X
  707. X    fclose (file);
  708. X
  709. X    str = "f16";
  710. X
  711. X    if ((file = fopen(str, "r")) == (FILE *) NULL) {
  712. X        perror ("Cannot open object file");
  713. X        exit (1);
  714. X    }
  715. X
  716. X    if ((ftr = VReadObject(file)) == (VObject *) NULL) {
  717. X        fprintf (stderr, "Error reading the object definition.\n");
  718. X        exit (1);
  719. X    }
  720. X
  721. X    fclose (file);
  722. X    
  723. X
  724. X    str = "mig23";
  725. X
  726. X    if ((file = fopen(str, "r")) == (FILE *) NULL) {
  727. X        perror ("Cannot open object file");
  728. X        exit (1);
  729. X    }
  730. X
  731. X    if ((mig = VReadObject(file)) == (VObject *) NULL) {
  732. X        fprintf (stderr, "Error reading the object definition.\n");
  733. X        exit (1);
  734. X    }
  735. X
  736. X    fclose (file);
  737. X    
  738. X    usePixmaps = 0;
  739. X
  740. X    v = VOpenViewport (dpy, 0, win, 12 * 25.4 / 1000.0, 1.5, 1.0, xsh.width,
  741. X        xsh.height);
  742. X
  743. X    if (VBindColors (v, background) < 0) {
  744. X        fprintf (stderr, "Error in binding colors.\n");
  745. X        exit (1);
  746. X    }
  747. X    VExposeBuffer (v, curGC);
  748. X
  749. X
  750. X    ftrLoc.x = 80.0;
  751. X    ftrLoc.y = -110.0;
  752. X    ftrLoc.z = -7.0;
  753. X
  754. X    ftrLoc2.x = 475.0;
  755. X    ftrLoc2.y = 3.7;
  756. X    ftrLoc2.z = -7.0;
  757. X
  758. X    migLoc1.z = -310.0;
  759. X    migLoc2.z = -320.0;
  760. X    migV = 370.0 / 3600.0 * 5280.0 / updateRate;    /* mig speed in fps */
  761. X    migV = migV / (2500.0 * 3.14 * 2.0); /* mig speed in rad/update */
  762. X    migRoll = 28.0 * 3.14 / 180.0;
  763. X    a = 90.0 * 3.14 / 180.0;
  764. X
  765. X    v1 = 130.0 / 3600.0 * 5280.0 / updateRate;
  766. X
  767. X    centerInt.x = 80.0;
  768. X    centerInt.y = -90.0;
  769. X    centerInt.z = -6.0;
  770. X
  771. X    dist = -10000.0; p = 0;
  772. X
  773. X    while (1) {
  774. X
  775. X        ftrLoc3.x = dist+150.0;
  776. X        ftrLoc3.y = -15.0;
  777. X        ftrLoc3.z = (dist+150.0) * 50.0 / 1000.0 - 40.0;
  778. X        if (ftrLoc3.z > -13.0)
  779. X            ftrLoc3.z = -13.0;
  780. X        viewPt.x = dist;
  781. X        viewPt.y = 15.0;
  782. X        viewPt.z = dist * 50.0 / 1000.0 - 50.0;
  783. X        if (viewPt.z > -13.0)
  784. X            viewPt.z = -13.0;
  785. X        up = viewPt;
  786. X        up.z = up.z - 1.0;
  787. X        if (viewPt.z < -14.0)
  788. X            up.y = up.y + 0.1 * sin(p);
  789. X        p = p + 0.03;
  790. X        dist = dist + v1;
  791. X        if (dist > 10000.0)
  792. X            exit (1);
  793. X
  794. X        migLoc1.x = 0.0 + 2200.0 * cos (a);
  795. X        migLoc1.y = -800.0 + 2200.0 * sin (a);
  796. X        migLoc2.x = 0.0 + 2225.0 * cos (a-0.04);
  797. X        migLoc2.y = -800.0 + 2225.0 * sin (a-0.04);
  798. X        a = a + migV;
  799. X
  800. X/*
  801. X *  Now create a vector containing all polygons from the objects.
  802. X */
  803. X
  804. X    for (i=0; i<obj->numPolys; ++i) {
  805. X        if (poly[i] != (VPolygon *) NULL)
  806. X            VDestroyPolygon(poly[i]);
  807. X        poly[i] = VCopyPolygon(obj->polygon[i]);
  808. X    }
  809. X    cnt = obj->numPolys;
  810. X#ifndef VIEW3
  811. X    placeObject (ftr, ftrLoc, 0.0, 0.0, 90.0*3.14/180.0, &poly[0], &cnt);
  812. X#endif
  813. X    placeObject (ftr, ftrLoc2, 0.0, 0.0, -3.0*3.14/180.0, &poly[0], &cnt);
  814. X    placeObject (ftr, ftrLoc3, 0.0, -11.0*3.14/180.0, 0.0, &poly[0], &cnt);
  815. X#ifndef VIEW1
  816. X    placeObject (ftr, viewPt, 0.0, -11.0*3.14/180.0, 0.0, &poly[0], &cnt);
  817. X#endif
  818. X    placeObject (mig, migLoc1, migRoll, 0.0, a+90.0*3.14/180.0, &poly[0], &cnt);
  819. X#ifndef VIEW2
  820. X    placeObject (mig, migLoc2, migRoll, 0.0, a+90.0*3.14/180.0, &poly[0], &cnt);
  821. X#endif
  822. X
  823. X/*
  824. X *  Calculate eye space information based on our current viewpoint.
  825. X */
  826. X
  827. X#ifdef VIEW1
  828. X    VGetEyeSpace (v, viewPt, centerInt, up);
  829. X#endif
  830. X#ifdef VIEW2
  831. X    up = migLoc2;
  832. X    up.z = up.z - 1.0;
  833. X    VGetEyeSpace (v, migLoc2, viewPt, up);
  834. X#endif
  835. X#ifdef VIEW3
  836. X    up = ftrLoc;
  837. X    up.z = up.z - 1.0;
  838. X    VGetEyeSpace (v, ftrLoc, viewPt, up);
  839. X#endif
  840. X
  841. X    black = BlackPixel(dpy, 0);
  842. X
  843. X
  844. X/*
  845. X *  First clip, then draw each polygon.
  846. X */
  847. X
  848. X    for (i=0; i<cnt; ++i) {
  849. X
  850. X        if (mono)
  851. X            XSetForeground (dpy, curGC, black);
  852. X
  853. X        VTransformPolygon (poly[i], &(v->eyeSpace));
  854. X        poly[i] = VClipPolygon(poly[i], v->clipPoly);
  855. X        if (poly[i]) {
  856. X            if (mono == 0 && curPixel != (j=v->pixel[poly[i]->color->index])) {
  857. X            XSetForeground (dpy, curGC, j);
  858. X            curPixel = j;
  859. X            }
  860. X            if (mono)
  861. X                VDrawPolygon (v, win, curGC, poly[i]);
  862. X            else
  863. X                VFillPolygon (v, win, curGC, poly[i]);
  864. X        }
  865. X
  866. X    }
  867. X
  868. X    VExposeBuffer (v, curGC);
  869. X
  870. X/*
  871. X * Erase the un-displayed planes.
  872. X */
  873. X
  874. X    if (mono == 0) {
  875. X        curPixel = *(v->pixel);
  876. X            XSetForeground (dpy, curGC, curPixel);
  877. X        if (usePixmaps == 1)
  878. X            XFillRectangle (dpy, v->monoPixmap, curGC, 0, 0, xsh.width, xsh.height);
  879. X        else
  880. X            XFillRectangle (dpy, win, curGC, 0, 0, xsh.width, xsh.height);
  881. X    }
  882. X
  883. X        }
  884. X
  885. X}
  886. END_OF_FILE
  887. if test 5373 -ne `wc -c <'acm/V/test/app.c'`; then
  888.     echo shar: \"'acm/V/test/app.c'\" unpacked with wrong size!
  889. fi
  890. # end of 'acm/V/test/app.c'
  891. fi
  892. if test -f 'acm/fsim/acm.man' -a "${1}" != "-c" ; then 
  893.   echo shar: Will not clobber existing file \"'acm/fsim/acm.man'\"
  894. else
  895. echo shar: Extracting \"'acm/fsim/acm.man'\" \(6366 characters\)
  896. sed "s/^X//" >'acm/fsim/acm.man' <<'END_OF_FILE'
  897. X.TH ACM l "4 September 1990"
  898. X.SH NAME
  899. Xacm \- an aerial combat simulator for X
  900. X.SH SYNOPSIS
  901. X.B acm
  902. X[
  903. X.I server
  904. X] [
  905. X.I options
  906. X]  
  907. X.LP
  908. X
  909. X.SH DESCRIPTION
  910. X
  911. Xacm is an air combat simulator that runs under the X window system.  Up to
  912. Xeight players can engage in simultaneous air combat.  Players fly jet aircraft
  913. Xequipped with radar, heat seeking missiles and cannon.
  914. X
  915. XThe program, "acm", calls a deamon already running on the specified
  916. Xserver_hostname and requests that your enter the game.  The shell variable
  917. X"ACMSERVER" optionally specifies the name of the server host.
  918. X
  919. XEach player flies something close to either an F-16C Falcon or MIG-23.
  920. X
  921. X
  922. X.SH USAGE REFERENCE
  923. X
  924. XTo begin play, the flight simulator server must be started manually on a
  925. Xsystem that is accessible to all players. 
  926. X
  927. XThe following command line will do that:
  928. X
  929. X.LP
  930. X.TP
  931. X    % acms
  932. X
  933. XThe following command line options are recognized by acm:
  934. X.LP
  935. X.TP
  936. X-geometry geometry_spec
  937. XAn X compatible window geometry specification
  938. X.TP
  939. X-team <1 or 2>
  940. XSpecifies the starting airfield.  Airfields are about 50 nm apart.
  941. XTeam 1 flies F-16's, team 2 flies MIG-23's.
  942. X
  943. X
  944. X.SH HOW TO TAKE-OFF
  945. X
  946. X
  947. XYour mouse is the control stick.  The neutral position is the center of your
  948. Xview display -- denoted by the dot in the center of your heads-up-display (HUD).
  949. XMoving the mouse away from you pitches the plane down, moving it back
  950. Xpitches the plane up.  Left and right inputs roll the aircraft in the
  951. Xcorresponding direction.  On the ground at speeds up to 100 kts, nose
  952. Xwheel steering guides the aircraft.
  953. X
  954. XTo take off for the first time, select 20 degrees of flaps (press H twice),
  955. Xthen press the full throttle key (the 4 key on the main keyboard).  Keep the
  956. Xmouse in the neutral position until you are moving at about 140 kts, then pull
  957. Xthe mouse about two-thirds of the way down the view window.  You should pitch
  958. Xup and lift off the ground fairly easily.  Gradually move the stick closer
  959. Xto the neutral position and let your airspeed build -- don't move it back to
  960. Xneutral too quickly or you will end up back on the ground again!  As your
  961. Xairspeed passes about 250 kts, raise the flaps (press Y twice). Congratulations,
  962. Xyou're flying a multi-million dollar jet.
  963. X
  964. X
  965. X.SH ENGINE CONTROLS
  966. X
  967. X
  968. XThe following keys control your engine thrust:
  969. X
  970. X.LP
  971. X    4    Full Power
  972. X.LP
  973. X    3    Increase Power (about 2 percent)
  974. X.LP
  975. X    2    Decrease Power (about the same amount)
  976. X.LP
  977. X    1    Idle Power
  978. X.LP
  979. X    A    Toggle Afterburner
  980. X
  981. XYour engine gauge displays the power that you are generating.  Below that,
  982. Xyou have displays showing your total fuel remaining as well as your current
  983. Xfuel consumption rate.  The afterburner uses fuel at an amazing rate; use it
  984. Xwisely.
  985. X
  986. X
  987. X.SH LOOKING AROUND
  988. X
  989. X
  990. XThe keys of the numeric keypad control which direction you're looking outside
  991. Xof the cockpit:
  992. X
  993. X.LP
  994. X        8 Forward
  995. X.LP    
  996. X    4 Left    5 Up    6 Right
  997. X.LP
  998. X        2 Aft
  999. X
  1000. XIt pays to look around when you're in a combat environment.  Your chances
  1001. Xof staying alive increase remarkably.
  1002. X
  1003. X
  1004. X.SH THE HEADS UP DISPLAY (HUD)
  1005. X
  1006. X
  1007. XOn the left side of the HUD is a ladder showing your current airspeed in
  1008. Xnautical miles per hour (it displays true airspeed).  Above that, in the
  1009. Xupper left corner, is a G-meter.  
  1010. X
  1011. XThe right ladder shows altitude; above that
  1012. Xis a readout of your current angle-of-attack in degrees ("a=X.X").  
  1013. XYour
  1014. Xjet will stall at a 30 degrees positive angle of attack and negative 16 
  1015. Xdegrees. 
  1016. X
  1017. XThe airplane symbol (something like "-O-") shows the direction
  1018. Xthat the relative wind is coming from.  The relative wind combines your
  1019. Xcurrent angles of attack and sideslip.  A ladder in the center of the
  1020. XHUD show your aircraft's current attitude. 
  1021. X
  1022. XThe lower, horizontal ladder shows your current heading.  Discretes in the
  1023. Xlower left-hand corner show the state of your weapons systems.  Slightly
  1024. Xabove them is a readout of your current thrust percentage as well as the
  1025. Xstate of your engine's afterburner -- the "AB" symbol means the
  1026. Xafterburner is on.
  1027. X
  1028. X
  1029. X.SH USING YOUR RADAR DISPLAY
  1030. X
  1031. X
  1032. XThe radar system has a field of view of 130 degrees vertically and side-to-side.
  1033. XRadar automatically locks onto the closest threat in its field of view.  A
  1034. Xlocked target is displayed as a solid block.  Other hostile targets are 
  1035. Xdisplayed as hollow squares.
  1036. X
  1037. XTargetting information is displayed in the lower right corner of the display.
  1038. XThe top number is the heading of the locked target, the next number is the
  1039. Xrelative heading you should steer to intercept the target (displayed as
  1040. X"ddd R", and the third number is the rate that you are closing with this
  1041. Xtarget, expressed in knots.
  1042. X
  1043. XYou can lock onto other targets by pressing the target designator key (Q).
  1044. X
  1045. X
  1046. X.SH WHO'S GUNNING FOR ME?
  1047. X
  1048. X
  1049. XRadar sets that are tracking your aircraft can be detected.  Your Threat
  1050. XEarly Warning System (TEWS) display warns you of potential threats.  This
  1051. Xcircular display shows the relative direction of radars (other aircraft)
  1052. Xthat are looking at you.
  1053. X
  1054. X.SH ARMAMENTS
  1055. X
  1056. X
  1057. XYour aircraft is equipped with heat-seeking missiles and a 20 millimeter
  1058. Xcannon.  Weapon information is displayed in the lower left-hand corner of
  1059. Xyour HUD.  Different weapons may be selected by pressing mouse button 3.
  1060. X
  1061. XThe missiles are patterned after U.S. AIM-9M Sidewinders.  They can
  1062. Xdetect infared (IR) targets at any aspect (not just from the rear).  Their
  1063. Xrange varies dramatically with the altitude and closure rate.  The
  1064. Xmissile subsystem couples with your radar set to provide time-to-impact
  1065. Xinformation when AIM-9's are selected.
  1066. X
  1067. X
  1068. X.SH EXAMPLES
  1069. X
  1070. X acm bismarck 
  1071. X
  1072. X acm bismarck -geometry 1000x500
  1073. X
  1074. X.SH KEYBOARD COMMAND LIST
  1075. X
  1076. XStick and Rudder Controls
  1077. X
  1078. X.LP
  1079. XThe Mouse if your stick.  It controls pitch and roll.
  1080. X.LP
  1081. XZ -- Rudder Left
  1082. X.LP
  1083. XC -- Rudder Right
  1084. X.LP
  1085. XX -- Center the Rudder
  1086. X
  1087. X
  1088. X
  1089. XEngine Controls
  1090. X
  1091. X.LP
  1092. X4 -- Full Power
  1093. X.LP
  1094. X3 -- Increase Power
  1095. X.LP
  1096. X2 -- Decrease Power
  1097. X.LP
  1098. X1 -- Idle
  1099. X.LP
  1100. XA -- Toggle Afterburner State
  1101. X
  1102. X
  1103. X
  1104. XRadar Controls
  1105. X
  1106. X.LP
  1107. XR -- Toggle Radar State (On/Standby)
  1108. X.LP
  1109. XQ -- Target Designator
  1110. X
  1111. X
  1112. X
  1113. XFlaps
  1114. X
  1115. X.LP
  1116. XH -- Extend 10 degrees
  1117. X.LP
  1118. XY -- Retract 10 degrees
  1119. X
  1120. X
  1121. X
  1122. XSpeed Brakes
  1123. X
  1124. X.LP
  1125. XS -- Extend
  1126. X.LP
  1127. XW -- Retract
  1128. X
  1129. X
  1130. XWeapon Controls
  1131. X
  1132. X.LP
  1133. XMouse Button 2 -- Fire the selected weapon
  1134. X.LP
  1135. XMouse Button 3 -- Select another weapon
  1136. X
  1137. X
  1138. XOther Controls
  1139. X
  1140. X.LP
  1141. XP -- Self-Destruct (Quit the game)
  1142. X.LP
  1143. XL -- Launch a target drone
  1144. X
  1145. X
  1146. X
  1147. XView Controls (Numeric Keypad)
  1148. X
  1149. X.LP
  1150. X8 -- Forward
  1151. X.LP
  1152. X2 -- Aft
  1153. X.LP
  1154. X4 -- Left
  1155. X.LP
  1156. X6 -- Right
  1157. X.LP
  1158. X5 -- Up
  1159. X
  1160. X
  1161. X.SH AUTHOR
  1162. XRiley Rainey, riley@mips.com
  1163. END_OF_FILE
  1164. if test 6366 -ne `wc -c <'acm/fsim/acm.man'`; then
  1165.     echo shar: \"'acm/fsim/acm.man'\" unpacked with wrong size!
  1166. fi
  1167. # end of 'acm/fsim/acm.man'
  1168. fi
  1169. if test -f 'acm/fsim/aim9m.c' -a "${1}" != "-c" ; then 
  1170.   echo shar: Will not clobber existing file \"'acm/fsim/aim9m.c'\"
  1171. else
  1172. echo shar: Extracting \"'acm/fsim/aim9m.c'\" \(4304 characters\)
  1173. sed "s/^X//" >'acm/fsim/aim9m.c' <<'END_OF_FILE'
  1174. X/*
  1175. X *    xflight : an aerial combat simulator for X
  1176. X *
  1177. X *    Written by Riley Rainey,  riley@mips.com
  1178. X *
  1179. X *    Permission to use, copy, modify and distribute (without charge) this
  1180. X *    software, documentation, images, etc. is granted, provided that this 
  1181. X *    comment and the author's name is retained.
  1182. X *
  1183. X */
  1184. X#include "pm.h"
  1185. X#include <stdio.h>
  1186. X#include <string.h>
  1187. X#include <math.h>
  1188. X
  1189. Xint select_aim9m();
  1190. Xint display_aim9m();
  1191. Xint update_aim9m();
  1192. Xint fire_aim9m();
  1193. Xint getIRTarget();
  1194. Xextern int fireMissile ();
  1195. Xextern void createMissileEyeSpace();
  1196. Xextern FILE * acm_fopen ();
  1197. X
  1198. XweaponDesc aim9mDesc = {
  1199. X    WK_AIM9M,
  1200. X    select_aim9m,        /* select */
  1201. X    update_aim9m,        /* update */
  1202. X    display_aim9m,        /* display procedure */
  1203. X    fire_aim9m,        /* fire */
  1204. X    (int (*)()) NULL,    /* fire button release */
  1205. X    };
  1206. X
  1207. Xint    hasFired[MAXPLAYERS];
  1208. X
  1209. X/*
  1210. X *  aim9m selection function
  1211. X *
  1212. X *  A selection function normally determines whether there are any weapons
  1213. X *  of this type on-board.  If so, and the weapon system is functional
  1214. X *  (in other words, undamaged) then return 1; otherwise return 0.
  1215. X */
  1216. X
  1217. X/*ARGSUSED*/
  1218. Xint select_aim9m (c)
  1219. Xcraft *c; {
  1220. X
  1221. X    hasFired[c->index] = 0;
  1222. X    return 1;
  1223. X
  1224. X}
  1225. X
  1226. X/*ARGSUSED*/
  1227. Xint update_aim9m (c)
  1228. Xcraft *c; {
  1229. X
  1230. X    if (hasFired[c->index]) {
  1231. X        fireMissile (c);
  1232. X        hasFired[c->index] = 0;
  1233. X    }
  1234. X}
  1235. X
  1236. X/*ARGSUSED*/
  1237. Xint fire_aim9m (c)
  1238. Xcraft *c; {
  1239. X
  1240. X    hasFired[c->index] = 1;
  1241. X}
  1242. X
  1243. X/*
  1244. X * aim9m display function
  1245. X *
  1246. X *  Update the HUD display strings associated with this weapon system.
  1247. X */
  1248. X
  1249. X/*ARGSUSED*/
  1250. Xint display_aim9m (c, w, u)
  1251. Xcraft *c;
  1252. XcraftType *w;
  1253. Xviewer *u; {
  1254. X
  1255. X    char    s[16];
  1256. X    double    d, a1, v, r, root1, root2, n, t;
  1257. X    VPoint    tmp;
  1258. X    VMatrix    m;
  1259. X    int    target, count;
  1260. X
  1261. X    count = 8;
  1262. X
  1263. X    sprintf (s, "%d AIM-9M", count);
  1264. X    strcpy (c->leftHUD[1], s);
  1265. X
  1266. X    v = mag (c->Cg);
  1267. X    a1 = (w->maxThrust - 0.5 * c->rho * w->CDOrigin * v * v)
  1268. X        / (w->emptyWeight + w->maxFuel) * a;
  1269. X
  1270. X    if (c->curRadarTarget >= 0 && a1 >= 0.0) {
  1271. X
  1272. X    d = c->targetDistance;
  1273. X    r = c->targetClosure;
  1274. X
  1275. X    n = 4.0 * d / a1 + (r * r) / (a1 * a1);
  1276. X    if (n > 0) {
  1277. X        n = sqrt (n);
  1278. X        root1 = (- r / a + n) / 2.0;
  1279. X        root2 = (- r / a - n) / 2.0;
  1280. X        if (root1 >= 0.0)
  1281. X            if (root2 >= 0.0)
  1282. X                if (root1 < root2)
  1283. X                    t = root1;
  1284. X                else
  1285. X                    t = root2;
  1286. X            else
  1287. X                t = root1;
  1288. X        else if (root2 >= 0.0)
  1289. X            t = root2;
  1290. X        else
  1291. X            t = -1.0;
  1292. X    }
  1293. X    else
  1294. X        t = -1.0;
  1295. X    }
  1296. X
  1297. X    else
  1298. X        t = -1.0;
  1299. X
  1300. X/*
  1301. X *  See if the missiles can lock onto any target.
  1302. X */
  1303. X
  1304. X    if (count > 0) {
  1305. X        createMissileEyeSpace (c, &m);
  1306. X        target = getIRTarget (c, &m, &tmp);
  1307. X    }
  1308. X    else
  1309. X        target = -1;
  1310. X
  1311. X    if (target >= 0 && t <= 15.0)
  1312. X        sprintf (s, "LOCKED   %d", (int)(t+0.5));
  1313. X    else if (t < 0.0)
  1314. X        sprintf (s, "ARM      --");
  1315. X    else if (t <= 15.0)
  1316. X        sprintf (s, "IN RANGE %d", (int)(t+0.5));
  1317. X    else 
  1318. X        sprintf (s, "ARM      %d", (int)(t+0.5));
  1319. X
  1320. X    strcpy (c->leftHUD[0], s);
  1321. X
  1322. X    strcpy (c->leftHUD[2], "");
  1323. X
  1324. X    return(0);
  1325. X}
  1326. X
  1327. Xextern craftType * newCraft ();
  1328. X
  1329. Xvoid initaim9()
  1330. X{
  1331. X
  1332. X    craftType    *c;
  1333. X    FILE        *f;
  1334. X
  1335. X    c = newCraft();
  1336. X    c->name = strdup("aim-9m");
  1337. X
  1338. X    wtbl[0] = aim9mDesc;
  1339. X    wtbl[0].w = c;
  1340. X
  1341. X    c->CLOrigin = 0.0;
  1342. X    c->CLSlope = 4.41235;
  1343. X    c->CLNegStall = -15.0 * pi / 180.0;
  1344. X    c->CLPosStall =  15.0 * pi / 180.0;
  1345. X
  1346. X    c->CDOrigin = 0.1963494;    /* 4" radius of body */
  1347. X    c->CDFactor = -2.56694;
  1348. X    c->CDPhase = 0.0;
  1349. X
  1350. X    c->CDBOrigin = 0.0;
  1351. X    c->CDBFactor = 0.0;
  1352. X    c->CDBPhase = 0.0;
  1353. X
  1354. X    c->CMOrigin = 0.0;
  1355. X    c->CMFactor = -0.75;
  1356. X
  1357. X    c->CNOrigin = 0.0;
  1358. X    c->CNFactor = -0.75;
  1359. X
  1360. X    VIdentMatrix(&(c->I));
  1361. X    c->I.m[0][0] =  0.0;
  1362. X    c->I.m[1][1] = 0.0;
  1363. X    c->I.m[2][2] = 0.0;
  1364. X    c->LDamp =  700000.0;
  1365. X    c->MDamp = 1000000.0;
  1366. X    c->NDamp = 1000000.0;
  1367. X    c->cmSlope = -1.88;
  1368. X    c->cmFactor = -1.00;
  1369. X    c->cnSlope = 1.00;
  1370. X    c->cnFactor = 0.50;
  1371. X    c->betaStall = 15.0 * pi / 180.0;
  1372. X
  1373. X    c->wingS = 1.0;
  1374. X
  1375. X/*
  1376. X *  Assume 150.0 lbs of weight is fuel and that it burns for 20 seconds.
  1377. X *  That yields a fuel burn rate of 7.5 lbs/second.
  1378. X */
  1379. X
  1380. X    c->emptyWeight = 40.0;
  1381. X    c->maxFuel = 150.0;
  1382. X    c->maxThrust = 791.0;
  1383. X    c->spFuelConsump = 34.134;
  1384. X
  1385. X/*
  1386. X *  Three second arming delay
  1387. X */
  1388. X
  1389. X    c->armDelay = 3.0;
  1390. X
  1391. X    c->groundingPoint.x = 0.0;
  1392. X    c->groundingPoint.y = 0.0;
  1393. X    c->groundingPoint.z = 0.0;
  1394. X
  1395. X    c->viewPoint.x = 0.0;
  1396. X    c->viewPoint.y = 0.0;
  1397. X    c->viewPoint.z = 0.0;
  1398. X
  1399. X    c->crashC = 1.0;
  1400. X
  1401. X    c->muStatic = 0.0;
  1402. X    c->muKinetic = 0.0;
  1403. X    c->muBStatic = 0.0;
  1404. X    c->muBKinetic = 0.0;
  1405. X
  1406. X    c->maxNWDef = 0.0;
  1407. X    c->NWIncr = 0.0;
  1408. X    c->maxNWS = 0.0;
  1409. X    c->gearD1 = 0.0;
  1410. X    c->gearD2 = 0.0;
  1411. X
  1412. X    f = acm_fopen ("aim-9", "r");
  1413. X    c->object = VReadObject(f);
  1414. X    fclose (f);
  1415. X
  1416. X}
  1417. END_OF_FILE
  1418. if test 4304 -ne `wc -c <'acm/fsim/aim9m.c'`; then
  1419.     echo shar: \"'acm/fsim/aim9m.c'\" unpacked with wrong size!
  1420. fi
  1421. # end of 'acm/fsim/aim9m.c'
  1422. fi
  1423. if test -f 'acm/fsim/doEvents.c' -a "${1}" != "-c" ; then 
  1424.   echo shar: Will not clobber existing file \"'acm/fsim/doEvents.c'\"
  1425. else
  1426. echo shar: Extracting \"'acm/fsim/doEvents.c'\" \(5451 characters\)
  1427. sed "s/^X//" >'acm/fsim/doEvents.c' <<'END_OF_FILE'
  1428. X/*
  1429. X *    xflight : an aerial combat simulator for X
  1430. X *
  1431. X *    Written by Riley Rainey,  riley@mips.com
  1432. X *
  1433. X *    Permission to use, copy, modify and distribute (without charge) this
  1434. X *    software, documentation, images, etc. is granted, provided that this 
  1435. X *    comment and the author's name is retained.
  1436. X *
  1437. X */
  1438. X#include "pm.h"
  1439. X#include <X11/Xutil.h>
  1440. X#include <X11/keysym.h>
  1441. X
  1442. X#define MAX_MAPPED_STRING_LEN    10
  1443. X#define MAX_POPUP_STRING_LEN    40
  1444. X
  1445. Xextern int cur;
  1446. X
  1447. Xvoid doEvents(c)
  1448. Xcraft *c; 
  1449. X{
  1450. X
  1451. X    XEvent        ev;
  1452. X    viewer        *u;
  1453. X    int        player;
  1454. X    double        scale;
  1455. X
  1456. X/*
  1457. X *  Process events for each player and any "back seaters"
  1458. X */
  1459. X
  1460. X    player = 1;
  1461. X    for (u=c->vl; u != (viewer *) NULL; u=u->next) {
  1462. X
  1463. X
  1464. X#define mask     (-1L)
  1465. X
  1466. X        if (cur % REDRAW_EVERY == 0)
  1467. X            getStick (c, u);
  1468. X
  1469. X        while (XEventsQueued(u->dpy, QueuedAlready)) {
  1470. X
  1471. X            XWindowEvent (u->dpy, u->win, mask, &ev);
  1472. X
  1473. X            switch (ev.type) {
  1474. X
  1475. X            case KeyPress:
  1476. X                if (doKeyEvent (c, u, &ev, player) < 0)
  1477. X                    return;
  1478. X                break;
  1479. X
  1480. X            case ButtonPress:
  1481. X                if (doButtonEvent (c, u, &ev, player) < 0)
  1482. X                    return;
  1483. X                break;
  1484. X
  1485. X            case ButtonRelease:
  1486. X                if (doButtonReleaseEvent (c, u, &ev, player) < 0)
  1487. X                    return;
  1488. X                break;
  1489. X
  1490. X            case ConfigureNotify:
  1491. X                scale = (double) ev.xconfigure.height /
  1492. X                    (double) FS_WINDOW_HEIGHT;
  1493. X                u->width = ev.xconfigure.width;
  1494. X                u->height = ev.xconfigure.height;
  1495. X                u->height = u->height * VIEW_WINDOW_HEIGHT /
  1496. X                    FS_WINDOW_HEIGHT;
  1497. X                u->xCenter = u->width / 2;
  1498. X                u->yCenter = u->height / 2;
  1499. X                VResizeViewport (u->v, 12.0*25.4/1000.0,
  1500. X                    0.40, scale, u->width, u->height);
  1501. X                break;
  1502. X
  1503. X            default:
  1504. X                break;
  1505. X            }
  1506. X
  1507. X        }
  1508. X
  1509. X        player = 0;
  1510. X
  1511. X    }
  1512. X}
  1513. X
  1514. X/*ARGSUSED*/
  1515. Xint doButtonEvent (c, u, ev, player)
  1516. Xcraft    *c;
  1517. Xviewer    *u;
  1518. XXEvent    *ev;
  1519. Xint    player; {
  1520. X
  1521. X    if (ev->xbutton.button == Button2)
  1522. X        fireWeapon (c);
  1523. X
  1524. X    else if (ev->xbutton.button == Button3)
  1525. X        selectWeapon (c);
  1526. X
  1527. X    return 0;
  1528. X}
  1529. X
  1530. X/*ARGSUSED*/
  1531. Xint doButtonReleaseEvent (c, u, ev, player)
  1532. Xcraft    *c;
  1533. Xviewer    *u;
  1534. XXEvent    *ev;
  1535. Xint    player; {
  1536. X
  1537. X    if (ev->xbutton.button == Button2)
  1538. X        ceaseFireWeapon (c);
  1539. X
  1540. X    return 0;
  1541. X}
  1542. X
  1543. X/*ARGSUSED*/
  1544. Xint doKeyEvent (c, u, ev, player)
  1545. Xcraft    *c;
  1546. Xviewer    *u;
  1547. XXEvent    *ev;
  1548. Xint    player; 
  1549. X{
  1550. X
  1551. X    KeySym        keysym;
  1552. X    XComposeStatus    compose;
  1553. X    char        buffer[MAX_MAPPED_STRING_LEN];
  1554. X    int        buflen = MAX_MAPPED_STRING_LEN;
  1555. X
  1556. X    (void) XLookupString (&ev->xkey, buffer, buflen, &keysym, &compose);
  1557. X
  1558. X    if (player) {
  1559. X
  1560. X        switch (keysym) {
  1561. X
  1562. X        case XK_Left:
  1563. X            if (c->flags & FL_NWS) {
  1564. X                c->curNWDef = c->curNWDef - c->cinfo->NWIncr;
  1565. X                if (c->curNWDef < - c->cinfo->maxNWDef)
  1566. X                    c->curNWDef = - c->cinfo->maxNWDef;
  1567. X            }
  1568. X            else {
  1569. X                c->Sa =  c->Sa - 0.05;
  1570. X            }
  1571. X            break;
  1572. X
  1573. X        case XK_Right:
  1574. X            if (c->flags & FL_NWS) {
  1575. X                c->curNWDef = c->curNWDef + c->cinfo->NWIncr;
  1576. X                if (c->curNWDef > c->cinfo->maxNWDef)
  1577. X                    c->curNWDef = c->cinfo->maxNWDef;
  1578. X            }
  1579. X            else {
  1580. X                c->Sa = c->Sa + 0.05;
  1581. X            }
  1582. X            break;
  1583. X
  1584. X        case XK_Up:
  1585. X            c->Se = c->Se - 0.01;
  1586. X            break;
  1587. X
  1588. X        case XK_Down:
  1589. X            c->Se = c->Se + 0.01;
  1590. X            break;
  1591. X
  1592. X        case XK_z:
  1593. X        case XK_Z:
  1594. X            c->Sr = c->Sr + 0.01;
  1595. X            break;
  1596. X
  1597. X        case XK_c:
  1598. X        case XK_C:
  1599. X            c->Sr = c->Sr - 0.01;
  1600. X            break;
  1601. X
  1602. X        case XK_x:
  1603. X        case XK_X:
  1604. X            c->Sr = 0.0;
  1605. X            break;
  1606. X
  1607. X        case XK_Home:
  1608. X            c->Se = 0.0;
  1609. X            c->Sr = 0.0;
  1610. X            c->Sa = 0.0;
  1611. X            break;
  1612. X
  1613. X        case XK_y:
  1614. X        case XK_Y:
  1615. X            flapsUp (c);
  1616. X            break;
  1617. X
  1618. X        case XK_h:
  1619. X        case XK_H:
  1620. X            flapsDown (c);
  1621. X            break;
  1622. X
  1623. X        case XK_w:
  1624. X        case XK_W:
  1625. X            speedBrakeRetract (c);
  1626. X            break;
  1627. X
  1628. X        case XK_s:
  1629. X        case XK_S:
  1630. X            speedBrakeExtend (c);
  1631. X            break;
  1632. X
  1633. X        case XK_2:
  1634. X        case XK_KP_Subtract:
  1635. X            c->throttle = (c->throttle <= 6553) ? 6553 :
  1636. X                c->throttle - 512;
  1637. X            c->curThrust = calcThrust(c);
  1638. X            break;
  1639. X
  1640. X        case XK_3:
  1641. X        case XK_KP_Add:
  1642. X            c->throttle = (c->throttle >= 32768) ? 32768 :
  1643. X                c->throttle + 512;
  1644. X            c->curThrust = calcThrust(c);
  1645. X            break;
  1646. X
  1647. X        case XK_4:
  1648. X        case XK_Prior:
  1649. X            c->throttle = 32768;
  1650. X            c->curThrust = calcThrust(c);
  1651. X            break;
  1652. X
  1653. X        case XK_1:
  1654. X        case XK_Next:
  1655. X            c->throttle = 8192;
  1656. X            c->curThrust = calcThrust(c);
  1657. X            break;
  1658. X
  1659. X        case XK_A:
  1660. X        case XK_a:
  1661. X            c->flags ^= FL_AFTERBURNER;
  1662. X            c->curThrust = calcThrust(c);
  1663. X            break;
  1664. X
  1665. X        case XK_B:
  1666. X        case XK_b:
  1667. X            c->flags ^= FL_BRAKES;
  1668. X            break;
  1669. X
  1670. X        case XK_L:
  1671. X        case XK_l:
  1672. X            newDrone (c);
  1673. X            break;
  1674. X
  1675. X        case XK_KP_8:
  1676. X            c->viewDirection.x = 1.0;
  1677. X            c->viewDirection.y = 0.0;
  1678. X            c->viewDirection.z = 0.0;
  1679. X            c->viewUp.x = 0.0;
  1680. X            c->viewUp.y = 0.0;
  1681. X            c->viewUp.z = -1.0;
  1682. X            break;
  1683. X
  1684. X/* look right */
  1685. X
  1686. X        case XK_KP_6:
  1687. X            c->viewDirection.x = 0.0;
  1688. X            c->viewDirection.y = 1.0;
  1689. X            c->viewDirection.z = 0.0;
  1690. X            c->viewUp.x = 0.0;
  1691. X            c->viewUp.y = 0.0;
  1692. X            c->viewUp.z = -1.0;
  1693. X            break;
  1694. X
  1695. X/* look left */
  1696. X
  1697. X        case XK_KP_4:
  1698. X            c->viewDirection.x = 0.0;
  1699. X            c->viewDirection.y = -1.0;
  1700. X            c->viewDirection.z = 0.0;
  1701. X            c->viewUp.x = 0.0;
  1702. X            c->viewUp.y = 0.0;
  1703. X            c->viewUp.z = -1.0;
  1704. X            break;
  1705. X
  1706. X/* look back */
  1707. X
  1708. X        case XK_KP_2:
  1709. X            c->viewDirection.x = -1.0;
  1710. X            c->viewDirection.y = 0.0;
  1711. X            c->viewDirection.z = 0.0;
  1712. X            c->viewUp.x = 0.0;
  1713. X            c->viewUp.y = 0.0;
  1714. X            c->viewUp.z = -1.0;
  1715. X            break;
  1716. X
  1717. X/* look up */
  1718. X
  1719. X        case XK_KP_5:
  1720. X            c->viewDirection.x = 0.0;
  1721. X            c->viewDirection.y = 0.0;
  1722. X            c->viewDirection.z = -1.0;
  1723. X            c->viewUp.x = -1.0;
  1724. X            c->viewUp.y = 0.0;
  1725. X            c->viewUp.z = 0.0;
  1726. X            break;
  1727. X
  1728. X        case XK_Q:
  1729. X        case XK_q:
  1730. X            c->curRadarTarget = getRadarTarget (c, 1);
  1731. X            break;
  1732. X
  1733. X        case XK_R:
  1734. X        case XK_r:
  1735. X            c->radarMode = (c->radarMode == RM_STANDBY) ?
  1736. X                RM_NORMAL : RM_STANDBY;
  1737. X            break;
  1738. X
  1739. X        case XK_o:
  1740. X            if (absorbDamage(c, 3) == 0) {
  1741. X                killPlayer (c);
  1742. X                return -1;
  1743. X            }
  1744. X            break;
  1745. X
  1746. X        case XK_P:
  1747. X        case XK_p:
  1748. X            killPlayer (c);
  1749. X            return -1;
  1750. X        }
  1751. X
  1752. X    }
  1753. X
  1754. X    return 0;
  1755. X}
  1756. END_OF_FILE
  1757. if test 5451 -ne `wc -c <'acm/fsim/doEvents.c'`; then
  1758.     echo shar: \"'acm/fsim/doEvents.c'\" unpacked with wrong size!
  1759. fi
  1760. # end of 'acm/fsim/doEvents.c'
  1761. fi
  1762. if test -f 'acm/fsim/doScale.c' -a "${1}" != "-c" ; then 
  1763.   echo shar: Will not clobber existing file \"'acm/fsim/doScale.c'\"
  1764. else
  1765. echo shar: Extracting \"'acm/fsim/doScale.c'\" \(3959 characters\)
  1766. sed "s/^X//" >'acm/fsim/doScale.c' <<'END_OF_FILE'
  1767. X#include <X11/Xlib.h>
  1768. X#include <stdio.h>
  1769. X#include "scale.h"
  1770. X
  1771. Xstatic char *skipBlanks (s)
  1772. Xchar *s; {
  1773. X
  1774. X    for (; *s == ' '; s++) ;
  1775. X    return s;
  1776. X}
  1777. X
  1778. Xvoid doScale (dpy, win, gc, s, value, fth, ftw)
  1779. XDisplay        *dpy;
  1780. XWindow        win;
  1781. XGC        gc;
  1782. XscaleControl    *s;
  1783. Xdouble        value;
  1784. Xint        fth;
  1785. Xint        ftw; {
  1786. X
  1787. X    XPoint        p;
  1788. X    XSegment    seg[32];
  1789. X    int        is = 0;
  1790. X    double        vStart;
  1791. X    int        top = s->yorg - s->length;
  1792. X    int        y, w, v, n;
  1793. X    int        ytick = (double) s->minorInterval / s->scale + 0.5;
  1794. X    int        doMajor;
  1795. X    char        str[16], *q;
  1796. X
  1797. X    vStart = value - (double) (s->length / 2) * s->scale;
  1798. X    n = (int) vStart % s->minorInterval;
  1799. X    if (n > 0)
  1800. X        n = n - s->minorInterval;
  1801. X    y = s->yorg + (int) (n / s->scale);
  1802. X    if (vStart > 0.0)
  1803. X        v = (int) (vStart + s->minorInterval - 1.0);
  1804. X    else
  1805. X        v = (int) vStart;
  1806. X    v = v / s->minorInterval * s->minorInterval;
  1807. X
  1808. X/*
  1809. X *  Draw the index mark
  1810. X */
  1811. X
  1812. X    seg[is].y1 = seg[is].y2 = s->yorg - ((double) s->length / 2.0);
  1813. X    if (s->orientation & orientRight) {
  1814. X        seg[is].x1 = s->xorg - 2;
  1815. X        seg[is].x2 = seg[is].x1 - s->indexSize;
  1816. X    }
  1817. X    else {
  1818. X        seg[is].x1 = s->xorg + 2;
  1819. X        seg[is].x2 = seg[is].x1 + s->indexSize;
  1820. X    }
  1821. X    ++ is;
  1822. X
  1823. X/*
  1824. X *  step through the doMajor and minor ticks
  1825. X */
  1826. X
  1827. X    for (; y > top; (y -= ytick, v += s->minorInterval)) {
  1828. X
  1829. X/*  we don't mark negative ticks */
  1830. X
  1831. X        if (v < 0)
  1832. X            continue;
  1833. X
  1834. X        seg[is].x1 = s->xorg;
  1835. X        seg[is].y1 = seg[is].y2 = p.y = y;
  1836. X
  1837. X        if ((v % s->majorInterval) == 0) {
  1838. X            doMajor = 1;
  1839. X            w = s->majorSize;
  1840. X            if (s->orientation & orientRight)
  1841. X                seg[is].x2 = s->xorg + w;
  1842. X            else
  1843. X                seg[is].x2 = s->xorg - w;
  1844. X            sprintf (str, s->format, (double) v / s->divisor);
  1845. X            q = skipBlanks (str);
  1846. X            p.y += 0.30 * (double) fth;
  1847. X            if (s->orientation & orientRight) {
  1848. X                p.x = seg[is].x2 + 3;
  1849. X            }
  1850. X            else {
  1851. X                p.x = seg[is].x2 - 3 - ftw * strlen(q);
  1852. X            }
  1853. X        }
  1854. X        else {
  1855. X            doMajor = 0;
  1856. X            w = s->minorSize;
  1857. X            if (s->orientation & orientRight)
  1858. X                seg[is].x2 = s->xorg + w;
  1859. X            else
  1860. X                seg[is].x2 = s->xorg - w;
  1861. X        }
  1862. X
  1863. X        if (doMajor)
  1864. X            XDrawString (dpy, win, gc, p.x, p.y, q,
  1865. X                strlen (q));
  1866. X        ++ is;     
  1867. X    }
  1868. X
  1869. X    XDrawSegments (dpy, win, gc, seg, is);
  1870. X
  1871. X}
  1872. X
  1873. Xvoid doCompassScale (dpy, win, gc, s, value, fth, ftw)
  1874. XDisplay        *dpy;
  1875. XWindow        win;
  1876. XGC        gc;
  1877. XscaleControl    *s;
  1878. Xdouble        value;
  1879. Xint        fth;
  1880. Xint        ftw; {
  1881. X
  1882. X    XPoint        p;
  1883. X    XSegment    seg[32];
  1884. X    int        is = 0;
  1885. X    double        vStart;
  1886. X    int        top = s->xorg + s->length;
  1887. X    int        x, w, v, n;
  1888. X    int        xtick = (double) s->minorInterval / s->scale + 0.5;
  1889. X    int        doMajor;
  1890. X    char        str[16], *q;
  1891. X
  1892. X    vStart = value - (double) (s->length / 2) * s->scale;
  1893. X    if (vStart <= 0.0)
  1894. X        vStart += 36000.0;
  1895. X    n = (int) vStart % s->minorInterval;
  1896. X    if (n > 0)
  1897. X        n = n - s->minorInterval;
  1898. X    x = s->xorg - (int) (n / s->scale);
  1899. X    if (vStart > 0.0)
  1900. X        v = (int) (vStart + s->minorInterval - 1.0);
  1901. X    else
  1902. X        v = (int) vStart;
  1903. X    v = v / s->minorInterval * s->minorInterval;
  1904. X
  1905. X/*
  1906. X *  Draw the index mark
  1907. X */
  1908. X
  1909. X    seg[is].x1 = seg[is].x2 = s->xorg + (int) ((double) s->length / 2.0 + 0.5);
  1910. X    if (s->orientation & orientRight) {
  1911. X        seg[is].y1 = s->yorg - 2;
  1912. X        seg[is].y2 = seg[is].y1 - s->indexSize;
  1913. X    }
  1914. X    else {
  1915. X        seg[is].y1 = s->yorg + 2;
  1916. X        seg[is].y2 = seg[is].y1 + s->indexSize;
  1917. X    }
  1918. X    ++ is;
  1919. X
  1920. X/*
  1921. X *  step through the doMajor and minor ticks
  1922. X */
  1923. X
  1924. X    for (; x < top; (x += xtick, v += s->minorInterval)) {
  1925. X
  1926. X        if (v > 36000)
  1927. X            v -= 36000;
  1928. X
  1929. X        seg[is].y1 = s->yorg;
  1930. X        seg[is].x1 = seg[is].x2 = p.x = x;
  1931. X
  1932. X        if ((v % s->majorInterval) == 0) {
  1933. X            doMajor = 1;
  1934. X            w = s->majorSize;
  1935. X            if (s->orientation & orientRight)
  1936. X                seg[is].y2 = s->yorg + w;
  1937. X            else
  1938. X                seg[is].y2 = s->yorg - w;
  1939. X            sprintf (str, s->format, (double) v / s->divisor);
  1940. X            q = skipBlanks (str);
  1941. X            p.x -= (strlen(q) * ftw) / 2;
  1942. X            if (s->orientation & orientRight) {
  1943. X                p.y = seg[is].y2 + 3 + fth;
  1944. X            }
  1945. X            else {
  1946. X                p.y = seg[is].y2 - 3;
  1947. X            }
  1948. X        }
  1949. X        else {
  1950. X            doMajor = 0;
  1951. X            w = s->minorSize;
  1952. X            if (s->orientation & orientRight)
  1953. X                seg[is].y2 = s->yorg + w;
  1954. X            else
  1955. X                seg[is].y2 = s->yorg - w;
  1956. X        }
  1957. X
  1958. X        if (doMajor)
  1959. X            XDrawString (dpy, win, gc, p.x, p.y, q,
  1960. X                strlen (q));
  1961. X        ++ is;     
  1962. X    }
  1963. X
  1964. X    XDrawSegments (dpy, win, gc, seg, is);
  1965. X
  1966. X}
  1967. END_OF_FILE
  1968. if test 3959 -ne `wc -c <'acm/fsim/doScale.c'`; then
  1969.     echo shar: \"'acm/fsim/doScale.c'\" unpacked with wrong size!
  1970. fi
  1971. # end of 'acm/fsim/doScale.c'
  1972. fi
  1973. if test -f 'acm/fsim/server.c' -a "${1}" != "-c" ; then 
  1974.   echo shar: Will not clobber existing file \"'acm/fsim/server.c'\"
  1975. else
  1976. echo shar: Extracting \"'acm/fsim/server.c'\" \(4922 characters\)
  1977. sed "s/^X//" >'acm/fsim/server.c' <<'END_OF_FILE'
  1978. X/*
  1979. X *    xflight : an aerial combat simulator for X
  1980. X *
  1981. X *    Written by Riley Rainey,  riley@mips.com
  1982. X *
  1983. X *    Permission to use, copy, modify and distribute (without charge) this
  1984. X *    software, documentation, images, etc. is granted, provided that this 
  1985. X *    comment and the author's name is retained.
  1986. X *
  1987. X */
  1988. X#include "manifest.h"
  1989. X#include <sys/types.h>
  1990. X#include <stdio.h>
  1991. X#include <pwd.h>
  1992. X#include <signal.h>
  1993. X#include <sys/socket.h>
  1994. X#include <sys/ioctl.h>
  1995. X#include <sys/time.h>
  1996. X#include <netinet/in.h>
  1997. X#include <netdb.h>
  1998. X#include <setjmp.h>
  1999. X
  2000. X#if !defined(lint) && !defined(SABER)
  2001. Xstatic char rcsid[] = "$Revision: acm by Riley Rainey; Revision 2.0 $";
  2002. X#endif
  2003. X
  2004. Xextern struct servent *getservent();
  2005. Xint sdebug = 1;
  2006. Xint listen_socket;
  2007. X
  2008. Xvoid parseinfo (s, a, b, c)
  2009. Xchar *s, *a, *b, *c; {
  2010. X
  2011. X    char    *p;
  2012. X
  2013. X    for (p=a; *s; ++s, ++p)
  2014. X        if ((*p = *s) == ' ') {
  2015. X            *p = '\0';
  2016. X            break;
  2017. X        }
  2018. X
  2019. X    ++ s;
  2020. X
  2021. X    for (p=b; *s; ++s, ++p)
  2022. X        if ((*p = *s) == ' ') {
  2023. X            *p = '\0';
  2024. X            break;
  2025. X        }
  2026. X
  2027. X    ++ s;
  2028. X
  2029. X    strcpy (c, s);
  2030. X
  2031. X    return;
  2032. X}
  2033. X
  2034. Xmain (argc, argv)
  2035. Xint    argc;
  2036. Xchar    *argv[]; {
  2037. X
  2038. X    struct sockaddr_in sin;
  2039. X#ifdef notdef
  2040. X    struct    servent *sp;
  2041. X#endif
  2042. X    int    on = 1;
  2043. X    int    i, background = 0;
  2044. X
  2045. X/*
  2046. X *  parse arguments
  2047. X */
  2048. X
  2049. X    for (i=1; i<argc; ++i) {
  2050. X
  2051. X        if (*argv[i] == '-')
  2052. X            switch (*(argv[i]+1)) {
  2053. X
  2054. X            case 'b':
  2055. X                background = 1;
  2056. X                break;
  2057. X
  2058. X            default:
  2059. X                fprintf (stderr, "Invalid switch \"%s\"\n", argv[i]);
  2060. X                break;
  2061. X            }
  2062. X    }
  2063. X
  2064. X    if (sdebug) {
  2065. X#ifdef notdef
  2066. X        if ((sp = getservbyname ("acm", "tcp");
  2067. X            fprintf (stderr, "can't find acm service\n");
  2068. X            exit (1);
  2069. X        }
  2070. X#endif
  2071. X
  2072. X        if ((listen_socket = socket (AF_INET, SOCK_STREAM, 0)) < 0) {
  2073. X            perror ("socket");
  2074. X            exit (1);
  2075. X        }
  2076. X
  2077. X        sin.sin_family = AF_INET;
  2078. X        sin.sin_addr.s_addr = INADDR_ANY;
  2079. X        sin.sin_port = htons(ACM_PORT);
  2080. X
  2081. X        if (bind (listen_socket, &sin, sizeof(sin)) < 0) {
  2082. X            perror ("bind");
  2083. X            exit (1);
  2084. X        }
  2085. X    }
  2086. X    else {
  2087. X        listen_socket = 0;        /* inetd sets this up for us */
  2088. X/*        freopen ("/people/riley/acm.error", "a", stderr); */
  2089. X    }
  2090. X
  2091. X        (void) setsockopt(listen_socket, SOL_SOCKET, SO_REUSEADDR,
  2092. X        (char *) &on, sizeof on);
  2093. X    (void) setsockopt(listen_socket, SOL_SOCKET, SO_KEEPALIVE,
  2094. X        (char *) &on, sizeof on);
  2095. X    ioctl(listen_socket, FIONBIO, (char *) &on);
  2096. X
  2097. X    if (listen (listen_socket, 5) < 0) {
  2098. X        perror ("listen");
  2099. X        close (listen_socket);
  2100. X        exit (1);
  2101. X    }
  2102. X
  2103. X    if (background)
  2104. X#ifdef SYSV
  2105. X        setpgrp (1);
  2106. X#else
  2107. X        setpgrp (0, 1);
  2108. X#endif
  2109. X
  2110. X    init ();
  2111. X    input();
  2112. X
  2113. X}
  2114. X
  2115. Xint peerdied = 0;
  2116. X
  2117. Xacm_sig_t deadpeer () {
  2118. X    fprintf (stderr, "SIGPIPE\n");
  2119. X    peerdied = 1;
  2120. X#ifndef SIGVOID
  2121. X    return(0);
  2122. X#endif
  2123. X}
  2124. X
  2125. Xstruct    sigvec    alrm, pipe;
  2126. Xint doUpdate = 0;
  2127. X
  2128. Xacm_sig_t myalarm () {
  2129. X    doUpdate++;
  2130. X    sigvec (SIGALRM, &alrm, (struct sigvec *) 0);
  2131. X#ifndef SIGVOID
  2132. X    return(0);
  2133. X#endif
  2134. X}
  2135. X
  2136. Xinput () {
  2137. X
  2138. X    fd_set    fdset, ofdset;
  2139. X    int    news = -1, playerchange = 0, n, pno, addrlen;
  2140. X    int    on = 1;
  2141. X    struct    sockaddr addr;
  2142. X    struct    itimerval update;
  2143. X    char    *bp, buf[128], name[64], display[64], args[128];
  2144. X
  2145. X    alrm.sv_handler = myalarm;
  2146. X    alrm.sv_mask = 0;
  2147. X#ifdef hpux
  2148. X    alrm.sv_flags = SV_BSDSIG;
  2149. X#else
  2150. X    alrm.sv_flags = SV_INTERRUPT;
  2151. X#endif
  2152. X    sigvec (SIGALRM, &alrm, (struct sigvec *) 0);
  2153. X
  2154. X/*
  2155. X *  Set real time clock to interrupt us every UPDATE_INTERVAL usecs.
  2156. X */
  2157. X
  2158. X    update.it_interval.tv_sec = 0;
  2159. X    update.it_interval.tv_usec = UPDATE_INTERVAL;
  2160. X    update.it_value.tv_sec = 0;
  2161. X    update.it_value.tv_usec = UPDATE_INTERVAL;
  2162. X    setitimer (ITIMER_REAL, &update, 0);
  2163. X
  2164. X    pipe.sv_handler = SIG_DFL;
  2165. X    pipe.sv_mask = 0;
  2166. X    pipe.sv_flags = SV_INTERRUPT;
  2167. X    sigvec (SIGPIPE, &pipe, (struct sigvec *) 0);
  2168. X
  2169. X    FD_ZERO (&ofdset);
  2170. X    FD_ZERO (&fdset);
  2171. X    FD_SET (listen_socket, &ofdset);
  2172. X
  2173. X    for (;;) {
  2174. X
  2175. X        sigsetmask (0);
  2176. X
  2177. X        fdset = ofdset;
  2178. X        pno = select (32, &fdset, (fd_set *) NULL, (fd_set *) NULL,
  2179. X            (struct itimerval *) NULL);
  2180. X
  2181. X        sigblock (SIGALRM);
  2182. X
  2183. X        if (pno < 0) {
  2184. X            FD_CLR (listen_socket, &fdset);
  2185. X            if (news > 0)
  2186. X                FD_CLR (news, &fdset);
  2187. X        }
  2188. X
  2189. X        if (FD_ISSET (listen_socket, &fdset) ||
  2190. X            (news > 0 && FD_ISSET(news, &fdset))) {
  2191. X            if (news == -1) {
  2192. X                addrlen = sizeof (addr);
  2193. X                news = accept(listen_socket, &addr, &addrlen);
  2194. X                if (news > 0) {
  2195. X                    peerdied = 0;
  2196. X                    pipe.sv_handler = deadpeer;
  2197. X                    sigvec(SIGPIPE, &pipe, (struct sigvec *) 0);
  2198. X                    ioctl (news, FIONBIO, &on);
  2199. X                    FD_SET (news, &ofdset);
  2200. X                    bp = buf;
  2201. X                }
  2202. X            }
  2203. X            if (news > 0 && FD_ISSET (news, &fdset)) {
  2204. X                if ((n = read (news, bp, 1)) > 0) {
  2205. X                    if (*bp == '\n') {
  2206. X                        *bp = '\0';
  2207. X                        parseinfo (buf, display,
  2208. X                            name, args);
  2209. X                        if (newPlayer (news,
  2210. X                            display, name, args) == 0)
  2211. X                            write (news, "Ready.\n", 7);
  2212. X                            printf ("%s\n", display);
  2213. X                        close (news);
  2214. X                        news = -1;
  2215. X                    }
  2216. X                    else
  2217. X                        bp++;
  2218. X                    playerchange = 1;
  2219. X                }
  2220. X                if (n == 0)
  2221. X                    peerdied = 1;
  2222. X            }
  2223. X        }
  2224. X
  2225. X        if (playerchange) {
  2226. X            FD_ZERO (&ofdset);
  2227. X            FD_SET (listen_socket, &ofdset);
  2228. X            if (news >= 0)
  2229. X                FD_SET (news, &ofdset);
  2230. X            pipe.sv_handler = SIG_DFL;
  2231. X            sigvec (SIGPIPE, &pipe, (struct sigvec *) 0);
  2232. X            playerchange = 0;
  2233. X        }
  2234. X
  2235. X        if (doUpdate) {
  2236. X            doUpdate = 0;
  2237. X            redraw ();
  2238. X        }
  2239. X
  2240. X    }
  2241. X}
  2242. END_OF_FILE
  2243. if test 4922 -ne `wc -c <'acm/fsim/server.c'`; then
  2244.     echo shar: \"'acm/fsim/server.c'\" unpacked with wrong size!
  2245. fi
  2246. # end of 'acm/fsim/server.c'
  2247. fi
  2248. echo shar: End of archive 3 \(of 9\).
  2249. cp /dev/null ark3isdone
  2250. MISSING=""
  2251. for I in 1 2 3 4 5 6 7 8 9 ; do
  2252.     if test ! -f ark${I}isdone ; then
  2253.     MISSING="${MISSING} ${I}"
  2254.     fi
  2255. done
  2256. if test "${MISSING}" = "" ; then
  2257.     echo You have unpacked all 9 archives.
  2258.     rm -f ark[1-9]isdone ark[1-9][0-9]isdone
  2259. else
  2260.     echo You still need to unpack the following archives:
  2261.     echo "        " ${MISSING}
  2262. fi
  2263. ##  End of shell archive.
  2264. exit 0
  2265. -- 
  2266. Riley Rainey            Internet: riley@mips.com
  2267. MIPS Computer Systems        Phone:    +1 214 770-7979
  2268. Dallas, Texas
  2269.