home *** CD-ROM | disk | FTP | other *** search
/ NetNews Usenet Archive 1992 #30 / NN_1992_30.iso / spool / comp / sys / sgi / 18041 < prev    next >
Encoding:
Internet Message Format  |  1992-12-15  |  58.0 KB

  1. Path: sparky!uunet!usc!zaphod.mps.ohio-state.edu!malgudi.oar.net!uoft02.utoledo.edu!ssubram2
  2. From: ssubram2@uoft02.utoledo.edu
  3. Newsgroups: comp.sys.sgi
  4. Subject: A game for the SGI PI
  5. Message-ID: <1992Dec15.132500.487@uoft02.utoledo.edu>
  6. Date: 15 Dec 92 13:25:00 EST
  7. Organization: University of Toledo, Computer Services
  8. Lines: 2321
  9.  
  10.  
  11.  
  12. Hi,
  13.  
  14. Sometime back I saw a request for games written for SGI GL.
  15. So here is a simple 3-d dog-fight game.  I wrote it a couple of weeks
  16. back in a fit of extreme boredom. A large part of the game was
  17. written within a period of 3 days ... so don't expect it to be a
  18. beautiful, efficiently written program. I wrote this on a SGI PI 4D/20
  19. and I don't know how fast/slow it will run on other SGI m/c's.
  20.  
  21. Game description :
  22. You are in a ship with lot of "enemies" around who fire at you and
  23. whom you have to destroy.  (simple, isn't it ? :)
  24. Game gets over if you collide with a wall or ship damage is 100%
  25. or fuel or torpedos runneth out.
  26.  
  27. Types of enemies :
  28. (1) Ordinary : Dull boring enemies who die on the first shot
  29. (2) Tough    : Change color when hit and move faster and make life
  30.                miserable for you.
  31. (3) Cloaked  : these don't show up unless you are holding down the
  32.                cloak detector button.
  33. (4) Cloaked and tough : Really painful enemies.
  34.  
  35. Game controls :
  36.  
  37. ship movement :
  38. --------------
  39. S key : increase forward ship thrust
  40. A key : increase backward ship thrust
  41. Z key : full brakes .. ship halt
  42.  
  43. ship direction :
  44. ---------------
  45. Leftarrow, Rightarrow : Turn ship left, rite
  46. Uparrow, Downarrow    :    Turn ship up, down
  47. Comma, Period         : Turn ship's "UP vector"
  48. PADENTER              : increase ship's rotation step
  49. PAD0                  : decrease ship's rotation step
  50.  
  51. weapons :
  52. --------
  53. Spacebar : Fire torpedo or laser guided missile (according
  54.            to context)
  55. T key    : Target enemy (toggle) which is completely inside 
  56.            the targeting brackets. (enemy changes color to CYAN 
  57.            to show that it has been targeted). Once targeted,
  58.            you can destroy that enemy whenever you want (with space
  59.            bar) and you need not even be looking at him.
  60.  
  61. Misc :
  62. -----
  63. D key : Turn on cloak detector (uses up lots of fuel)
  64. C key : Toggle crosswire (who would want to turn off the crosswire ?)
  65. Esc   : Exit
  66.  
  67. An on-board "flight computer" informs you of most things.
  68.  
  69.  
  70. Playing hints : 
  71. ------------
  72. If you ever halt the ship you are a sitting duck
  73. for the enemy so always keep moving. To kill very fast enemies
  74. you might have to use the laser targeting instrument (T key) and 
  75. then fire ... but laser guided missiles are very few.
  76.  
  77. When you are approaching a wall at moderate speeds, 
  78. you will have to increase the ship's rotation speed and turn in order
  79. to avoid hitting the wall. But a high rotation speed will hinder
  80. your enemy targeting capacity so decrease rotation speed as soon as
  81. you turn away from the wall. (PAD0,PADENTER)
  82.  
  83.  
  84. The main program is vr1.c. One more thing : I have used 
  85. /usr/NeWS/bin/keywarp to increase the keyboard's repeat rate.
  86.  
  87.  
  88. Send all comments/flames/questions/curses to :
  89. ssubrama@jupiter.cse.utoledo.edu
  90.  
  91. /Srikanth Subramanian (alias Cado)
  92.  
  93.  
  94. --------------CUT HERE--------------------------------------------
  95. #!/bin/sh
  96. # shar:    Shell Archiver  (v1.22)
  97. #
  98. #    Run the following text with /bin/sh to create:
  99. #      vector.h
  100. #      vr.h
  101. #      vr1.c
  102. #
  103. sed 's/^X//' << 'SHAR_EOF' > vector.h &&
  104. X/*
  105. X::::::::::::::
  106. Xvector.h for VR
  107. X::::::::::::::
  108. X*/
  109. X
  110. X#include <stdio.h>
  111. X#include <math.h>
  112. X#include <gl/gl.h>
  113. X#include <gl/device.h>
  114. X
  115. X#define   NN(x)     (((x) < 0) ?   0  : (x) )
  116. X#define   ABS(x)    (((x) < 0) ? -(x) : (x) ) 
  117. X#define   SQR(x)    ((x)*(x))
  118. X#define   SQRT(x)   ((float)(sqrt((double)(x))))
  119. X#define   COS(x)    ((float)(cos((double)(x))))
  120. X#define   ACOS(x)   ((float)(acos((double)(x))))
  121. X#define   SIN(x)    ((float)(sin((double)(x))))
  122. X#define   POW(x,y)  ((float)(pow((double)(x),(double)(y))))
  123. X#define   ATAN(x)   ((float)(atan((double)(x))))
  124. X#define   TAN(x)    ((float)(tan((double)(x))))
  125. X#define   ZERO(x)   ((ABS(x)<1.0e-10)?1:0)
  126. X
  127. X#define    EPSILON   (1.0e-6)
  128. X
  129. X/* Vector type  --- any point repr. as PV */
  130. Xtypedef struct {
  131. X   float x,y,z   ;
  132. X}  VEC           ;
  133. X
  134. X
  135. X/* Vector type used by GL : */
  136. Xtypedef float  VEC3[3] ; 
  137. X
  138. X
  139. X/* Modulus and Dot Product defs */
  140. X#define mod(a)      SQRT(a.x*a.x + a.y*a.y + a.z*a.z)
  141. X#define dot_p(a,b)  (a.x*b.x + a.y*b.y + a.z*b.z)
  142. X
  143. X/* Cross product :  c = a x b   */
  144. X#define cross_p(a,b,c)       {                   \
  145. X   c.x = (a.y*b.z - b.y*a.z) ;                   \
  146. X   c.y = (b.x*a.z - a.x*b.z) ;                   \
  147. X   c.z = (a.x*b.y - b.x*a.y) ;                   \
  148. X} 
  149. X
  150. X/* Cos(theta) where theta is the angle between vects. a,b */
  151. X#define cos_thet(a,b)  (dot_p(a,b)/(mod(a)*mod(b)))
  152. X
  153. X/* Distance between two position vectors */
  154. X#define   DIST(a,b) SQRT(SQR(a.x-b.x)+SQR(a.y-b.y)+SQR(a.z-b.z))
  155. X
  156. X/* A fast matrix multiplication def for (3x3)(3x1) mult */
  157. X#define mat_mul(a,b,c) { \
  158. X   c[0] = a[0][0]*b[0] + a[0][1]*b[1] + a[0][2]*b[2] ; \
  159. X   c[1] = a[1][0]*b[0] + a[1][1]*b[1] + a[1][2]*b[2] ; \
  160. X   c[2] = a[2][0]*b[0] + a[2][1]*b[1] + a[2][2]*b[2] ; \
  161. X}
  162. X
  163. X
  164. X/* Some simple vec operations */
  165. X
  166. X#define    NORM(vec)                {            \
  167. X           float  md = mod(vec)     ;            \
  168. X           if (md>EPSILON) {                     \
  169. X              vec.x    /= md           ;         \
  170. X              vec.y    /= md           ;         \
  171. X              vec.z    /= md           ;         \
  172. X           }                                     \
  173. X}
  174. X
  175. X#define    REVERSE_VEC(vec)         {            \
  176. X           vec.x = -vec.x           ;            \
  177. X           vec.y = -vec.y           ;            \
  178. X           vec.z = -vec.z           ;            \
  179. X}
  180. X
  181. X
  182. X#define    INIT_VEC(pvdest,xi,yi,zi)  {  \
  183. X           pvdest.x = xi      ;          \
  184. X           pvdest.y = yi      ;          \
  185. X           pvdest.z = zi      ;          \
  186. X}
  187. X           
  188. X   
  189. X#define    COPY_VEC(pvdest,pvsource)  {          \
  190. X           pvdest.x = pvsource.x      ;          \
  191. X           pvdest.y = pvsource.y      ;          \
  192. X           pvdest.z = pvsource.z      ;          \
  193. X}
  194. X
  195. X
  196. X#define    COPY_VEC3(pvdest,pvsource) {          \
  197. X           pvdest[0] = pvsource[0]    ;          \
  198. X           pvdest[1] = pvsource[1]    ;          \
  199. X           pvdest[2] = pvsource[2]    ;          \
  200. X}
  201. X
  202. X
  203. X#define    ADD_VEC(pvdest,pvsource)  {          \
  204. X           pvdest.x += pvsource.x      ;        \
  205. X           pvdest.y += pvsource.y      ;        \
  206. X           pvdest.z += pvsource.z      ;        \
  207. X}
  208. X
  209. X
  210. X#define    SCALE_VEC(pvdest,pvsource,sc)  {     \
  211. X           pvdest.x = sc*pvsource.x      ;      \
  212. X           pvdest.y = sc*pvsource.y      ;      \
  213. X           pvdest.z = sc*pvsource.z      ;      \
  214. X}
  215. X
  216. X
  217. X/* Given two pv's get the vec */
  218. X#define    GET_VEC(pvto,pvfrom,vec)   {      \
  219. X           vec.x  = pvto.x - pvfrom.x ;      \
  220. X           vec.y  = pvto.y - pvfrom.y ;      \
  221. X           vec.z  = pvto.z - pvfrom.z ;      \
  222. X}
  223. X
  224. X#define    VEC3TOVEC(vec,vec3)        {      \
  225. X           vec.x = vec3[0]            ;      \
  226. X           vec.y = vec3[1]            ;      \
  227. X           vec.z = vec3[2]            ;      \
  228. X}
  229. X
  230. X#define    VECTOVEC3(vec3,vec)        {      \
  231. X            vec3[0] = vec.x           ;      \
  232. X            vec3[1] = vec.y           ;      \
  233. X            vec3[2] = vec.z           ;      \
  234. X}
  235. X
  236. X
  237. X/* 
  238. X   REFL_RAY calculates the reflected ray direction at a point given
  239. X   the incident ray direction, the point of incidence and the normal to 
  240. X   the surface at that point. 
  241. X   The reflected ray direction is stored in a var passed as the 
  242. X   last parm to the macro.
  243. X   Note : All input directions and dir output by the macro are
  244. X   taken to be in the outward direction from the point of incidence.
  245. X */
  246. X
  247. X#define    REFL_RAY(indir,sp,un,outdir)   {      \
  248. X           float  ct              ;              \
  249. X           VEC    pn, pi, pr, pin ;              \
  250. X                                                 \
  251. X           pn.x = sp.x + un.x ;                  \
  252. X           pn.y = sp.y + un.y ;                  \
  253. X           pn.z = sp.z + un.z ;                  \
  254. X                                                 \
  255. X           pi.x = sp.x + indir.x ;               \
  256. X           pi.y = sp.y + indir.y ;               \
  257. X           pi.z = sp.z + indir.z ;               \
  258. X                                                 \
  259. X           ct =  cos_thet ( indir, un ) ;        \
  260. X                                                 \
  261. X           pin.x =  sp.x + un.x*ct ;             \
  262. X           pin.y =  sp.y + un.y*ct ;             \
  263. X           pin.z =  sp.z + un.z*ct ;             \
  264. X                                                 \
  265. X           pr.x  =  pin.x + (pin.x-pi.x) ;       \
  266. X           pr.y  =  pin.y + (pin.y-pi.y) ;       \
  267. X           pr.z  =  pin.z + (pin.z-pi.z) ;       \
  268. X                                                 \
  269. X           outdir.x = pr.x - sp.x ;              \
  270. X           outdir.y = pr.y - sp.y ;              \
  271. X           outdir.z = pr.z - sp.z ;              \
  272. X           NORM ( outdir )        ;              \
  273. X}
  274. X
  275. X
  276. X#define    MED_RAY(dir1,dir2,sp,outdir)   {      \
  277. X           VEC    p1, p2, pm ;                   \
  278. X                                                 \
  279. X           COPY_VEC ( p1, sp ) ;                 \
  280. X           COPY_VEC ( p2, sp ) ;                 \
  281. X                                                 \
  282. X           ADD_VEC  ( p1, dir1 ) ;               \
  283. X           ADD_VEC  ( p2, dir2 ) ;               \
  284. X                                                 \
  285. X           pm.x = (p1.x + p2.x)/2 ;              \
  286. X           pm.y = (p1.y + p2.y)/2 ;              \
  287. X           pm.z = (p1.z + p2.z)/2 ;              \
  288. X                                                 \
  289. X           outdir.x = pm.x - sp.x ;              \
  290. X           outdir.y = pm.y - sp.y ;              \
  291. X           outdir.z = pm.z - sp.z ;              \
  292. X           NORM ( outdir )        ;              \
  293. X}
  294. X
  295. X
  296. SHAR_EOF
  297. chmod 0666 vector.h || echo "restore of vector.h fails"
  298. sed 's/^X//' << 'SHAR_EOF' > vr.h &&
  299. X/* VR configuration :
  300. X * The Virtual world setup.
  301. X * Sizes and speeds are in virtual world scale units.
  302. X */
  303. X
  304. X#define ON    1
  305. X#define OFF   0
  306. X
  307. X/* Some color defs : these are dependent on the default
  308. X * color map (can be obtained by a "makemap")
  309. X */
  310. X#define WORLDBGCOLOR BLACK
  311. X#define PANELBGCOLOR 35
  312. X#define PANELTHRCOLOR   138
  313. X#define PANELROTCOLOR   59
  314. X#define PANELFUECOLOR   138
  315. X#define PANELTORCOLOR   138
  316. X#define PANELDAMCOLOR   RED
  317. X
  318. X/* World limits */
  319. X#define CUBEMAX   10000.0
  320. X#define CUBEMIN   (-CUBEMAX)
  321. X#define WORLDDIVS 21
  322. X
  323. X#define SHIPSIZ   500
  324. X
  325. X/* Ship's maximum forward, reverse and step thrust */
  326. X#define MAXTHRUST  500.0
  327. X#define STEPTHRUST 5.0
  328. X
  329. X/* Ship's maximum and minimum rotation speeds 
  330. X * (in 10'ths of degrees ie. GL "Angle" type values) 
  331. X */
  332. X#define MAXROT    450
  333. X#define MINROT    10
  334. X
  335. X/* Initial Fuel */
  336. X#define MAXFUEL 600000.0
  337. X
  338. X/* Phaser torpedos and tracking laser info in ship */
  339. X#define MAXTORP  800
  340. X/* Maximum no. of phaser torpedos firable at any given time */
  341. X#define MAXTORPFIRE   30
  342. X
  343. X#define TORPSPEED 600.0
  344. X#define TORPLEN   1000.0
  345. X#define MAXTRACKERS  5
  346. X
  347. X/* Explosion size */
  348. X#define EXPSIZ    200.0
  349. X
  350. X/* Enemy definitions */
  351. X#define MAXENEM   20
  352. X#define ENEMSIZ   500
  353. X#define ENEMSPEED  100
  354. X#define ENEMMISSPEED  1000.0
  355. X#define TOUGHENEMSPEEDFACT 1.5
  356. X
  357. SHAR_EOF
  358. chmod 0666 vr.h || echo "restore of vr.h fails"
  359. sed 's/^X//' << 'SHAR_EOF' > vr1.c &&
  360. X/* VR : A Reality Game by Cado <12/3/92> */
  361. X
  362. X#include "vector.h"
  363. X#include "vr.h"
  364. X#include <string.h>
  365. X
  366. X#define  X  0
  367. X#define  Y  1
  368. X#define  Z  2
  369. X#define  W  3
  370. X
  371. X/* :) */
  372. X#define fr(v,s,e) for(v=s;v<e;v++) 
  373. X
  374. X/* VR globals */
  375. Xint gov ;
  376. Xchar  gamename[100] ;
  377. Xlong  xorg, yorg, xsiz, ysiz ;
  378. XScreencoord vpst, conslower, consupper ;
  379. Xint   consdispwidth, conslabels[4] ;
  380. Xfloat xmid, ymid ;
  381. Xint   crosswiresiz, crosswiregap ;
  382. Xint   crosswire, cloakdetector ;
  383. X
  384. Xfloat thrust, stepthrust, steprot ;
  385. Xint   xrot, yrot, zrot ;
  386. XVEC   shipmov, shippos[2] ;
  387. XVEC   shipx, shipy, shipz ;
  388. X
  389. Xchar  consolemsg[100] ;
  390. Xint   consolemsgcolor ;
  391. Xint   mainloopcycles = 19 ;
  392. X
  393. Xint   torpleft, ntorp, enemleft, enemymissileshit ;
  394. Xfloat fuelleft, damage ;
  395. X
  396. Xfloat points ;
  397. X
  398. Xshort fovy = 900 ;
  399. Xfloat tanfovyrad ;
  400. X
  401. X/* VR objects */
  402. XObject  vr_world_object ;
  403. X
  404. X/* Torpedo launcher cross-wire */
  405. XObject  crosswire_object ;
  406. X
  407. X/* Individual torpedo information */
  408. Xstruct  {
  409. X   int     fired ;
  410. X   VEC     torpedopos, torpedodir ;
  411. X}  torpinfo[MAXTORPFIRE] ;
  412. X
  413. X
  414. X/* Enemy info */
  415. Xstruct  {
  416. X   int     tough, cloaked ;
  417. X   int     level ;
  418. X   int     destroyed, exploding ;
  419. X   float   speed ;
  420. X   VEC     pos, dir ;
  421. X}  enemyinfo[MAXENEM] ;
  422. X
  423. X
  424. X/* Enemy missile */
  425. Xstruct {
  426. X   float   msiz ;
  427. X   float   distfromship ;
  428. X   int destroyed ;
  429. X   VEC pos, dir ;
  430. X}  enemymissile ;
  431. X
  432. X
  433. X/* Tracker beam */
  434. Xint enemynum, prevstate, trackertoggle, ntrackersleft ;
  435. Xfloat beaminc = 100.0 ;
  436. X
  437. X
  438. Xinit_stat ()
  439. X{
  440. X   gov = FALSE ;
  441. X   thrust = 0 ;
  442. X   stepthrust = STEPTHRUST ;
  443. X   steprot = 10 ;
  444. X   xrot = yrot = 0 ;
  445. X   torpleft = MAXTORP ;
  446. X   ntrackersleft = MAXTRACKERS ;
  447. X   ntorp = 0 ;
  448. X   fuelleft = MAXFUEL ;
  449. X   damage = 0 ;
  450. X   enemleft = MAXENEM ;
  451. X   enemymissileshit = 0 ;
  452. X   enemymissile.destroyed = TRUE ;
  453. X   enemymissile.msiz = ENEMSIZ ;
  454. X
  455. X   crosswire = ON ;
  456. X   cloakdetector = OFF ;
  457. X
  458. X   points = 0 ;
  459. X   shippos[0].x = shippos[1].x = 0 ;
  460. X   shippos[0].y = shippos[1].y = 0 ;
  461. X   shippos[0].z = shippos[1].z = 0 ;
  462. X
  463. X   /* Initially ship is oriented along -ve Z axis */
  464. X   shipx.x = 1.0 ;
  465. X   shipx.y = shipx.z = 0 ;
  466. X   shipy.y = 1.0 ;
  467. X   shipy.x = shipy.z = 0 ;
  468. X   shipz.z = -1.0 ;
  469. X   shipz.x = shipz.y = 0 ;
  470. X}
  471. X
  472. X
  473. X
  474. Xinit_world_view ()
  475. X{
  476. X   color ( PANELBGCOLOR ) ;
  477. X   clear () ;
  478. X   swapbuffers () ;
  479. X   color ( PANELBGCOLOR ) ;
  480. X   clear () ;
  481. X}
  482. X
  483. X
  484. Xinit_gfx ()
  485. X{
  486. X   int i, j, k, cx, cy ;
  487. X   VEC3 v ;
  488. X   float lx, ly, lz, worldinc ;
  489. X   int  vc[2], v1[2], v2[2], v3[2], v4[2] ;
  490. X
  491. X   keepaspect ( 4, 5 ) ;
  492. X   minsize ( 588L, 735L ) ;
  493. X   winopen ( "VR" ) ;
  494. X   doublebuffer () ;
  495. X   gconfig () ;
  496. X   init_world_view () ;
  497. X
  498. X   getorigin ( &xorg, &yorg ) ;
  499. X   getsize ( &xsiz, &ysiz ) ;
  500. X
  501. X   vpst = ysiz*0.2 ;
  502. X   conslower = (vpst-vpst*0.80) ;
  503. X   consupper = (vpst-vpst*0.1) ;
  504. X   consdispwidth = xsiz/15.0 ;
  505. X
  506. X   conslabels[0] = consdispwidth/2.0 - strwidth("Thrust")/2.0  ;
  507. X   conslabels[1] = consdispwidth/2.0 - strwidth("Rotate")/2.0  ;
  508. X   conslabels[2] = consdispwidth/2.0 - strwidth("Fuel")/2.0    ;
  509. X   conslabels[3] = consdispwidth/2.0 - strwidth("Torpedo")/2.0 ;
  510. X
  511. X   xmid = xsiz/2.0 ;
  512. X   ymid = vpst + (ysiz-vpst)/2.0 ;
  513. X   crosswiregap = (crosswiresiz = (ysiz-vpst)/20.0)/5.0 ;
  514. X
  515. X   tanfovyrad = TAN((fovy/10.0)*(M_PI/180.0)*
  516. X                    (crosswiresiz+crosswiregap)/xsiz) ;
  517. X
  518. X   viewport ( (Screencoord) 40, (Screencoord) (xsiz-40), 
  519. X              (Screencoord) vpst+40, (Screencoord) (ysiz-40) ) ;
  520. X   perspective ( fovy, (double)xsiz/(double)(ysiz-vpst), 0.001, 5000000.0 );
  521. X   /* zbuffer ( TRUE ) ;
  522. X   lsetdepth ( 0, 500000 ) ;
  523. X    zclear () ; */
  524. X
  525. X   qdevice ( ESCKEY ) ;
  526. X   qdevice ( LEFTARROWKEY ) ;
  527. X   qdevice ( RIGHTARROWKEY ) ;
  528. X   qdevice ( UPARROWKEY ) ;
  529. X   qdevice ( DOWNARROWKEY ) ;
  530. X   qdevice ( PAD0 ) ;
  531. X   qdevice ( PADENTER ) ;
  532. X   qdevice ( COMMAKEY ) ;
  533. X   qdevice ( PERIODKEY ) ;
  534. X   qdevice ( AKEY ) ;
  535. X   qdevice ( CKEY ) ;
  536. X   qdevice ( DKEY ) ;
  537. X   qdevice ( SKEY ) ;
  538. X   qdevice ( ZKEY ) ;
  539. X   qdevice ( RKEY ) ;
  540. X   qdevice ( PKEY ) ;
  541. X   qdevice ( TKEY ) ;
  542. X   qdevice ( SPACEKEY ) ;
  543. X
  544. X   worldinc = (CUBEMAX-CUBEMIN)/((float)(WORLDDIVS-1)) ;
  545. X
  546. X   vr_world_object = genobj () ;
  547. X   makeobj ( vr_world_object ) ;
  548. X
  549. X   color ( RED ) ;
  550. X   fr ( k, 0, WORLDDIVS ) {
  551. X      bgnline () ;
  552. X      fr ( i, 0, WORLDDIVS ) {
  553. X         v[0] = CUBEMIN + i*worldinc ;
  554. X         v[1] = CUBEMIN ;
  555. X         v[2] = CUBEMIN + k*worldinc ;
  556. X         v3f ( v ) ;
  557. X      }
  558. X      endline () ;
  559. X   }
  560. X   for ( i = 0 ; i < WORLDDIVS ; i++ ) {
  561. X      bgnline () ;
  562. X      for ( k = 0 ; k < WORLDDIVS ; k++ ) {
  563. X         v[0] = CUBEMIN + i*worldinc ;
  564. X         v[1] = CUBEMIN ;
  565. X         v[2] = CUBEMIN + k*worldinc ;
  566. X         v3f ( v ) ;
  567. X      }
  568. X      endline () ;
  569. X   }
  570. X
  571. X   color ( YELLOW ) ;
  572. X   for ( k = 0 ; k < WORLDDIVS ; k++ ) {
  573. X      bgnline () ;
  574. X      for ( i = 0 ; i < WORLDDIVS ; i++ ) {
  575. X         v[0] = CUBEMIN + i*worldinc ;
  576. X         v[1] = CUBEMAX ;
  577. X         v[2] = CUBEMIN + k*worldinc ;
  578. X         v3f ( v ) ;
  579. X      }
  580. X      endline () ;
  581. X   }
  582. X   for ( i = 0 ; i < WORLDDIVS ; i++ ) {
  583. X      bgnline () ;
  584. X      for ( k = 0 ; k < WORLDDIVS ; k++ ) {
  585. X         v[0] = CUBEMIN + i*worldinc ;
  586. X         v[1] = CUBEMAX ;
  587. X         v[2] = CUBEMIN + k*worldinc ;
  588. X         v3f ( v ) ;
  589. X      }
  590. X      endline () ;
  591. X   }
  592. X
  593. X   color ( BLUE ) ;
  594. X   for ( k = 0 ; k < WORLDDIVS ; k++ ) {
  595. X      bgnline () ;
  596. X      for ( j = 0 ; j < WORLDDIVS ; j++ ) {
  597. X         v[0] = CUBEMIN ;
  598. X         v[1] = CUBEMIN + j*worldinc ;
  599. X         v[2] = CUBEMIN + k*worldinc ;
  600. X         v3f ( v ) ;
  601. X      }
  602. X      endline () ;
  603. X   }
  604. X   for ( j = 0 ; j < WORLDDIVS ; j++ ) {
  605. X      bgnline () ;
  606. X      for ( k = 0 ; k < WORLDDIVS ; k++ ) {
  607. X         v[0] = CUBEMIN ;
  608. X         v[1] = CUBEMIN + j*worldinc ;
  609. X         v[2] = CUBEMIN + k*worldinc ;
  610. X         v3f ( v ) ;
  611. X      }
  612. X      endline () ;
  613. X   }
  614. X
  615. X   color ( GREEN ) ;
  616. X   for ( k = 0 ; k < WORLDDIVS ; k++ ) {
  617. X      bgnline () ;
  618. X      for ( j = 0 ; j < WORLDDIVS ; j++ ) {
  619. X         v[0] = CUBEMAX ;
  620. X         v[1] = CUBEMIN + j*worldinc ;
  621. X         v[2] = CUBEMIN + k*worldinc ;
  622. X         v3f ( v ) ;
  623. X      }
  624. X      endline () ;
  625. X   }
  626. X   for ( j = 0 ; j < WORLDDIVS ; j++ ) {
  627. X      bgnline () ;
  628. X      for ( k = 0 ; k < WORLDDIVS ; k++ ) {
  629. X         v[0] = CUBEMAX ;
  630. X         v[1] = CUBEMIN + j*worldinc ;
  631. X         v[2] = CUBEMIN + k*worldinc ;
  632. X         v3f ( v ) ;
  633. X      }
  634. X      endline () ;
  635. X   }
  636. X
  637. X   color ( WHITE ) ;
  638. X   for ( j = 0 ; j < WORLDDIVS ; j++ ) {
  639. X      bgnline () ;
  640. X      for ( i = 0 ; i < WORLDDIVS ; i++ ) {
  641. X         v[0] = CUBEMIN + i*worldinc ;
  642. X         v[1] = CUBEMIN + j*worldinc ;
  643. X         v[2] = CUBEMIN ;
  644. X         v3f ( v ) ;
  645. X      }
  646. X      endline () ;
  647. X   }
  648. X   for ( i = 0 ; i < WORLDDIVS ; i++ ) {
  649. X      bgnline () ;
  650. X      for ( j = 0 ; j < WORLDDIVS ; j++ ) {
  651. X         v[0] = CUBEMIN + i*worldinc ;
  652. X         v[1] = CUBEMIN + j*worldinc ;
  653. X         v[2] = CUBEMIN ;
  654. X         v3f ( v ) ;
  655. X      }
  656. X      endline () ;
  657. X   }
  658. X
  659. X   color ( CYAN ) ;
  660. X   for ( j = 0 ; j < WORLDDIVS ; j++ ) {
  661. X      bgnline () ;
  662. X      for ( i = 0 ; i < WORLDDIVS ; i++ ) {
  663. X         v[0] = CUBEMIN + i*worldinc ;
  664. X         v[1] = CUBEMIN + j*worldinc ;
  665. X         v[2] = CUBEMAX ;
  666. X         v3f ( v ) ;
  667. X      }
  668. X      endline () ;
  669. X   }
  670. X   for ( i = 0 ; i < WORLDDIVS ; i++ ) {
  671. X      bgnline () ;
  672. X      for ( j = 0 ; j < WORLDDIVS ; j++ ) {
  673. X         v[0] = CUBEMIN + i*worldinc ;
  674. X         v[1] = CUBEMIN + j*worldinc ;
  675. X         v[2] = CUBEMAX ;
  676. X         v3f ( v ) ;
  677. X      }
  678. X      endline () ;
  679. X   }
  680. X   closeobj () ;
  681. X
  682. X   crosswire_object = genobj () ;
  683. X   makeobj ( crosswire_object ) ;
  684. X   color ( RED ) ;
  685. X   linewidth ( 3 ) ;
  686. X   vc[0] = cx = xsiz/2.0 ;
  687. X   vc[1] = cy = (ysiz-vpst)/2.0 + vpst ;
  688. X
  689. X   v1[0] = cx - crosswiresiz ;
  690. X   v1[1] = cy ;
  691. X   v2[0] = cx - crosswiregap ;
  692. X   v2[1] = cy ;
  693. X   v3[0] = cx + crosswiregap ;
  694. X   v3[1] = cy ;
  695. X   v4[0] = cx + crosswiresiz ;
  696. X   v4[1] = cy ;
  697. X   bgnline () ;
  698. X      v2i ( v1 ) ;
  699. X      v2i ( v2 ) ;
  700. X   endline () ;
  701. X   bgnline () ;
  702. X      v2i ( v3 ) ;
  703. X      v2i ( v4 ) ;
  704. X   endline () ;
  705. X   v1[0] = cx ;
  706. X   v1[1] = cy - crosswiresiz ;
  707. X   v2[0] = cx ;
  708. X   v2[1] = cy - crosswiregap ;
  709. X   v3[0] = cx ;
  710. X   v3[1] = cy + crosswiregap ;
  711. X   v4[0] = cx ;
  712. X   v4[1] = cy + crosswiresiz ;
  713. X   bgnline () ;
  714. X      v2i ( v1 ) ;
  715. X      v2i ( v2 ) ;
  716. X   endline () ;
  717. X   bgnline () ;
  718. X      v2i ( v3 ) ;
  719. X      v2i ( v4 ) ;
  720. X   endline () ;
  721. X
  722. X   v1[0] = cx - crosswiresiz - crosswiregap ;
  723. X   v1[1] = cy - crosswiresiz - crosswiregap ;
  724. X   v2[0] = cx - crosswiresiz - crosswiregap ;
  725. X   v2[1] = cy + crosswiresiz + crosswiregap ;
  726. X   bgnline () ;
  727. X      v2i ( v1 ) ;
  728. X      v2i ( v2 ) ;
  729. X   endline () ;
  730. X   v1[0] = cx + crosswiresiz + crosswiregap ;
  731. X   v1[1] = cy - crosswiresiz - crosswiregap ;
  732. X   v2[0] = cx + crosswiresiz + crosswiregap ;
  733. X   v2[1] = cy + crosswiresiz + crosswiregap ;
  734. X   bgnline () ;
  735. X      v2i ( v1 ) ;
  736. X      v2i ( v2 ) ;
  737. X   endline () ;
  738. X   v3[0] = cx + crosswiresiz + crosswiregap ;
  739. X   v3[1] = cy - crosswiresiz - crosswiregap ;
  740. X   v4[0] = cx + crosswiresiz - crosswiregap ;
  741. X   v4[1] = cy - crosswiresiz - crosswiregap ;
  742. X   bgnline () ;
  743. X      v2i ( v3 ) ;
  744. X      v2i ( v4 ) ;
  745. X   endline () ;
  746. X   v3[0] = cx + crosswiresiz + crosswiregap ;
  747. X   v3[1] = cy + crosswiresiz + crosswiregap ;
  748. X   v4[0] = cx + crosswiresiz - crosswiregap ;
  749. X   v4[1] = cy + crosswiresiz + crosswiregap ;
  750. X   bgnline () ;
  751. X      v2i ( v3 ) ;
  752. X      v2i ( v4 ) ;
  753. X   endline () ;
  754. X   v3[0] = cx - crosswiresiz - crosswiregap ;
  755. X   v3[1] = cy - crosswiresiz - crosswiregap ;
  756. X   v4[0] = cx - crosswiresiz + crosswiregap ;
  757. X   v4[1] = cy - crosswiresiz - crosswiregap ;
  758. X   bgnline () ;
  759. X      v2i ( v3 ) ;
  760. X      v2i ( v4 ) ;
  761. X   endline () ;
  762. X   v3[0] = cx - crosswiresiz - crosswiregap ;
  763. X   v3[1] = cy + crosswiresiz + crosswiregap ;
  764. X   v4[0] = cx - crosswiresiz + crosswiregap ;
  765. X   v4[1] = cy + crosswiresiz + crosswiregap ;
  766. X   bgnline () ;
  767. X      v2i ( v3 ) ;
  768. X      v2i ( v4 ) ;
  769. X   endline () ;
  770. X   linewidth ( 1 ) ;
  771. X
  772. X   closeobj () ;
  773. X
  774. X   for ( i = 0 ; i < MAXENEM ; i++ ) {
  775. X      enemyinfo[i].destroyed = FALSE ;
  776. X      lx = enemyinfo[i].pos.x = (2*drand48()-1.0)*CUBEMAX ;
  777. X      ly = enemyinfo[i].pos.y = (2*drand48()-1.0)*CUBEMAX ;
  778. X      lz = enemyinfo[i].pos.z = (2*drand48()-1.0)*CUBEMAX ;
  779. X      enemyinfo[i].dir.x = (2*drand48()-1.0) ;
  780. X      enemyinfo[i].dir.y = (2*drand48()-1.0) ;
  781. X      enemyinfo[i].dir.z = (2*drand48()-1.0) ;
  782. X      NORM ( enemyinfo[i].dir ) ;
  783. X
  784. X      /* Tough enemy */
  785. X      enemyinfo[i].tough = ( drand48 () > 0.5 ) ? TRUE : FALSE ;
  786. X
  787. X      /* Cloaked enemy */
  788. X      enemyinfo[i].cloaked = ( drand48 () > 0.9 ) ? TRUE : FALSE ;
  789. X
  790. X      enemyinfo[i].level = WHITE ;
  791. X      if ( drand48 () > 0.9 )
  792. X      /* Stationary enemy */
  793. X         enemyinfo[i].speed = 0.0 ;
  794. X      else
  795. X         enemyinfo[i].speed = ENEMSPEED ;
  796. X
  797. X      if ( enemyinfo[i].cloaked == FALSE )
  798. X         draw_one_enemy ( lx, ly, lz, enemyinfo[i].level ) ;
  799. X   }
  800. X}
  801. X
  802. X
  803. X
  804. Xdraw_window ()
  805. X{
  806. X   color ( WORLDBGCOLOR ) ;
  807. X   clear () ;
  808. X   /* czclear ( BLACK, 500000 ) ; */
  809. X
  810. X   draw_world () ;
  811. X   draw_enemies () ;
  812. X   draw_torpedos () ;
  813. X   if ( crosswire == ON ) draw_crosswire () ;
  814. X}
  815. X
  816. X
  817. X
  818. X
  819. Xdraw_enemies ()
  820. X{
  821. X   int i ;
  822. X
  823. X   for ( i = 0 ; i < MAXENEM ; i++ ) {
  824. X      if ( enemyinfo[i].destroyed == TRUE ) {
  825. X         if ( enemyinfo[i].exploding == TRUE ) {
  826. X            draw_one_exploding_enemy ( enemyinfo[i].pos.x,
  827. X                                        enemyinfo[i].pos.y,
  828. X                                        enemyinfo[i].pos.z, 
  829. X                                        enemyinfo[i].level ) ;
  830. X            enemyinfo[i].exploding = FALSE ;
  831. X         }
  832. X         else
  833. X            continue ;
  834. X      }
  835. X      check_for_enemy_bounce ( i ) ;
  836. X      enemyinfo[i].pos.x += enemyinfo[i].dir.x*enemyinfo[i].speed ;
  837. X      enemyinfo[i].pos.y += enemyinfo[i].dir.y*enemyinfo[i].speed ;
  838. X      enemyinfo[i].pos.z += enemyinfo[i].dir.z*enemyinfo[i].speed ;
  839. X
  840. X      if ( enemyinfo[i].cloaked == FALSE || cloakdetector == ON )
  841. X      draw_one_enemy ( enemyinfo[i].pos.x,
  842. X                       enemyinfo[i].pos.y,
  843. X                       enemyinfo[i].pos.z, enemyinfo[i].level ) ;
  844. X      if ( enemymissile.destroyed == TRUE )
  845. X         launch_enemy_missile ( i ) ;
  846. X   }
  847. X
  848. X   if ( enemymissile.destroyed == FALSE )
  849. X      draw_enemy_missile () ;
  850. X}
  851. X
  852. X
  853. X
  854. Xdraw_one_enemy ( lx, ly, lz, level )
  855. Xfloat lx, ly, lz ;
  856. Xint   level      ;
  857. X{
  858. X   VEC3 v1, v2, v3, v4, v5, v6, v7, v8 ;
  859. X
  860. X   v1[0] = lx ;
  861. X   v1[1] = ly ;
  862. X   v1[2] = lz ;
  863. X   v2[0] = lx + ENEMSIZ ;
  864. X   v2[1] = ly ;
  865. X   v2[2] = lz ;
  866. X   v3[0] = lx + ENEMSIZ ;
  867. X   v3[1] = ly + ENEMSIZ ;
  868. X   v3[2] = lz ;
  869. X   v4[0] = lx ;
  870. X   v4[1] = ly + ENEMSIZ ;
  871. X   v4[2] = lz ;
  872. X   v5[0] = lx ;
  873. X   v5[1] = ly ;
  874. X   v5[2] = lz + ENEMSIZ ;
  875. X   v6[0] = lx + ENEMSIZ ;
  876. X   v6[1] = ly ;
  877. X   v6[2] = lz + ENEMSIZ ;
  878. X   v7[0] = lx + ENEMSIZ ;
  879. X   v7[1] = ly + ENEMSIZ ;
  880. X   v7[2] = lz + ENEMSIZ ;
  881. X   v8[0] = lx ;
  882. X   v8[1] = ly + ENEMSIZ ;
  883. X   v8[2] = lz + ENEMSIZ ;
  884. X   color ( level ) ;
  885. X   bgnpolygon () ;
  886. X   v3f ( v1 ) ;
  887. X   v3f ( v2 ) ;
  888. X   v3f ( v3 ) ;
  889. X   v3f ( v4 ) ;
  890. X   endpolygon () ;
  891. X   bgnpolygon () ;
  892. X   v3f ( v2 ) ;
  893. X   v3f ( v6 ) ;
  894. X   v3f ( v7 ) ;
  895. X   v3f ( v3 ) ;
  896. X   endpolygon () ;
  897. X   bgnpolygon () ;
  898. X   v3f ( v4 ) ;
  899. X   v3f ( v3 ) ;
  900. X   v3f ( v7 ) ;
  901. X   v3f ( v8 ) ;
  902. X   endpolygon () ;
  903. X   bgnpolygon () ;
  904. X   v3f ( v5 ) ;
  905. X   v3f ( v1 ) ;
  906. X   v3f ( v4 ) ;
  907. X   v3f ( v8 ) ;
  908. X   endpolygon () ;
  909. X   bgnpolygon () ;
  910. X   v3f ( v5 ) ;
  911. X   v3f ( v6 ) ;
  912. X   v3f ( v2 ) ;
  913. X   v3f ( v1 ) ;
  914. X   endpolygon () ;
  915. X   bgnpolygon () ;
  916. X   v3f ( v6 ) ;
  917. X   v3f ( v5 ) ;
  918. X   v3f ( v8 ) ;
  919. X   v3f ( v7 ) ;
  920. X   endpolygon () ;
  921. X   color ( RED ) ;
  922. X   bgnline () ;
  923. X   v3f ( v1 ) ;
  924. X   v3f ( v2 ) ;
  925. X   v3f ( v3 ) ;
  926. X   v3f ( v4 ) ;
  927. X   v3f ( v1 ) ;
  928. X   endline () ;
  929. X   bgnline () ;
  930. X   v3f ( v2 ) ;
  931. X   v3f ( v6 ) ;
  932. X   v3f ( v7 ) ;
  933. X   v3f ( v3 ) ;
  934. X   v3f ( v2 ) ;
  935. X   endline () ;
  936. X   bgnline () ;
  937. X   v3f ( v4 ) ;
  938. X   v3f ( v3 ) ;
  939. X   v3f ( v7 ) ;
  940. X   v3f ( v8 ) ;
  941. X   v3f ( v4 ) ;
  942. X   endline () ;
  943. X   bgnline () ;
  944. X   v3f ( v5 ) ;
  945. X   v3f ( v1 ) ;
  946. X   v3f ( v4 ) ;
  947. X   v3f ( v8 ) ;
  948. X   v3f ( v5 ) ;
  949. X   endline () ;
  950. X   bgnline () ;
  951. X   v3f ( v5 ) ;
  952. X   v3f ( v6 ) ;
  953. X   v3f ( v2 ) ;
  954. X   v3f ( v1 ) ;
  955. X   v3f ( v5 ) ;
  956. X   endline () ;
  957. X   bgnline () ;
  958. X   v3f ( v6 ) ;
  959. X   v3f ( v5 ) ;
  960. X   v3f ( v8 ) ;
  961. X   v3f ( v7 ) ;
  962. X   v3f ( v6 ) ;
  963. X   endline () ;
  964. X}
  965. X
  966. X
  967. Xdraw_one_exploding_enemy ( lx, ly, lz, level )
  968. Xfloat lx, ly, lz ;
  969. Xint   level      ;
  970. X{
  971. X   VEC3 v1, v2, v3, v4, v5, v6, v7, v8 ;
  972. X   VEC3 v9, v10, v11, v12 ;
  973. X
  974. X   v1[0] = lx ;
  975. X   v1[1] = ly ;
  976. X   v1[2] = lz ;
  977. X   v2[0] = lx + ENEMSIZ ;
  978. X   v2[1] = ly ;
  979. X   v2[2] = lz ;
  980. X   v3[0] = lx + ENEMSIZ ;
  981. X   v3[1] = ly + ENEMSIZ ;
  982. X   v3[2] = lz ;
  983. X   v4[0] = lx ;
  984. X   v4[1] = ly + ENEMSIZ ;
  985. X   v4[2] = lz ;
  986. X   v5[0] = lx ;
  987. X   v5[1] = ly ;
  988. X   v5[2] = lz + ENEMSIZ ;
  989. X   v6[0] = lx + ENEMSIZ ;
  990. X   v6[1] = ly ;
  991. X   v6[2] = lz + ENEMSIZ ;
  992. X   v7[0] = lx + ENEMSIZ ;
  993. X   v7[1] = ly + ENEMSIZ ;
  994. X   v7[2] = lz + ENEMSIZ ;
  995. X   v8[0] = lx ;
  996. X   v8[1] = ly + ENEMSIZ ;
  997. X   v8[2] = lz + ENEMSIZ ;
  998. X   v9[0] = lx - ENEMSIZ ;
  999. X   v9[1] = ly+ENEMSIZ/2.0 ;
  1000. X   v9[2] = lz+ENEMSIZ/2.0 ;
  1001. X   v10[0] = lx+ENEMSIZ/2.0 ;
  1002. X   v10[1] = ly - ENEMSIZ ;
  1003. X   v10[2] = lz+ENEMSIZ/2.0 ;
  1004. X   v11[0] = lx + 2*ENEMSIZ ;
  1005. X   v11[1] = ly+ENEMSIZ/2.0 ;
  1006. X   v11[2] = lz+ENEMSIZ/2.0 ;
  1007. X   v12[0] = lx+ENEMSIZ/2.0 ;
  1008. X   v12[1] = ly + 2*ENEMSIZ ;
  1009. X   v12[2] = lz+ENEMSIZ/2.0 ;
  1010. X   color ( RED ) ;
  1011. X   bgnpolygon () ;
  1012. X   v3f ( v1 ) ;
  1013. X   v3f ( v4 ) ;
  1014. X   v3f ( v9 ) ;
  1015. X   endpolygon () ;
  1016. X   bgnpolygon () ;
  1017. X   v3f ( v9 ) ;
  1018. X   v3f ( v4 ) ;
  1019. X   v3f ( v8 ) ;
  1020. X   endpolygon () ;
  1021. X   bgnpolygon () ;
  1022. X   v3f ( v8 ) ;
  1023. X   v3f ( v5 ) ;
  1024. X   v3f ( v9 ) ;
  1025. X   endpolygon () ;
  1026. X   bgnpolygon () ;
  1027. X   v3f ( v9 ) ;
  1028. X   v3f ( v5 ) ;
  1029. X   v3f ( v1 ) ;
  1030. X   endpolygon () ;
  1031. X   color ( RED ) ;
  1032. X   bgnclosedline () ;
  1033. X   v3f ( v1 ) ;
  1034. X   v3f ( v4 ) ;
  1035. X   v3f ( v9 ) ;
  1036. X   endclosedline () ;
  1037. X   bgnclosedline () ;
  1038. X   v3f ( v9 ) ;
  1039. X   v3f ( v4 ) ;
  1040. X   v3f ( v8 ) ;
  1041. X   endclosedline () ;
  1042. X   bgnclosedline () ;
  1043. X   v3f ( v8 ) ;
  1044. X   v3f ( v5 ) ;
  1045. X   v3f ( v9 ) ;
  1046. X   endclosedline () ;
  1047. X   bgnclosedline () ;
  1048. X   v3f ( v9 ) ;
  1049. X   v3f ( v5 ) ;
  1050. X   v3f ( v1 ) ;
  1051. X   endclosedline () ;
  1052. X   color ( RED ) ;
  1053. X   bgnpolygon () ;
  1054. X   v3f ( v4 ) ;
  1055. X   v3f ( v3 ) ;
  1056. X   v3f ( v12 ) ;
  1057. X   endpolygon () ;
  1058. X   bgnpolygon () ;
  1059. X   v3f ( v12 ) ;
  1060. X   v3f ( v3 ) ;
  1061. X   v3f ( v7 ) ;
  1062. X   endpolygon () ;
  1063. X   bgnpolygon () ;
  1064. X   v3f ( v7 ) ;
  1065. X   v3f ( v8 ) ;
  1066. X   v3f ( v12 ) ;
  1067. X   endpolygon () ;
  1068. X   bgnpolygon () ;
  1069. X   v3f ( v12 ) ;
  1070. X   v3f ( v8 ) ;
  1071. X   v3f ( v4 ) ;
  1072. X   endpolygon () ;
  1073. X   color ( RED ) ;
  1074. X   bgnclosedline () ;
  1075. X   v3f ( v4 ) ;
  1076. X   v3f ( v3 ) ;
  1077. X   v3f ( v12 ) ;
  1078. X   endclosedline () ;
  1079. X   bgnclosedline () ;
  1080. X   v3f ( v12 ) ;
  1081. X   v3f ( v3 ) ;
  1082. X   v3f ( v7 ) ;
  1083. X   endclosedline () ;
  1084. X   bgnclosedline () ;
  1085. X   v3f ( v7 ) ;
  1086. X   v3f ( v8 ) ;
  1087. X   v3f ( v12 ) ;
  1088. X   endclosedline () ;
  1089. X   bgnclosedline () ;
  1090. X   v3f ( v12 ) ;
  1091. X   v3f ( v8 ) ;
  1092. X   v3f ( v4 ) ;
  1093. X   endclosedline () ;
  1094. X   color ( RED ) ;
  1095. X   bgnpolygon () ;
  1096. X   v3f ( v11 ) ;
  1097. X   v3f ( v3 ) ;
  1098. X   v3f ( v2 ) ;
  1099. X   endpolygon () ;
  1100. X   bgnpolygon () ;
  1101. X   v3f ( v2 ) ;
  1102. X   v3f ( v6 ) ;
  1103. X   v3f ( v11 ) ;
  1104. X   endpolygon () ;
  1105. X   bgnpolygon () ;
  1106. X   v3f ( v11 ) ;
  1107. X   v3f ( v6 ) ;
  1108. X   v3f ( v7 ) ;
  1109. X   endpolygon () ;
  1110. X   bgnpolygon () ;
  1111. X   v3f ( v7 ) ;
  1112. X   v3f ( v3 ) ;
  1113. X   v3f ( v11 ) ;
  1114. X   endpolygon () ;
  1115. X   color ( RED ) ;
  1116. X   bgnclosedline () ;
  1117. X   v3f ( v11 ) ;
  1118. X   v3f ( v3 ) ;
  1119. X   v3f ( v2 ) ;
  1120. X   endclosedline () ;
  1121. X   bgnclosedline () ;
  1122. X   v3f ( v2 ) ;
  1123. X   v3f ( v6 ) ;
  1124. X   v3f ( v11 ) ;
  1125. X   endclosedline () ;
  1126. X   bgnclosedline () ;
  1127. X   v3f ( v11 ) ;
  1128. X   v3f ( v6 ) ;
  1129. X   v3f ( v7 ) ;
  1130. X   endclosedline () ;
  1131. X   bgnclosedline () ;
  1132. X   v3f ( v7 ) ;
  1133. X   v3f ( v3 ) ;
  1134. X   v3f ( v11 ) ;
  1135. X   endclosedline () ;
  1136. X   color ( RED ) ;
  1137. X   bgnpolygon () ;
  1138. X   v3f ( v10 ) ;
  1139. X   v3f ( v2 ) ;
  1140. X   v3f ( v1 ) ;
  1141. X   endpolygon () ;
  1142. X   bgnpolygon () ;
  1143. X   v3f ( v1 ) ;
  1144. X   v3f ( v5 ) ;
  1145. X   v3f ( v10 ) ;
  1146. X   endpolygon () ;
  1147. X   bgnpolygon () ;
  1148. X   v3f ( v10 ) ;
  1149. X   v3f ( v5 ) ;
  1150. X   v3f ( v6 ) ;
  1151. X   endpolygon () ;
  1152. X   bgnpolygon () ;
  1153. X   v3f ( v6 ) ;
  1154. X   v3f ( v2 ) ;
  1155. X   v3f ( v10 ) ;
  1156. X   endpolygon () ;
  1157. X   color ( RED ) ;
  1158. X   bgnclosedline () ;
  1159. X   v3f ( v10 ) ;
  1160. X   v3f ( v2 ) ;
  1161. X   v3f ( v1 ) ;
  1162. X   endclosedline () ;
  1163. X   bgnclosedline () ;
  1164. X   v3f ( v1 ) ;
  1165. X   v3f ( v5 ) ;
  1166. X   v3f ( v10 ) ;
  1167. X   endclosedline () ;
  1168. X   bgnclosedline () ;
  1169. X   v3f ( v10 ) ;
  1170. X   v3f ( v5 ) ;
  1171. X   v3f ( v6 ) ;
  1172. X   endclosedline () ;
  1173. X   bgnclosedline () ;
  1174. X   v3f ( v6 ) ;
  1175. X   v3f ( v2 ) ;
  1176. X   v3f ( v10 ) ;
  1177. X   endclosedline () ;
  1178. X}
  1179. X
  1180. X
  1181. Xdraw_enemy_missile ()
  1182. X{
  1183. X   float lx, ly, lz ;
  1184. X   VEC3 v1, v2, v3, v4, v5, v6, v7, v8 ;
  1185. X
  1186. X   v1[0] = enemymissile.pos.x += enemymissile.dir.x*ENEMMISSPEED ;
  1187. X   v1[1] = enemymissile.pos.y += enemymissile.dir.y*ENEMMISSPEED ;
  1188. X   v1[2] = enemymissile.pos.z += enemymissile.dir.z*ENEMMISSPEED ;
  1189. X   v2[0] = v1[0] + enemymissile.dir.x*enemymissile.msiz ;
  1190. X   v2[1] = v1[1] + enemymissile.dir.y*enemymissile.msiz ;
  1191. X   v2[2] = v1[2] + enemymissile.dir.z*enemymissile.msiz ;
  1192. X   color ( MAGENTA ) ;
  1193. X   linewidth ( 5 ) ;
  1194. X   bgnline () ;
  1195. X      v3f ( v1 ) ;
  1196. X      v3f ( v2 ) ;
  1197. X   endline () ;
  1198. X   linewidth ( 1 ) ;
  1199. X   check_for_enemy_missile_collision () ;
  1200. X}
  1201. X
  1202. X
  1203. X
  1204. Xdraw_crosswire ()
  1205. X/* Draw cross-wire at the center of the world viewport */
  1206. X{
  1207. X   pushmatrix () ;
  1208. X   ortho2 ( (Coord)0, (Coord)xsiz, (Coord)vpst, (Coord)ysiz ) ;
  1209. X   callobj ( crosswire_object ) ;
  1210. X   popmatrix () ;
  1211. X}
  1212. X
  1213. X
  1214. Xmove_ship ()
  1215. X{
  1216. X   SCALE_VEC ( shipmov, shipz, thrust ) ;
  1217. X   COPY_VEC ( shippos[0], shippos[1] ) ;
  1218. X   ADD_VEC  ( shippos[1], shipmov ) ;
  1219. X   translate ( -shipmov.x, -shipmov.y, -shipmov.z ) ;
  1220. X   fuelleft -= ABS(thrust) ;
  1221. X}
  1222. X
  1223. X
  1224. Xdraw_world ()
  1225. X{
  1226. X   xrotate () ;
  1227. X   yrotate () ;
  1228. X   zrotate () ;
  1229. X
  1230. X   move_ship () ;
  1231. X   check_for_ship_collision () ;
  1232. X
  1233. X   callobj ( vr_world_object ) ;
  1234. X}
  1235. X
  1236. X
  1237. Xyrotate ()
  1238. X{
  1239. X   Matrix mx ;
  1240. X
  1241. X   if ( yrot != 0 ) {
  1242. X      lib_create_axis_rotate_matrix ( mx, shipy, (float)-yrot/10.0 ) ;
  1243. X      translate ( shippos[1].x, shippos[1].y, shippos[1].z ) ;
  1244. X      multmatrix ( mx ) ;
  1245. X      translate ( -shippos[1].x, -shippos[1].y, -shippos[1].z ) ;
  1246. X      mat_transform ( mx, &shipz ) ;
  1247. X      mat_transform ( mx, &shipx ) ;
  1248. X      yrot = 0 ;
  1249. X      fuelleft -= ABS(yrot) ;
  1250. X   }
  1251. X}
  1252. X
  1253. X
  1254. X
  1255. Xxrotate ()
  1256. X{
  1257. X   Matrix mx ;
  1258. X
  1259. X   if ( xrot != 0 ) {
  1260. X      lib_create_axis_rotate_matrix ( mx, shipx, (float)-xrot/10.0 ) ;
  1261. X      translate ( shippos[1].x, shippos[1].y, shippos[1].z ) ;
  1262. X      multmatrix ( mx ) ;
  1263. X      translate ( -shippos[1].x, -shippos[1].y, -shippos[1].z ) ;
  1264. X      mat_transform ( mx, &shipy ) ;
  1265. X      mat_transform ( mx, &shipz ) ;
  1266. X      xrot = 0 ;
  1267. X      fuelleft -= ABS(xrot) ;
  1268. X   }
  1269. X}
  1270. X
  1271. X
  1272. Xzrotate ()
  1273. X{
  1274. X   Matrix mx ;
  1275. X
  1276. X   if ( zrot != 0 ) {
  1277. X      lib_create_axis_rotate_matrix ( mx, shipz, (float)-zrot/10.0 ) ;
  1278. X      translate ( shippos[1].x, shippos[1].y, shippos[1].z ) ;
  1279. X      multmatrix ( mx ) ;
  1280. X      translate ( -shippos[1].x, -shippos[1].y, -shippos[1].z ) ;
  1281. X      mat_transform ( mx, &shipx ) ;
  1282. X      mat_transform ( mx, &shipy ) ;
  1283. X      zrot = 0 ;
  1284. X      fuelleft -= ABS(zrot) ;
  1285. X   }
  1286. X}
  1287. X
  1288. X
  1289. X
  1290. Xfire_torpedo ()
  1291. X{
  1292. X   int  i ;
  1293. X   VEC3 v1, v2 ;
  1294. X
  1295. X   if ( torpleft == 0 ) return ;
  1296. X
  1297. X   for ( i = 0  ; i < MAXTORPFIRE ; i++ )
  1298. X      if ( torpinfo[i].fired == FALSE ) break ;
  1299. X
  1300. X   torpinfo[i].fired = TRUE ;
  1301. X   COPY_VEC ( torpinfo[i].torpedopos, shippos[1] ) ; 
  1302. X   COPY_VEC ( torpinfo[i].torpedodir, shipz ) ; 
  1303. X
  1304. X   v1[0] = shippos[1].x ;
  1305. X   v1[1] = shippos[1].y ;
  1306. X   v1[2] = shippos[1].z ;
  1307. X   v2[0] = v1[0] + shipz.x*TORPLEN ;
  1308. X   v2[1] = v1[1] + shipz.y*TORPLEN ;
  1309. X   v2[2] = v1[2] + shipz.z*TORPLEN ;
  1310. X
  1311. X   color ( MAGENTA ) ;
  1312. X   linewidth ( 3 ) ;
  1313. X   bgnline () ;
  1314. X      v3f ( v1 ) ;
  1315. X      v3f ( v2 ) ;
  1316. X   endline () ;
  1317. X   linewidth ( 1 ) ;
  1318. X
  1319. X   ntorp++ ;
  1320. X   torpleft-- ;
  1321. X}
  1322. X
  1323. X
  1324. X
  1325. Xlaunch_enemy_missile ( eni )
  1326. X{
  1327. X   enemymissile.destroyed = FALSE ;
  1328. X   COPY_VEC ( enemymissile.pos, enemyinfo[eni].pos ) ;
  1329. X   GET_VEC ( shippos[1], enemyinfo[eni].pos, enemymissile.dir ) ; 
  1330. X   NORM ( enemymissile.dir ) ;
  1331. X   draw_enemy_missile () ;
  1332. X}
  1333. X
  1334. X
  1335. X
  1336. Xdraw_torpedos ()
  1337. X{
  1338. X   int i ;
  1339. X   VEC3 v1, v2 ;
  1340. X
  1341. X   for ( i = 0  ; i < MAXTORPFIRE ; i++ ) {
  1342. X      if ( torpinfo[i].fired == FALSE ) continue ;
  1343. X
  1344. X      v1[0] = torpinfo[i].torpedopos.x += torpinfo[i].torpedodir.x*TORPSPEED ;
  1345. X      v1[1] = torpinfo[i].torpedopos.y += torpinfo[i].torpedodir.y*TORPSPEED ;
  1346. X      v1[2] = torpinfo[i].torpedopos.z += torpinfo[i].torpedodir.z*TORPSPEED ;
  1347. X
  1348. X      v2[0] = v1[0] + torpinfo[i].torpedodir.x*TORPLEN ;
  1349. X      v2[1] = v1[1] + torpinfo[i].torpedodir.y*TORPLEN ;
  1350. X      v2[2] = v1[2] + torpinfo[i].torpedodir.z*TORPLEN ;
  1351. X
  1352. X      check_for_torpedo_collision ( i ) ;
  1353. X
  1354. X      color ( MAGENTA ) ;
  1355. X      linewidth ( 3 ) ;
  1356. X      bgnline () ;
  1357. X         v3f ( v1 ) ;
  1358. X         v3f ( v2 ) ;
  1359. X      endline () ;
  1360. X      linewidth ( 1 ) ;
  1361. X   }
  1362. X}
  1363. X
  1364. X
  1365. Xupdate_console_panels ()
  1366. X{
  1367. X   int v1[3], v2[3], v3[3], v4[3], left, rite, i ;
  1368. X   char buff[100] ;
  1369. X   float divht, idivht, smalldivwidth, largedivwidth, damlower, damupper ;
  1370. X
  1371. X   pushmatrix () ;
  1372. X   pushviewport () ;
  1373. X   viewport ( (Screencoord) 0, (Screencoord) xsiz, (Screencoord) 0, 
  1374. X      (Screencoord) (vpst) ) ;
  1375. X   color ( PANELBGCOLOR ) ;
  1376. X   clear () ;
  1377. X   ortho2 ( (Coord)0, (Coord)xsiz, (Coord)0, (Coord)vpst ) ;
  1378. X
  1379. X   divht = (consupper-conslower)/8.0 ;
  1380. X   smalldivwidth = consdispwidth/8.0 ;
  1381. X   largedivwidth = consdispwidth/4.0 ;
  1382. X
  1383. X   /* Update thrust */
  1384. X   left = 10 ;
  1385. X   rite = left + consdispwidth ;
  1386. X   v1[0] = left-1 ;
  1387. X   v1[1] = conslower-1 ;
  1388. X   v2[0] = rite ;
  1389. X   v2[1] = conslower-1 ;
  1390. X   v3[0] = rite ;
  1391. X   v3[1] = consupper+1 ;
  1392. X   v4[0] = left-1 ;
  1393. X   v4[1] = consupper+1 ;
  1394. X   color ( YELLOW ) ;
  1395. X   bgnclosedline () ;
  1396. X   v2i ( v1 ) ;
  1397. X   v2i ( v2 ) ;
  1398. X   v2i ( v3 ) ;
  1399. X   v2i ( v4 ) ;
  1400. X   endclosedline () ;
  1401. X   if ( thrust < 0.0  )
  1402. X      color ( RED ) ;
  1403. X   else
  1404. X      color ( PANELTHRCOLOR ) ;
  1405. X   v1[0] = left ;
  1406. X   v1[1] = conslower ;
  1407. X   v2[0] = rite ;
  1408. X   v2[1] = conslower ;
  1409. X   v3[0] = rite ;
  1410. X   v3[1] = (ABS(thrust)/MAXTHRUST)*(consupper-conslower) + conslower ;
  1411. X   v4[0] = left ;
  1412. X   v4[1] = v3[1] ;
  1413. X   bgnpolygon () ;
  1414. X   v2i ( v1 ) ;
  1415. X   v2i ( v2 ) ;
  1416. X   v2i ( v3 ) ;
  1417. X   v2i ( v4 ) ;
  1418. X   endpolygon () ;
  1419. X   color ( YELLOW ) ;
  1420. X   for ( i = 1 ; i <= 7 ; i++ ) {
  1421. X      idivht = divht*i+conslower ;
  1422. X      v1[0] = left ;
  1423. X      v1[1] = idivht ;
  1424. X      v2[0] = (i%2 == 1) ? left + smalldivwidth : left + largedivwidth ;
  1425. X      v2[1] = idivht ;
  1426. X      bgnline () ;
  1427. X         v2i ( v1 ) ;
  1428. X         v2i ( v2 ) ;
  1429. X      endline () ;
  1430. X      v1[0] = rite ;
  1431. X      v1[1] = idivht ;
  1432. X      v2[0] = rite - ((i%2 == 1) ? smalldivwidth : largedivwidth) ;
  1433. X      v2[1] = idivht ;
  1434. X      bgnline () ;
  1435. X         v2i ( v1 ) ;
  1436. X         v2i ( v2 ) ;
  1437. X      endline () ;
  1438. X   }
  1439. X   cmov2i ( left+conslabels[0], conslower-15 ) ;
  1440. X   color ( WHITE ) ;
  1441. X   charstr ( "Thrust" ) ;
  1442. X
  1443. X   /* Update Rotation Speed */
  1444. X   left = rite+consdispwidth ;
  1445. X   rite = left+consdispwidth ;
  1446. X   v1[0] = left-1 ;
  1447. X   v1[1] = conslower-1 ;
  1448. X   v2[0] = rite ;
  1449. X   v2[1] = conslower-1 ;
  1450. X   v3[0] = rite ;
  1451. X   v3[1] = consupper+1 ;
  1452. X   v4[0] = left-1 ;
  1453. X   v4[1] = consupper+1 ;
  1454. X   color ( YELLOW ) ;
  1455. X   bgnclosedline () ;
  1456. X   v2i ( v1 ) ;
  1457. X   v2i ( v2 ) ;
  1458. X   v2i ( v3 ) ;
  1459. X   v2i ( v4 ) ;
  1460. X   endclosedline () ;
  1461. X   color ( PANELROTCOLOR ) ;
  1462. X   v1[0] = left ;
  1463. X   v1[1] = conslower ;
  1464. X   v2[0] = rite ;
  1465. X   v2[1] = conslower ;
  1466. X   v3[0] = rite ;
  1467. X   v3[1] = (ABS(steprot)/(float)MAXROT)*(consupper-conslower) + conslower ;
  1468. X   v4[0] = left ;
  1469. X   v4[1] = v3[1] ;
  1470. X   bgnpolygon () ;
  1471. X   v2i ( v1 ) ;
  1472. X   v2i ( v2 ) ;
  1473. X   v2i ( v3 ) ;
  1474. X   v2i ( v4 ) ;
  1475. X   endpolygon () ;
  1476. X   color ( YELLOW ) ;
  1477. X   for ( i = 1 ; i <= 7 ; i++ ) {
  1478. X      idivht = divht*i+conslower ;
  1479. X      v1[0] = left ;
  1480. X      v1[1] = idivht ;
  1481. X      v2[0] = (i%2 == 1) ? left + smalldivwidth : left + largedivwidth ;
  1482. X      v2[1] = idivht ;
  1483. X      bgnline () ;
  1484. X         v2i ( v1 ) ;
  1485. X         v2i ( v2 ) ;
  1486. X      endline () ;
  1487. X      v1[0] = rite ;
  1488. X      v1[1] = idivht ;
  1489. X      v2[0] = rite - ((i%2 == 1) ? smalldivwidth : largedivwidth) ;
  1490. X      v2[1] = idivht ;
  1491. X      bgnline () ;
  1492. X         v2i ( v1 ) ;
  1493. X         v2i ( v2 ) ;
  1494. X      endline () ;
  1495. X   }
  1496. X   cmov2i ( left+conslabels[1], conslower-15 ) ;
  1497. X   color ( WHITE ) ;
  1498. X   charstr ( "Rotate" ) ;
  1499. X
  1500. X   /* Update Fuel */
  1501. X   left = rite+consdispwidth ;
  1502. X   rite = left+consdispwidth ;
  1503. X   v1[0] = left-1 ;
  1504. X   v1[1] = conslower-1 ;
  1505. X   v2[0] = rite ;
  1506. X   v2[1] = conslower-1 ;
  1507. X   v3[0] = rite ;
  1508. X   v3[1] = consupper+1 ;
  1509. X   v4[0] = left-1 ;
  1510. X   v4[1] = consupper+1 ;
  1511. X   color ( YELLOW ) ;
  1512. X   bgnclosedline () ;
  1513. X   v2i ( v1 ) ;
  1514. X   v2i ( v2 ) ;
  1515. X   v2i ( v3 ) ;
  1516. X   v2i ( v4 ) ;
  1517. X   endclosedline () ;
  1518. X   if ( fuelleft <= 0.2*MAXFUEL )
  1519. X      color ( RED ) ;
  1520. X   else
  1521. X      color ( PANELFUECOLOR ) ;
  1522. X   v1[0] = left ;
  1523. X   v1[1] = conslower ;
  1524. X   v2[0] = rite ;
  1525. X   v2[1] = conslower ;
  1526. X   v3[0] = rite ;
  1527. X   v3[1] = (fuelleft/MAXFUEL)*(consupper-conslower) + conslower ;
  1528. X   v4[0] = left ;
  1529. X   v4[1] = v3[1] ;
  1530. X   bgnpolygon () ;
  1531. X   v2i ( v1 ) ;
  1532. X   v2i ( v2 ) ;
  1533. X   v2i ( v3 ) ;
  1534. X   v2i ( v4 ) ;
  1535. X   endpolygon () ;
  1536. X   color ( YELLOW ) ;
  1537. X   for ( i = 1 ; i <= 7 ; i++ ) {
  1538. X      idivht = divht*i+conslower ;
  1539. X      v1[0] = left ;
  1540. X      v1[1] = idivht ;
  1541. X      v2[0] = (i%2 == 1) ? left + smalldivwidth : left + largedivwidth ;
  1542. X      v2[1] = idivht ;
  1543. X      bgnline () ;
  1544. X         v2i ( v1 ) ;
  1545. X         v2i ( v2 ) ;
  1546. X      endline () ;
  1547. X      v1[0] = rite ;
  1548. X      v1[1] = idivht ;
  1549. X      v2[0] = rite - ((i%2 == 1) ? smalldivwidth : largedivwidth) ;
  1550. X      v2[1] = idivht ;
  1551. X      bgnline () ;
  1552. X         v2i ( v1 ) ;
  1553. X         v2i ( v2 ) ;
  1554. X      endline () ;
  1555. X   }
  1556. X   cmov2i ( left+conslabels[2], conslower-15 ) ;
  1557. X   color ( WHITE ) ;
  1558. X   charstr ( "Fuel" ) ;
  1559. X
  1560. X   /* Update No. of torpedos left */
  1561. X   left = rite+consdispwidth ;
  1562. X   rite = left+consdispwidth ;
  1563. X   v1[0] = left-1 ;
  1564. X   v1[1] = conslower-1 ;
  1565. X   v2[0] = rite+1 ;
  1566. X   v2[1] = conslower-1 ;
  1567. X   v3[0] = rite+1 ;
  1568. X   v3[1] = consupper+1 ;
  1569. X   v4[0] = left-1 ;
  1570. X   v4[1] = consupper+1 ;
  1571. X   color ( YELLOW ) ;
  1572. X   bgnclosedline () ;
  1573. X   v2i ( v1 ) ;
  1574. X   v2i ( v2 ) ;
  1575. X   v2i ( v3 ) ;
  1576. X   v2i ( v4 ) ;
  1577. X   endclosedline () ;
  1578. X   if ( torpleft <= 0.2*MAXTORP )
  1579. X      color ( RED ) ;
  1580. X   else
  1581. X      color ( PANELTORCOLOR ) ;
  1582. X   v1[0] = left ;
  1583. X   v1[1] = conslower ;
  1584. X   v2[0] = rite ;
  1585. X   v2[1] = conslower ;
  1586. X   v3[0] = rite ;
  1587. X   v3[1] = ((float)torpleft/(float)MAXTORP)*(consupper-conslower) 
  1588. X           + conslower ;
  1589. X   v4[0] = left ;
  1590. X   v4[1] = v3[1] ;
  1591. X   bgnpolygon () ;
  1592. X   v2i ( v1 ) ;
  1593. X   v2i ( v2 ) ;
  1594. X   v2i ( v3 ) ;
  1595. X   v2i ( v4 ) ;
  1596. X   endpolygon () ;
  1597. X   color ( YELLOW ) ;
  1598. X   for ( i = 1 ; i <= 7 ; i++ ) {
  1599. X      idivht = divht*i+conslower ;
  1600. X      v1[0] = left ;
  1601. X      v1[1] = idivht ;
  1602. X      v2[0] = (i%2 == 1) ? left + smalldivwidth : left + largedivwidth ;
  1603. X      v2[1] = idivht ;
  1604. X      bgnline () ;
  1605. X         v2i ( v1 ) ;
  1606. X         v2i ( v2 ) ;
  1607. X      endline () ;
  1608. X      v1[0] = rite ;
  1609. X      v1[1] = idivht ;
  1610. X      v2[0] = rite - ((i%2 == 1) ? smalldivwidth : largedivwidth) ;
  1611. X      v2[1] = idivht ;
  1612. X      bgnline () ;
  1613. X         v2i ( v1 ) ;
  1614. X         v2i ( v2 ) ;
  1615. X      endline () ;
  1616. X   }
  1617. X   cmov2i ( left+conslabels[3], conslower-15 ) ;
  1618. X   color ( WHITE ) ;
  1619. X   charstr ( "Torpedo" ) ;
  1620. X
  1621. X   /* Update damage report */
  1622. X   left = rite+20 ;
  1623. X   cmov2i ( left, consupper-10 ) ;
  1624. X   color ( WHITE ) ;
  1625. X   charstr ( "Damage" ) ;
  1626. X
  1627. X   damlower = consupper-10 ;
  1628. X   damupper = (consupper-conslower)/10.0 + damlower ;
  1629. X   left = rite+consdispwidth +40;
  1630. X   rite = xsiz-10 ;
  1631. X   v1[0] = left-1 ;
  1632. X   v1[1] = damlower-1 ;
  1633. X   v2[0] = rite+1 ;
  1634. X   v2[1] = damlower-1 ;
  1635. X   v3[0] = rite+1 ;
  1636. X   v3[1] = damupper+1 ;
  1637. X   v4[0] = left-1 ;
  1638. X   v4[1] = damupper+1 ;
  1639. X   color ( YELLOW ) ;
  1640. X   bgnclosedline () ;
  1641. X   v2i ( v1 ) ;
  1642. X   v2i ( v2 ) ;
  1643. X   v2i ( v3 ) ;
  1644. X   v2i ( v4 ) ;
  1645. X   endclosedline () ;
  1646. X   if ( damage > 100.0 ) damage = 100.0 ;
  1647. X   color ( PANELDAMCOLOR ) ;
  1648. X   v1[0] = left ;
  1649. X   v1[1] = damlower ;
  1650. X   v2[0] = (damage/100.0)*(rite-left)+left  ;
  1651. X   v2[1] = damlower ;
  1652. X   v3[0] = v2[0] ;
  1653. X   v3[1] = damupper ;
  1654. X   v4[0] = left ;
  1655. X   v4[1] = v3[1] ;
  1656. X   bgnpolygon () ;
  1657. X   v2i ( v1 ) ;
  1658. X   v2i ( v2 ) ;
  1659. X   v2i ( v3 ) ;
  1660. X   v2i ( v4 ) ;
  1661. X   endpolygon () ;
  1662. X   color ( YELLOW ) ;
  1663. X   for ( i = 1 ; i <= 9 ; i++ ) {
  1664. X      v1[0] = left + (rite-left)/10.0*i ;
  1665. X      v1[1] = damlower ;
  1666. X      v2[0] = v1[0] ;
  1667. X      v2[1] = damupper ;
  1668. X      bgnline () ;
  1669. X         v2i ( v1 ) ;
  1670. X         v2i ( v2 ) ;
  1671. X      endline () ;
  1672. X   }
  1673. X
  1674. X   /* Update console message window */
  1675. X   damlower -= 20 ;
  1676. X   damupper = (consupper-conslower)/10.0 + damlower ;
  1677. X   v1[0] = left-1 ;
  1678. X   v1[1] = damlower-1 ;
  1679. X   v2[0] = rite+1 ;
  1680. X   v2[1] = damlower-1 ;
  1681. X   v3[0] = rite+1 ;
  1682. X   v3[1] = damupper+1 ;
  1683. X   v4[0] = left-1 ;
  1684. X   v4[1] = damupper+1 ;
  1685. X   color ( WORLDBGCOLOR ) ;
  1686. X   bgnpolygon () ;
  1687. X   v2i ( v1 ) ;
  1688. X   v2i ( v2 ) ;
  1689. X   v2i ( v3 ) ;
  1690. X   v2i ( v4 ) ;
  1691. X   endpolygon () ;
  1692. X   cmov2i ( left+1, damlower+1 ) ;
  1693. X   color ( consolemsgcolor ) ;
  1694. X   charstr ( consolemsg ) ;
  1695. X
  1696. X   /* Update No. of enemies left */
  1697. X   color ( YELLOW ) ;
  1698. X   sprintf ( buff, "Enemies Left : %d", enemleft ) ;
  1699. X   cmov2i ( left, (int)((float)(consupper-conslower)/2.0+conslower)-30 ) ;
  1700. X   charstr ( buff ) ;
  1701. X
  1702. X   /* Update no. of cloaked enemies */
  1703. X   sprintf ( buff, "Missile dist : %-9.2f", enemymissile.distfromship ) ;
  1704. X   cmov2i ( left, (int)((float)(consupper-conslower)*3.0/4.0+conslower)-30 ) ;
  1705. X   charstr ( buff ) ;
  1706. X
  1707. X   /* Update Points */
  1708. X   sprintf ( buff, "Points       : %-9.0f", points ) ;
  1709. X   cmov2i ( left, (int)((float)(consupper-conslower)/4.0+conslower)-30 ) ;
  1710. X   charstr ( buff ) ;
  1711. X
  1712. X   /* Print Version */
  1713. X   cmov2i ( left, conslower-25 ) ;
  1714. X   color ( GREEN ) ;
  1715. X   charstr ( "VR v1.0 (c) 1992 - Cado" ) ;
  1716. X
  1717. X   popviewport () ;
  1718. X   popmatrix () ;
  1719. X}
  1720. X
  1721. X
  1722. Xcheck_game ()
  1723. X{
  1724. X   if ( damage >= 100 ) game_over ( "100% Ship damage" ) ;
  1725. X   if ( fuelleft < 0 )  game_over ( "Ran out of fuel" ) ;
  1726. X   if ( torpleft <= 0 ) game_over ( "Ran out of torpedos" ) ;
  1727. X   if ( enemleft == 0 ) {
  1728. X      ringbell () ;
  1729. X      ringbell () ;
  1730. X      ringbell () ;
  1731. X      ringbell () ;
  1732. X      game_over ( "Congrats !!" ) ;
  1733. X   }
  1734. X}
  1735. X
  1736. X
  1737. X
  1738. Xclear_console_message ()
  1739. X{
  1740. X   mainloopcycles++ ;
  1741. X   if ( mainloopcycles%20 == 0 ) {
  1742. X      mainloopcycles = 0 ;
  1743. X      consmsg ( "All Systems Normal", WHITE ) ;
  1744. X   }
  1745. X}
  1746. X
  1747. X
  1748. X
  1749. Xconsmsg ( msg, col )
  1750. Xchar *msg ;
  1751. Xint  col ;
  1752. X{
  1753. X   mainloopcycles = 0 ;
  1754. X   consolemsgcolor = col ;
  1755. X   strcpy ( consolemsg, msg ) ;
  1756. X}
  1757. X
  1758. X
  1759. Xmain ( c, v )
  1760. Xint  c   ;
  1761. Xchar **v ;
  1762. X{
  1763. X   short val ;
  1764. X   char  buff[100] ;
  1765. X   int qt ;
  1766. X
  1767. X   printf ( "\n\n\nVR v1.0 by Cado <12/3/92>\n\n" ) ;
  1768. X   system ( "/usr/NeWS/bin/keywarp 10 1" ) ;
  1769. X
  1770. X   /* Seed random no. generator */
  1771. X   srand48 ( time ( 0 ) ) ;
  1772. X
  1773. X   init_stat () ;
  1774. X   init_gfx ();
  1775. X   pushmatrix () ;
  1776. X
  1777. X   /* Main Game Loop */
  1778. X   while ( TRUE ) { 
  1779. X      draw_window () ;
  1780. X      update_console_panels () ;
  1781. X      swapbuffers () ;
  1782. X      check_game () ;
  1783. X      
  1784. X      clear_console_message () ;
  1785. X
  1786. X      if ( cloakdetector == ON ) {
  1787. X         fuelleft -= MAXFUEL*0.005 ;
  1788. X         cloakdetector = OFF ;
  1789. X         consmsg ( "All Systems Normal", WHITE ) ;
  1790. X      }
  1791. X
  1792. X      while ( qtest() ) {
  1793. X         switch ( qread ( &val ) ) {
  1794. X         case SKEY :
  1795. X         /* Increase forward ship thrust */
  1796. X            if ( thrust < MAXTHRUST )
  1797. X               thrust += stepthrust ;
  1798. X            else
  1799. X               consmsg ( "Reached WARP 9", YELLOW ) ;
  1800. X            break ;
  1801. X         case AKEY :
  1802. X         /* Increase backward ship thrust */
  1803. X            if ( thrust > -MAXTHRUST )
  1804. X               thrust -= stepthrust ;
  1805. X            else
  1806. X               consmsg ( "Reached WARP 9", YELLOW ) ;
  1807. X            break ;
  1808. X         case ZKEY :
  1809. X         /* Full brakes -- halt ship */
  1810. X            consmsg ( "Ship Halt", YELLOW ) ;
  1811. X            thrust = 0 ;
  1812. X            break ;
  1813. X
  1814. X         case CKEY :
  1815. X         /* Torpedo firing cross wire toggle */
  1816. X            crosswire = ! crosswire ;
  1817. X            sprintf ( buff, "Torpedo Targeting %s",
  1818. X               (crosswire==ON)? "ON":"OFF" ) ;
  1819. X            consmsg ( buff, YELLOW ) ;
  1820. X            while ( qtest() ) qread ( &val ) ;
  1821. X            break ;
  1822. X
  1823. X         case DKEY :
  1824. X         /* Cloaked enemy detector button */
  1825. X            cloakdetector = ON ;
  1826. X            consmsg ( "Cloak Detector ON", 128 ) ;
  1827. X            break ;
  1828. X
  1829. X         /* Ship rotation keys */
  1830. X         case LEFTARROWKEY : 
  1831. X            yrot = steprot ;
  1832. X            break ;
  1833. X         case RIGHTARROWKEY : 
  1834. X            yrot = -steprot ;
  1835. X            break ;
  1836. X         case UPARROWKEY : 
  1837. X            xrot = steprot ;
  1838. X            break ;
  1839. X         case DOWNARROWKEY : 
  1840. X            xrot = -steprot ;
  1841. X            break ;
  1842. X         case COMMAKEY : 
  1843. X            zrot = -steprot ;
  1844. X            break ;
  1845. X         case PERIODKEY : 
  1846. X            zrot = steprot ;
  1847. X            break ;
  1848. X
  1849. X         /* Ship rotation control keys */
  1850. X         case PADENTER :
  1851. X            if ( steprot < MAXROT )
  1852. X               steprot += 10 ;
  1853. X            break ;
  1854. X         case PAD0 :
  1855. X            if ( steprot > MINROT )
  1856. X               steprot -= 10 ;
  1857. X            break ;
  1858. X
  1859. X         case SPACEKEY :
  1860. X         /* Fire torpedo or laser tracker */
  1861. X            if ( trackertoggle == ON ) {
  1862. X               enemyinfo[enemynum].destroyed = TRUE ;
  1863. X               enemyinfo[enemynum].exploding = TRUE ;
  1864. X               consmsg ( "Laser tracker success", GREEN ) ;
  1865. X               trackertoggle = OFF ;
  1866. X               ntrackersleft-- ;
  1867. X               enemleft-- ;
  1868. X               points += 1000.0 ;
  1869. X            }
  1870. X            else if ( ntorp < MAXTORPFIRE )
  1871. X               fire_torpedo () ;
  1872. X            break ;
  1873. X
  1874. X         case TKEY :
  1875. X         /* Laser tracker targeting instrument */
  1876. X            qreset () ;
  1877. X            if ( trackertoggle == ON ) {
  1878. X               trackertoggle = OFF ;
  1879. X               consmsg ( "Targeting OFF", WHITE ) ;
  1880. X               enemyinfo[enemynum].level = prevstate ;
  1881. X            }
  1882. X            else {
  1883. X               if ( ntrackersleft > 0 ) {
  1884. X                  consmsg ( "Targeting ...", WHITE ) ;
  1885. X                  target_enemy () ;
  1886. X               }
  1887. X               else
  1888. X                  consmsg ( "No tracer lasers left", YELLOW ) ;
  1889. X            }
  1890. X            break ;
  1891. X
  1892. X
  1893. X         case ESCKEY :
  1894. X            exit_game () ;
  1895. X         }
  1896. X      }
  1897. X   }
  1898. X}
  1899. X
  1900. X
  1901. Xpr ( v )
  1902. XVEC v ;
  1903. X{
  1904. X   printf ( "%f %f %f\n", v.x, v.y, v.z ) ;
  1905. X}
  1906. X
  1907. X
  1908. Xmat_transform ( a, v )
  1909. XMatrix a  ;
  1910. XVEC    *v ;
  1911. X{
  1912. X   VEC vn ;
  1913. X
  1914. X   vn.x = a[0][0]*v->x + a[0][1]*v->y + a[0][2]*v->z ;
  1915. X   vn.y = a[1][0]*v->x + a[1][1]*v->y + a[1][2]*v->z ;
  1916. X   vn.z = a[2][0]*v->x + a[2][1]*v->y + a[2][2]*v->z ;
  1917. X   COPY_VEC ( (*v), vn ) ;
  1918. X}
  1919. X
  1920. X
  1921. X
  1922. Xcheck_for_ship_collision ()
  1923. X{
  1924. X   int i ;
  1925. X   VEC tdir, un, refdir, olddir, expsite ;
  1926. X   int chdir ;
  1927. X   Matrix mx  ;
  1928. X   VEC    n   ;
  1929. X   float  ang ;
  1930. X
  1931. X   if ( shippos[1].x <= CUBEMIN ||
  1932. X        shippos[1].y <= CUBEMIN ||
  1933. X        shippos[1].z <= CUBEMIN ||
  1934. X        shippos[1].x >= CUBEMAX ||
  1935. X        shippos[1].y >= CUBEMAX ||
  1936. X        shippos[1].z >= CUBEMAX )
  1937. X      game_over ( "Collided with wall" ) ;
  1938. X
  1939. X   for ( i = 0 ; i < MAXENEM ; i++ ) {
  1940. X      if ( enemyinfo[i].destroyed == FALSE )
  1941. X      if ( DIST ( shippos[1], enemyinfo[i].pos )
  1942. X           < ENEMSIZ ) {
  1943. X         damage += (ABS(thrust)/MAXTHRUST) ;
  1944. X         collided ( "enemy" ) ;
  1945. X         COPY_VEC ( expsite, shippos[1] ) ;
  1946. X         expsite.x += shipz.x*5.0 ;
  1947. X         expsite.y += shipz.y*5.0 ;
  1948. X         expsite.z += shipz.z*5.0 ;
  1949. X         big_explosion ( expsite ) ;
  1950. X      }
  1951. X   }
  1952. X
  1953. X   if ( enemymissile.destroyed == FALSE )
  1954. X   if ( (enemymissile.distfromship = DIST ( shippos[1], enemymissile.pos ))
  1955. X        < SHIPSIZ/2.0 ) {
  1956. X      damage += 10 ;
  1957. X      collided ( "enemy missile" ) ;
  1958. X      COPY_VEC ( expsite, shippos[1] ) ;
  1959. X      expsite.x += shipz.x*5.0 ;
  1960. X      expsite.y += shipz.y*5.0 ;
  1961. X      expsite.z += shipz.z*5.0 ;
  1962. X      big_explosion ( expsite ) ;
  1963. X   }
  1964. X}
  1965. X
  1966. X
  1967. X
  1968. Xcheck_for_torpedo_collision ( torpnum )
  1969. Xint torpnum ;
  1970. X{
  1971. X   int i ;
  1972. X   float dist, pfact ;
  1973. X
  1974. X   if ( torpinfo[torpnum].torpedopos.x <= CUBEMIN || 
  1975. X        torpinfo[torpnum].torpedopos.x >= CUBEMAX ||
  1976. X        torpinfo[torpnum].torpedopos.y <= CUBEMIN || 
  1977. X        torpinfo[torpnum].torpedopos.y >= CUBEMAX ||
  1978. X        torpinfo[torpnum].torpedopos.z <= CUBEMIN || 
  1979. X        torpinfo[torpnum].torpedopos.z >= CUBEMAX ) {
  1980. X      torpinfo[torpnum].fired = FALSE ;
  1981. X      ntorp-- ;
  1982. X      explosion ( torpinfo[torpnum].torpedopos ) ;
  1983. X   }
  1984. X
  1985. X   for ( i = 0 ; i < MAXENEM ; i++ ) {
  1986. X      if ( ( enemyinfo[i].destroyed == FALSE ) && 
  1987. X           (dist = DIST ( torpinfo[torpnum].torpedopos, 
  1988. X                          enemyinfo[i].pos ))
  1989. X           < ENEMSIZ ) {
  1990. X         torpinfo[torpnum].fired = FALSE ;
  1991. X         ntorp-- ;
  1992. X         big_explosion ( torpinfo[torpnum].torpedopos ) ;
  1993. X         pfact = 1.0 ;
  1994. X         dist = DIST ( enemyinfo[i].pos, shippos[1] ) ;
  1995. X
  1996. X         if ( enemyinfo[i].tough == TRUE ) {
  1997. X         /* Tough enemy needs to be shot multiple times */
  1998. X            switch ( enemyinfo[i].level ) {
  1999. X            case BLUE :
  2000. X               pfact = 2.5 ;
  2001. X               enemyinfo[i].destroyed = TRUE ;
  2002. X               enemyinfo[i].exploding = TRUE ;
  2003. X               enemleft-- ;
  2004. X               consmsg ( 
  2005. X                  (enemyinfo[i].cloaked == TRUE) ?
  2006. X                  "Cloaked Enemy destroyed" : "Enemy destroyed", 
  2007. X                  GREEN 
  2008. X               ) ;
  2009. X               break ;
  2010. X            case YELLOW :
  2011. X               pfact = 2.0 ;
  2012. X               if ( drand48() > 0.95 ) {
  2013. X               /* Terrible luck !! */
  2014. X                  consmsg ( "Enemy cloaked", RED ) ;
  2015. X                  enemyinfo[i].cloaked = TRUE ;
  2016. X               }
  2017. X               else {
  2018. X                  enemyinfo[i].level = BLUE ;
  2019. X                  enemyinfo[i].speed *= TOUGHENEMSPEEDFACT ;
  2020. X                  consmsg ( "Enemy hit", GREEN ) ;
  2021. X               }
  2022. X               break ;
  2023. X            case GREEN :
  2024. X               pfact = 1.5 ;
  2025. X               enemyinfo[i].level = YELLOW ;
  2026. X               enemyinfo[i].speed *= TOUGHENEMSPEEDFACT ;
  2027. X               consmsg ( "Enemy hit", GREEN ) ;
  2028. X               break ;
  2029. X            case WHITE :
  2030. X               pfact = 1.0 ;
  2031. X               enemyinfo[i].level = GREEN ;
  2032. X               enemyinfo[i].speed *= TOUGHENEMSPEEDFACT ;
  2033. X               consmsg ( "Enemy hit", GREEN ) ;
  2034. X               break ;
  2035. X            case CYAN :
  2036. X            /* Marked by tracker beam */ 
  2037. X               pfact = 0.0 ;
  2038. X               break ;
  2039. X            }
  2040. X         }
  2041. X         else {
  2042. X            if ( enemyinfo[i].level == CYAN )
  2043. X               pfact = 0.0 ;
  2044. X            else {
  2045. X               enemyinfo[i].destroyed = TRUE ;
  2046. X               enemyinfo[i].exploding = TRUE ;
  2047. X               enemleft-- ;
  2048. X               consmsg ( "Enemy destroyed", GREEN ) ;
  2049. X            }
  2050. X         }
  2051. X         points += pfact*dist ;
  2052. X      }
  2053. X   }
  2054. X
  2055. X   if ( enemymissile.destroyed == FALSE ) 
  2056. X   if ( DIST ( enemymissile.pos, torpinfo[torpnum].torpedopos ) < 
  2057. X               enemymissile.msiz ) {
  2058. X   /* Destroyed an enemy missile */
  2059. X      points += 10000.0 ;
  2060. X      enemymissileshit++ ;
  2061. X      consmsg ( "Missile destroyed", GREEN ) ;
  2062. X      enemymissile.destroyed = TRUE ;
  2063. X      big_explosion ( torpinfo[torpnum].torpedopos ) ;
  2064. X   }
  2065. X}
  2066. X
  2067. X
  2068. X
  2069. Xcheck_for_enemy_bounce ( eni )
  2070. Xint eni ;
  2071. X{
  2072. X   VEC tdir, un, refdir ;
  2073. X   int chdir ;
  2074. X
  2075. X   chdir = FALSE ;
  2076. X
  2077. X   if ( enemyinfo[eni].pos.x <= CUBEMIN ) {
  2078. X      un.x = 1  ;
  2079. X      un.y = 0  ;
  2080. X      un.z = 0  ;
  2081. X      chdir = TRUE ;
  2082. X   }
  2083. X   if ( enemyinfo[eni].pos.x >= CUBEMAX ) {
  2084. X      un.x = -1  ;
  2085. X      un.y = 0  ;
  2086. X      un.z = 0  ;
  2087. X      chdir = TRUE ;
  2088. X   }
  2089. X   if ( enemyinfo[eni].pos.y <= CUBEMIN ) {
  2090. X      un.x = 0  ;
  2091. X      un.y = 1  ;
  2092. X      un.z = 0  ;
  2093. X      chdir = TRUE ;
  2094. X   }
  2095. X   if ( enemyinfo[eni].pos.y >= CUBEMAX ) {
  2096. X      un.x = 0  ;
  2097. X      un.y = -1  ;
  2098. X      un.z = 0  ;
  2099. X      chdir = TRUE ;
  2100. X   }
  2101. X   if ( enemyinfo[eni].pos.z <= CUBEMIN ) {
  2102. X      un.x = 0  ;
  2103. X      un.y = 0  ;
  2104. X      un.z = 1  ;
  2105. X      chdir = TRUE ;
  2106. X   }
  2107. X   if ( enemyinfo[eni].pos.z >= CUBEMAX ) {
  2108. X      un.x = 0  ;
  2109. X      un.y = 0  ;
  2110. X      un.z = -1  ;
  2111. X      chdir = TRUE ;
  2112. X   }
  2113. X
  2114. X   if ( chdir == TRUE ) {
  2115. X      SCALE_VEC ( enemyinfo[eni].dir, enemyinfo[eni].dir, -1.0 ) ;
  2116. X      REFL_RAY ( enemyinfo[eni].dir, enemyinfo[eni].pos, un, refdir ) ;
  2117. X      COPY_VEC ( enemyinfo[eni].dir, refdir ) ;
  2118. X   }
  2119. X}
  2120. X
  2121. X
  2122. Xcheck_for_enemy_missile_collision ()
  2123. X{
  2124. X   if ( enemymissile.pos.x <= CUBEMIN || 
  2125. X        enemymissile.pos.x >= CUBEMAX ||
  2126. X        enemymissile.pos.y <= CUBEMIN || 
  2127. X        enemymissile.pos.y >= CUBEMAX ||
  2128. X        enemymissile.pos.z <= CUBEMIN || 
  2129. X        enemymissile.pos.z >= CUBEMAX ) {
  2130. X      enemymissile.destroyed = TRUE ;
  2131. X      explosion ( enemymissile.pos ) ;
  2132. X   }
  2133. X}
  2134. X
  2135. X
  2136. X
  2137. Xexplosion ( v )
  2138. XVEC v ;
  2139. X{
  2140. X   int i ;
  2141. X   VEC3 v1, vp ;
  2142. X   VEC  r      ;
  2143. X
  2144. X   linewidth ( 2 ) ;
  2145. X   color ( RED ) ;
  2146. X
  2147. X   VECTOVEC3 ( vp, v ) ;
  2148. X   for ( i = 0 ; i < 10 ; i++ ) {
  2149. X   r.x = ( 2*drand48 () - 1 ) ;
  2150. X   r.y = ( 2*drand48 () - 1 ) ;
  2151. X   r.z = ( 2*drand48 () - 1 ) ;
  2152. X   NORM ( r ) ;
  2153. X   v1[0] = v.x+r.x*EXPSIZ ;
  2154. X   v1[1] = v.y+r.y*EXPSIZ ;
  2155. X   v1[2] = v.z+r.z*EXPSIZ ;
  2156. X   bgnline () ;
  2157. X      v3f ( vp ) ;
  2158. X      v3f ( v1 ) ;
  2159. X   endline ;
  2160. X   }
  2161. X   linewidth ( 1 ) ;
  2162. X}
  2163. X
  2164. X
  2165. Xbig_explosion ( v )
  2166. XVEC v ;
  2167. X{
  2168. X   int i ;
  2169. X   VEC3 v1, vp ;
  2170. X   VEC  r      ;
  2171. X
  2172. X   linewidth ( 4 ) ;
  2173. X   color ( RED ) ;
  2174. X
  2175. X   VECTOVEC3 ( vp, v ) ;
  2176. X   for ( i = 0 ; i < 30 ; i++ ) {
  2177. X   r.x = ( 2*drand48 () - 1 ) ;
  2178. X   r.y = ( 2*drand48 () - 1 ) ;
  2179. X   r.z = ( 2*drand48 () - 1 ) ;
  2180. X   NORM ( r ) ;
  2181. X   v1[0] = v.x+r.x*EXPSIZ ;
  2182. X   v1[1] = v.y+r.y*EXPSIZ ;
  2183. X   v1[2] = v.z+r.z*EXPSIZ ;
  2184. X   bgnline () ;
  2185. X      v3f ( vp ) ;
  2186. X      v3f ( v1 ) ;
  2187. X   endline ;
  2188. X   }
  2189. X   linewidth ( 1 ) ;
  2190. X}
  2191. X
  2192. X
  2193. Xcollided ( withwhat )
  2194. Xchar *withwhat ;
  2195. X{
  2196. X   char buff[100] ;
  2197. X   ringbell () ;
  2198. X   sprintf ( buff, "Hit by %s", withwhat ) ;
  2199. X   consmsg ( buff, RED ) ;
  2200. X}
  2201. X
  2202. X
  2203. Xgame_over ( msg )
  2204. Xchar *msg ;
  2205. X{
  2206. X   int   key, i ;
  2207. X   short val    ;
  2208. X
  2209. X   ortho2 ( (Coord)0, (Coord)xsiz, (Coord)vpst, (Coord)ysiz ) ;
  2210. X   cmov2 ( xsiz/2.0-strwidth("Game Over")/2.0, (ysiz-vpst)/3.0+vpst ) ;
  2211. X   color ( WHITE ) ;
  2212. X   charstr ( "Game Over" ) ;
  2213. X   gov = TRUE ;
  2214. X   consmsg ( msg, WHITE  ) ;
  2215. X   update_console_panels () ;
  2216. X   swapbuffers () ;
  2217. X   while ( TRUE )
  2218. X   if ( qtest () ) {
  2219. X      key = qread (&val) ;
  2220. X      if ( key == ESCKEY ) exit_game () ;
  2221. X      else if ( key == RKEY ) break ;
  2222. X   }
  2223. X}
  2224. X
  2225. X
  2226. X
  2227. Xrestart ()
  2228. X/* Restart the game */
  2229. X{
  2230. X   int i ;
  2231. X
  2232. X   init_stat () ;
  2233. X   for ( i = 0 ; i < MAXENEM ; i++ ) {
  2234. X      enemyinfo[i].destroyed = FALSE ;
  2235. X      enemyinfo[i].level     = WHITE ;
  2236. X      enemyinfo[i].level     = WHITE ;
  2237. X      if ( drand48 () > 0.9 )
  2238. X      /* Stationary enemy */
  2239. X         enemyinfo[i].speed = 0.0 ;
  2240. X      else
  2241. X         enemyinfo[i].speed = ENEMSPEED ;
  2242. X   }
  2243. X   popmatrix () ;
  2244. X   pushmatrix () ;
  2245. X   consmsg ( "RESTART", YELLOW ) ;
  2246. X}
  2247. X
  2248. X
  2249. X
  2250. X/*
  2251. X * Create a rotation matrix along the given axis by the given angle 
  2252. X * in degrees.  The axis is a set of direction cosines.
  2253. X * This is originally from Eric Haines' SPD package.
  2254. X */
  2255. Xlib_create_axis_rotate_matrix( mx, vaxis, angle )
  2256. XMatrix    mx ;
  2257. XVEC       vaxis ;
  2258. Xfloat     angle ;
  2259. X{
  2260. X   float cosine, one_minus_cosine, sine ;
  2261. X   int   i, j ;
  2262. X   VEC3  axis ;
  2263. X
  2264. X   angle *= M_PI/180.0 ;
  2265. X   VECTOVEC3 ( axis, vaxis ) ;
  2266. X
  2267. X   for ( j = 0 ; j < 4 ; j++ )
  2268. X   for ( i = 0 ; i < 4 ; i++ )
  2269. X      mx[j][i] = 0 ;
  2270. X
  2271. X   cosine = COS( angle ) ;
  2272. X   sine = SIN ( angle ) ;
  2273. X   one_minus_cosine = 1.0 - cosine ;
  2274. X
  2275. X   mx[0][0] = SQR(axis[X]) + (1.0 - SQR(axis[X])) * cosine ;
  2276. X   mx[0][1] = axis[X] * axis[Y] * one_minus_cosine + axis[Z] * sine ;
  2277. X   mx[0][2] = axis[X] * axis[Z] * one_minus_cosine - axis[Y] * sine ;
  2278. X
  2279. X   mx[1][0] = axis[X] * axis[Y] * one_minus_cosine - axis[Z] * sine ;
  2280. X   mx[1][1] = SQR(axis[Y]) + (1.0 - SQR(axis[Y])) * cosine ;
  2281. X   mx[1][2] = axis[Y] * axis[Z] * one_minus_cosine + axis[X] * sine ;
  2282. X
  2283. X   mx[2][0] = axis[X] * axis[Z] * one_minus_cosine + axis[Y] * sine ;
  2284. X   mx[2][1] = axis[Y] * axis[Z] * one_minus_cosine - axis[X] * sine ;
  2285. X   mx[2][2] = SQR(axis[Z]) + (1.0 - SQR(axis[Z])) * cosine ;
  2286. X
  2287. X   mx[3][3] = 1.0 ;
  2288. X}
  2289. X
  2290. X
  2291. Xexit_game ()
  2292. X{
  2293. X   system ( "/usr/NeWS/bin/keywarp 25 1" ) ;
  2294. X   exit ( 0 ) ;
  2295. X}
  2296. X
  2297. X
  2298. X
  2299. Xtarget_enemy ()
  2300. X/* Laser targeting */
  2301. X{
  2302. X   float  beam, dist, bbt, dr1[3], dr2[3] ;
  2303. X   VEC    trackerbeampos, beammov ;
  2304. X   int i ;
  2305. X
  2306. X   COPY_VEC ( trackerbeampos, shippos[1] ) ;
  2307. X   INIT_VEC ( beammov, shipz.x*beaminc, shipz.y*beaminc, shipz.z*beaminc ) ;
  2308. X   for ( beam = 0 ; beam <= (CUBEMAX-CUBEMIN) ; beam += beaminc ) {
  2309. X      ADD_VEC ( trackerbeampos, beammov ) ;
  2310. X      bbt = beam*tanfovyrad ;
  2311. X      for ( i = 0 ; i < MAXENEM ; i++ ) {
  2312. X         if ( enemyinfo[i].destroyed == FALSE ) {
  2313. X            dist = DIST ( trackerbeampos, enemyinfo[i].pos ) ;
  2314. X            if ( dist < bbt ) {
  2315. X               prevstate = enemyinfo[i].level ;
  2316. X               enemyinfo[i].level = CYAN ;
  2317. X               consmsg ( "Laser Locked ON", GREEN ) ;
  2318. X               enemynum = i ;
  2319. X               trackertoggle = ON ;
  2320. X               return ;
  2321. X            }
  2322. X         }
  2323. X      }
  2324. X   }
  2325. X   consmsg ( "Laser NOT Locked ON", YELLOW ) ;
  2326. X}
  2327. X
  2328. SHAR_EOF
  2329. chmod 0666 vr1.c || echo "restore of vr1.c fails"
  2330. exit 0
  2331.