Author Topic: Moon Lander (reprise by request)  (Read 3432 times)

0 Members and 1 Guest are viewing this topic.

Offline Richard Frost

  • Seasoned Forum Regular
  • Posts: 316
  • Needle nardle noo. - Peter Sellers
    • View Profile
Moon Lander (reprise by request)
« on: March 01, 2020, 09:20:41 pm »
Code: QB64: [Select]
  1. $EXEICON:'astro.ico'
  2.  
  3. ' bugs: synch LM with skyobject when moving off screen
  4. ' todo: make star position lines proper (curve)
  5. ' ideas: when McD bombed, replace with KFC, Starbucks, somehow add Microsoft, Apple, FB, Amazon
  6.  
  7. DEFINT A-Z
  8.  
  9. ' declares retained for documentation
  10. DECLARE FUNCTION dcolor (z!, i, j, z)  '                              color for good, caution, danger
  11. DECLARE FUNCTION gety (x)              '                              surface height
  12. DECLARE FUNCTION localize(i,j,k)       '                              real x to local x
  13. DECLARE FUNCTION OnOff$ (z)            '                              On/Off text
  14.                  
  15. DECLARE SUB Area51 (tf$)               '                              first landing area
  16. DECLARE SUB AuHoVe (i, j, k, z)        '                              auto/hover/vertical switches
  17. DECLARE SUB Bar (z!,i)                 '                              LED bargraph
  18. DECLARE SUB BlackHole (z)              '                              garbage disposal unit
  19. DECLARE SUB BlackHoleDoom ()           '                              absorb LM
  20. DECLARE SUB Borg (tx, ty)              '                              Star Trek!
  21. DECLARE SUB CarWash                    '                              Montezuma Car Wash
  22. DECLARE SUB CMshadow (tx,x1,x2)        '                              Sun top right
  23. DECLARE SUB Comet (tx,ty)              '                              Halle Berry
  24. DECLARE SUB CybillPix (tf$)            '                              Shepherd pix for TMA kill
  25. DECLARE SUB DeathStar (tx, tf$)        '                              Star Wars / EPCOR
  26. DECLARE SUB Evaluate (i, j)            '                              the landing
  27. DECLARE SUB ExplodeLM ()               '                              expanding ring of debris
  28. DECLARE SUB ExplodeShell (z)           '                              lasered by LM or TMA1
  29. DECLARE SUB FlagandFireworks           '                              US & Soviet Onion flags
  30. DECLARE SUB GetSurface (z)             '                              load sd(emo),sl(evel),s0-10.dat
  31. DECLARE SUB GraphSpeed ()              '                              diagnostics
  32. DECLARE SUB Grave (tx, z$)             '                              JFK, usually
  33. DECLARE SUB Henonp (tf)                '                              color cycling title graphic
  34. DECLARE SUB Hollywood ()               '                              area 9 sign
  35. DECLARE SUB IBM ()                     '                              with tape drive & binary clock
  36. DECLARE SUB Info ()                    '                              messages at top of screen
  37. DECLARE SUB LEDdisplay (z$)            '                              simulate a Seiko watch
  38. DECLARE SUB LGM (flame)                '                              little green man flame count
  39. DECLARE SUB LMbloads ()                '                              x,y,c
  40. DECLARE SUB LMdistort ()               '                              crash
  41. DECLARE SUB LoadPanel ()               '                              instrument panel
  42. DECLARE SUB MakeSur ()                 '                              create surfaces (demo,level,0-10)
  43. DECLARE SUB Mandel ()                  '                              in TMA when landed on
  44. DECLARE SUB Map ()                     '                              dots/text at top
  45. DECLARE SUB McD ()                     '                              burger Emporium
  46. DECLARE SUB mHelp()                    '                              3 help pages
  47. DECLARE SUB PrepAndShowLED (t!,i,j)    '                              7 segment displays
  48. DECLARE SUB Quit ()                    '                              vamoose
  49. DECLARE SUB Shells ()                  '                              IBM weapons
  50. DECLARE SUB ShowAngle (angle)          '                              angle/side thrust
  51. DECLARE SUB Parachute ()               '                              funny!
  52. DECLARE SUB PrintLines (z$,i,j,x,y,c1,c2,k,z) '                       called by PrintVGA
  53. DECLARE SUB PrintCGA (z$,x,y,i,j,k)    '                              8 * 8 font
  54. DECLARE SUB PrintVGA (z$,x,y,i,j)      '                              8 * 14 font
  55. DECLARE SUB SaveImage(f$)              '                              screen capture
  56. DECLARE SUB Setcolor()                 '                              load palettes
  57. DECLARE SUB Smooth (p)                 '                              smooth ground transitions
  58. DECLARE SUB sprint (z$, tx, ty, c1, c2)   '                           redundant?
  59. DECLARE SUB sprint2 (c$, x, y, c1, c2)    '                           redundant?
  60. DECLARE SUB stars (twinkle)            '                              load/plot stars
  61. DECLARE SUB TinyFont (d$, tx, ty, tc)  '                              tiny 3*5 font
  62. DECLARE SUB Surveyor ()                '                              radioactive robot
  63. DECLARE SUB Tile ()                    '                              ground effect
  64. DECLARE SUB TMA ()                     '                              w/ circle patterns/Mandel/Shepard
  65. DECLARE SUB UFO (tx, ty, z)            '                              traditional flying saucer
  66. DECLARE SUB Volcano ()                 '                              Mt. Etna/Cheddar
  67. DECLARE SUB WormHole ()                '                              killer spirals
  68. DECLARE SUB Wave ()                    '                              warp speed instrument distortion
  69.  
  70. DIM SHARED a '                                                        angle of craft
  71. DIM SHARED a51i '                                                     Area 51 initializations
  72. DIM SHARED APdisengage '                                              AutoPilot disengage
  73. DIM SHARED ASO '                                                      ascent stage only
  74. DIM SHARED auto '                                                     autopilot
  75. DIM SHARED background '                                               for instrument panel
  76. DIM SHARED bh '                                                       black hole
  77. DIM SHARED bhx, bhy '                                                 black hole
  78. DIM SHARED bbit '                                                     blinking bit synced to time
  79. DIM SHARED bolthit, bolthitf, boltx '                                 Deathstar hit vehicle, feature
  80. DIM SHARED borgl, borgr, borgt '                                      left right top, distance
  81. DIM SHARED bstyle1, bstyle2 '                                         Borg matrix/lines/Moire
  82. DIM SHARED bw '                                                       black and white
  83. DIM SHARED c '                                                        usually color
  84. DIM SHARED canvas& '                                                  primary screen
  85. DIM SHARED cbh '                                                      constant black holes
  86. DIM SHARED center '                                                   varies according to gs (graphics start)
  87. DIM SHARED chs '                                                      parachute size
  88. DIM SHARED contact '                                                  landed
  89. DIM SHARED convo '                                                    conversation active LM/CM
  90. DIM SHARED cpal '                                                     color palette, normal/green/b&w (32 color kludge/fun)
  91. DIM SHARED craft '                                                    color
  92. DIM SHARED crash '                                                    layer of debris
  93. DIM SHARED cwd, cwsi, cwsd '                                          car wash distance, angles
  94. DIM SHARED cybilltime! '                                              time on screen
  95. DIM SHARED darkstarc '                                                deathstar color set
  96. DIM SHARED darkstars '                                                deathstar spin rate
  97. DIM SHARED darkstart '                                                   "      thickness
  98. DIM SHARED dead$ '                                                    end condition
  99. DIM SHARED debug$ '                                                   messages to God
  100. DIM SHARED demo '                                                     ground features compressed
  101. DIM SHARED doclock '                                                  it's Howdy Doody time
  102. DIM SHARED dosbox '                                                   flag
  103. DIM SHARED dsinit '                                                   deathstar
  104. DIM SHARED eou '                                                      end of universe
  105. DIM SHARED fb$ '                                                      landing feedback/analysis
  106. DIM SHARED flx '                                                      US/USSR flag position
  107. DIM SHARED fuel, fuel! '                                              color of, quantity left
  108. DIM SHARED gh, glmin, glmax '                                         ground height, level
  109. DIM SHARED grav! '                                                    gravity
  110. DIM SHARED gs '                                                       flight area x start
  111. DIM SHARED gstyle '                                                   ground style
  112. DIM SHARED inpause '                                                  flag
  113. DIM SHARED invincible '                                               impervious to threats
  114. DIM SHARED iscd '                                                     don't attempt to write!
  115. DIM SHARED jitter '                                                   shift-T to control
  116. DIM SHARED LEDc '                                                     color
  117. DIM SHARED LEDtri '                                                   tri-color flag
  118. DIM SHARED level '                                                    surface is
  119. DIM SHARED LGMc '                                                     Little Green Man color
  120. DIM SHARED liftoff '                                                  AS only
  121. DIM SHARED lmsl '                                                     LM shield/laser color
  122. DIM SHARED lob '                                                      landed on Borg
  123. DIM SHARED lockfuel '                                                 cheat!
  124. DIM SHARED lp, rp, xp, th1, th2 '                                     pads, radar, thrusters
  125. DIM SHARED magic '                                                    cheat! (instant landing)
  126. DIM SHARED mdelay '                                                   PgUp/PgDn controlled
  127. DIM SHARED msflag '                                                   making surfaces
  128. DIM SHARED mstar '                                                    make stars
  129. DIM SHARED nation '                                                   1 US, 2 USSR (flags & fireworks)
  130. DIM SHARED ok '                                                       at landing, to plant flag
  131. DIM SHARED okrick '                                                   diagnostics
  132. DIM SHARED osc '                                                      on screen count
  133. DIM SHARED oscar '                                                    semaphore land/sea flags
  134. DIM SHARED panelinit '                                                replot flag
  135. DIM SHARED paraf '                                                    parachute flag
  136. DIM SHARED pload '                                                    panel load flag
  137. DIM SHARED porb '                                                     pointers/bargraphs
  138. DIM SHARED ptk '                                                      points to kill (gasoline) ExplodeLM
  139. DIM SHARED px!, py! '                                                 vehicle position on screen
  140. DIM SHARED ra '                                                       random angle
  141. DIM SHARED radarf '                                                   radar on/off
  142. DIM SHARED rads '                                                     Luna radiation
  143. DIM SHARED radiationdeath '                                           flag
  144. DIM SHARED regen '                                                    all star files
  145. DIM SHARED rfx, rfy '                                                 craft jigger
  146. DIM SHARED rick '                                                     debug flag
  147. DIM SHARED rmin, dmin '                                               stars
  148. DIM SHARED settings$ '                                                lander.set
  149. DIM SHARED sf '                                                       surface feature
  150. DIM SHARED shield '                                                   flag
  151. DIM SHARED shoot '                                                    flag
  152. DIM SHARED showmap '                                                  locations of things shown at top
  153. DIM SHARED sia '                                                      shells in air
  154. DIM SHARED skyoff '                                                   for faster performance
  155. DIM SHARED ufof '                                                     for ufo
  156. DIM SHARED sspinit1, sspinit2 '                                       Surveyor
  157. DIM SHARED starfiles '                                                use stars1,2 or 3 (few/med/lots)
  158. DIM SHARED starinit '                                                 flag
  159. DIM SHARED starstatus '                                               0 off, 1 on, 234 more info
  160. DIM SHARED suri '                                                     surface index
  161. DIM SHARED sx0, sy0 '                                                 LM radar/laser location
  162. DIM SHARED sx1, sy1 '                                                 LM left landing pad
  163. DIM SHARED sx2, sy2 '                                                 LM right landing pad
  164. DIM SHARED temp '                                                     temperature
  165. DIM SHARED thrust! '                                                  0 - 100
  166. DIM SHARED tilef '                                                    tile variation
  167. DIM SHARED vx!, vy! '                                                 LM velocity
  168. DIM SHARED warp! '                                                    vx! >= 100
  169. DIM SHARED wi, wi2 '                                                  width (distance between pads)
  170. DIM SHARED wx!, wy! '                                                 vehicle position on screen
  171. DIM SHARED x '                                                        = suri + px!
  172. DIM SHARED xoff '                                                     offset for v=5-20, Surv & Etna
  173. DIM SHARED zoom '                                                     starfield
  174.  
  175. DIM SHARED blue, green, gunmetal, red, gasoline, gray2, white, gray
  176. DIM SHARED dred, gold, black2, orange, blue2, yellow, white2
  177.  
  178. DIM SHARED q1, q2, q3, q4, h, t, th, tsix, aspect!, pf! '             constants
  179.  
  180. q1 = 6400: q2 = 860: q3 = 639: q4 = 349: h = 100: th = 200: t = 10: tsix = 360
  181. pf! = .5: aspect! = 1.4: grav! = 1.6
  182.  
  183. qt = 2000 '                                                           3 arrays below weren't loading properly with q2
  184. DIM SHARED LMx(qt), LMy(qt), LMc(qt) '                                LM+exhaust x,y,color
  185.  
  186. DIM SHARED LMrx(1400), LMry(1400) '                                   LM+exhaust x,y after rotation
  187. DIM SHARED LMoc(705), LMci(3) '                                       LM colors,original colors, index
  188. DIM SHARED c!(360), s!(360) '                                         sines and cosines
  189. DIM SHARED ex(6), ey(6), exv(6), eyv(6), ei(6), ek(6), exl(6) '       sky objects
  190. DIM SHARED f$(40) '                                                   support files
  191. DIM SHARED mes$(1), omes$(1), sm!(1) '                                messages at screen top
  192. DIM SHARED sf(10, 2), sf$(10) '                                       surface features start/end/middle
  193. DIM SHARED shx(20), shy(20), sha(20) '                                shells (IBM weapons) x,y,angle
  194. DIM SHARED shvx(20), shvy(20), shd(20) '                              velocity, distance
  195. DIM SHARED rtl!(2), rtlc(2) '                                         radiation/temperature/lightning
  196. DIM SHARED gh(6400) '                                                 ground height
  197. 'DIM SHARED gc(6400) '                                                ground color
  198.  
  199. DIM clocka(2) '                                                       clock angles
  200. DIM cmp&(30) '                                                        CM patterns
  201. DIM convo$(50) '                                                      LM/CM
  202. DIM SHARED gbuff(800) '                                               DS liftoff
  203. DIM skyset1(t), skyset2(t) '                                          skycrud
  204. DIM SHARED p(127, 13), p2(127, 7) '                                   vga and cga fonts
  205.  
  206. begin:
  207. GOSUB init1
  208.     GOSUB init2
  209.     WHILE LEN(INKEY$): WEND '                                         clear keyboard buffer
  210.     DO: _LIMIT mdelay
  211.         GOSUB Autopilot
  212.         GOSUB Plotscreen
  213.         GOSUB KeyAndMouse
  214.         IF restart THEN GOTO begin '                                  restore defaults
  215.         IF warp! < 1 THEN GOSUB CheckHit
  216.     LOOP UNTIL contact OR LEN(dead$)
  217.     GOSUB CheckDead
  218.     IF contact THEN
  219.         Evaluate savea, a + ma '                                      landing feedback contact/currentø
  220.         wu2! = TIMER + 1
  221.         GOSUB pause '                                                 landed, Enter for liftoff
  222.         IF restart THEN GOTO begin '                                  restore defaults
  223.         IF k <> 60 THEN GOSUB CheckDead '                             F2 demo restart
  224.     END IF
  225.  
  226. CheckDead:
  227. z$ = LEFT$(LEFT$(dead$, 1) + " ", 1)
  228. IF INSTR(" CBE", z$) = 0 THEN '                                       not Crashed, Borg, Eaten by BH
  229.     ExplodeLM
  230.     contact = 0
  231. dead$ = ""
  232.  
  233. Autopilot:
  234. aboveborg = 0
  235. IF (ek(2) = -1) OR (ek(2) > h) THEN borgt = 0
  236. IF (skyoff = 0) AND (sy1 < borgt) AND (px! > borgl) AND (px! < borgr) THEN aboveborg = 1
  237. super = 0
  238. IF vert OR hover THEN
  239.     GOSUB GetAlt
  240.     i! = alt! / 8 + pf! '                                             thrust target
  241.     IF jitter AND (alt! < t) THEN i! = i! * 2 '                       optional, faster
  242.     IF aboveborg THEN i! = 1
  243.     GOSUB idealthrust
  244.     thrust! = sbest!
  245.     super = -(sbest! > h) '                                           add side thusters
  246.     'IF warp! >= 1 THEN super = 0
  247.     IF thrust! > h THEN thrust! = h
  248. IF thrust! < 0 THEN thrust! = 0
  249.  
  250. CutOrOutOfFuel:
  251. IF fuel! = 0 THEN shield = 0 '                                        shields need fuel
  252. IF cut = 0 THEN
  253.     cut = 1
  254.     cvy! = vy!
  255.     ctime! = TIMER
  256.     tfollow = 0 '                                                     terrain following
  257.     thrust! = 0
  258.  
  259. idealthrust: '                                                        for hover or descend
  260. IF (alt! < pf!) AND (jitter = 0) THEN i! = .05 '                      soft landing
  261. IF hover THEN i! = hoverc '                                           target
  262. hoverc = hoverc - SGN(hoverc) '                                       up/down
  263. fmin! = q1 '                                                          conventient large number (6400)
  264. ma! = (vmass + fuel!) / th '                                          mass (actually 54% fuel)
  265. ts! = s!((a + 270) MOD tsix) / ma! / power
  266. IF jitter THEN us! = RND * t + 1 ELSE us! = .1
  267. IF powerloss THEN us! = h
  268. FOR z! = 0 TO (h + t) STEP us! '                                      find best thrust 0-110
  269.     fo! = z! * ts!
  270.     aa! = ABS(vy! + grav! + fo! - i!)
  271.     IF aa! < fmin! THEN fmin! = aa!: sbest! = z!
  272.     IF aa! > fmin! THEN EXIT FOR
  273. NEXT z!
  274.  
  275. GoSkyObject:
  276. IF (ek(p) <> -1) AND (contact = 0) THEN
  277.     auto = 0
  278.     a = -ma
  279.     wa = -ma
  280.     lock1 = 0
  281.     suri = ex(p) - center
  282.     GOSUB slimit
  283.     IF p > 2 THEN ey(p) = th '                                        BH, worm, comet, alien
  284.     px! = center
  285.     IF p = 2 THEN py! = 130 '                                         above Borg
  286.     vx! = exv(p)
  287.     eyv(p) = 0
  288.  
  289. KeyAndMouse:
  290.     lb = ABS(_MOUSEBUTTON(1))
  291.     rb = ABS(_MOUSEBUTTON(2))
  292.     IF mouseswap THEN SWAP lb, rb '                                   whatever floats your boat
  293.     IF TIMER < ignoreuntil! THEN lb = 0: rb = 0 '                     2 lines for debouncing
  294.     IF lb OR rb THEN ignoreuntil! = TIMER + .25
  295.     ww = wa '                                                         stash current wanted angle
  296.     wa = wa + lb - rb '                                               want angle
  297.     IF wa <> ww THEN '                                                if changed
  298.         IF inpause THEN i$ = CHR$(13): GOTO gotit '                   either button to cause liftoff
  299.         apd = 1 '                                                     autopilot disconnect warning
  300.         auto = 0 '                                                    autopilot
  301.         GOTO endk '                                                   don't bother checking keys
  302.     END IF
  303.     mw = mw + _MOUSEWHEEL
  304. IF mw <> 0 THEN '                                                     wheel moved
  305.     thrust! = INT(thrust!) - mw
  306.     IF thrust! < 0 THEN thrust! = 0
  307.     IF thrust! > h THEN thrust! = h
  308.     apd = 1 '                                                         autopilot disconnect warning
  309.     auto = 0 '                                                        autopilot
  310.     hover = 0 '                                                       hover off
  311.     vert = 0 '                                                        vertical control off
  312.     mw = 0 '                                                          zap
  313.     GOTO endk '                                                       don't bother checking keys
  314.  
  315. DEF SEG = 0
  316. status = PEEK(&H417) '                                                7ins 6caps 5num 4scrl 3alt 2ctrl 1ls 0rs
  317. IF ((status AND 1) > 0) AND ((status AND 2) > 0) THEN vx! = 901 '     both shift
  318. IF status AND 8 THEN start1! = TIMER: mpass& = 0 '                    alt, reset speed timer
  319.  
  320. IF status AND 4 THEN '                                                ctrl
  321.     i$ = RIGHT$(" " + INKEY$, 1)
  322.     kk = ASC(i$)
  323.     IF (kk = 3) OR (kk = 19) THEN '                                   c or s
  324.         nfile:
  325.         image = image + 1
  326.         f$ = "CAP" + RIGHT$("0000" + LTRIM$(STR$(image)), 3) + ".BMP"
  327.         IF _FILEEXISTS(f$) THEN GOTO nfile
  328.         SaveImage f$
  329.         IF _FILEEXISTS(f$) THEN mes$(1) = "Screen captured to " + f$
  330.         GOTO endk
  331.     END IF
  332.  
  333. i$ = INKEY$ '                                                         consult human
  334. li = LEN(i$)
  335. IF li = 0 THEN RETURN
  336.  
  337. IF i$ = "|" THEN MakeStarFiles '                                      takes hours!
  338.  
  339. k = ASC(RIGHT$(i$, 1))
  340. IF k = 27 THEN Quit
  341. IF inpause AND (k = 32) THEN
  342.     k = 13 '                                                          transform spacebar to Enter
  343.     i$ = RIGHT$(CHR$(0) + CHR$(k), li) '                              gentlemen, we can rebuild him
  344.  
  345. gotit:
  346. IF (i$ = "\") AND (shx(0) = 0) AND (contact = 0) THEN '               LM drops bomb
  347.     IF (cwd < 50) AND (sy1 > 300) THEN dead$ = "Smooth move, Exlax!" 'kill self in car wash
  348.     sia = sia + 1 '                                                   shells in air
  349.     shvx(0) = vx! + 3 + RND * t
  350.     shvy(0) = 0
  351.     shx(0) = suri + sx0
  352.     shy(0) = sy0
  353.     shd(0) = 1
  354.  
  355. IF i$ = "[" THEN bw = bw XOR 1: Setcolor '                            crude method for b&w
  356. IF i$ = "]" THEN
  357.     ufof = ufof XOR 1
  358.     mes$(0) = "UFO " + OnOff$(ufof)
  359.     IF ufof THEN
  360.         GOSUB SkyStuff
  361.         p = 6: GOSUB GoSkyObject
  362.     END IF
  363.  
  364. IF i$ = "=" THEN GOSUB lmshow '                                       show LM data - pointless but amusing
  365. IF i$ = "'" THEN pdiv = (pdiv + 1) MOD 4 '                            Henon speed, also slows down thrust display
  366. IF radiationdeath THEN i$ = "": RETURN '                              you're dead and cannot pass this point
  367.  
  368. IF i$ = "`" THEN '                                                    Deathstar size - thought a smaller one wouuld be faster - it is - not by much
  369.     dsinit = 0
  370.     dstype = 2 + (MID$(f$(37), 6, 1) = "m")
  371.     MID$(f$(37), 6, 1) = MID$("sm", dstype, 1)
  372. IF i$ = "~" THEN darkstarc = darkstarc XOR 1 '                        color
  373. IF i$ = "@" THEN darkstart = darkstart XOR 1 '                        thickness
  374.  
  375. IF inpause THEN '                                                     hit "p" or landed
  376.     IF i$ = "b" THEN '                                                Big Dipper
  377.         rmin = 9 '                                                    right ascension
  378.         dmin = 30 '                                                   declination
  379.         starinit = 0
  380.         RETURN
  381.     END IF
  382.     IF li = 2 THEN '                                                  arrow keys move stars
  383.         rdol = rmin + dmin '                                          detect change
  384.         rmin = rmin + (k = 75) - (k = 77) '                           left right
  385.         rmin = (rmin + 24) MOD 24 '                                   RA limit 0 - 24
  386.         dmin = dmin - (k = 80) * t + (k = 72) * t '                   declination up down
  387.         IF dmin = h THEN dmin = -80 '                                 limit -90 - 90
  388.         IF dmin = -h THEN dmin = 80
  389.         IF (rmin + dmin) <> rdol THEN starinit = 0 '                  changed, replot stars
  390.     END IF
  391. IF li = 2 THEN GOTO is2 '                                             extended key
  392.  
  393. IF i$ = "_" THEN '                                                    star twinkle
  394.     twinkle = twinkle XOR 1
  395.     mes$(0) = "STAR TWINKLE " + OnOff$(twinkle)
  396. IF i$ = ";" THEN fpl = 1 '                                            force power loss
  397. IF k = 9 THEN ex(1) = (suri + px!) - SGN(exv(1)) * h '                TAB summon DS
  398. p = INSTR(")!@#$%^&*(", i$)
  399. IF p AND (contact = 0) THEN GetSurface p - 1 '                        shifted-number for 1 of 10 surfaces
  400. p = INSTR("01234", i$) '                                              stars off/on/info
  401. IF p THEN starstatus = p - 1
  402. IF k = 8 THEN '                                                       backspace, random star position
  403.     rmin = INT(RND * 24) '                                            random RA
  404.     dmin = (INT(RND * 18) - 9) * t '                                  random dec
  405.     starinit = 0
  406. IF i$ = "." THEN
  407.     tfollow = tfollow XOR 1
  408.     auto = 0
  409.     vert = 1
  410.     mes$(0) = "TERRAIN FOLLOWING " + OnOff$(tfollow)
  411. p = (i$ = "<") - (i$ = ">") '                                         jump left/right
  412. IF (contact = 0) AND (p <> 0) THEN
  413.     suri = suri + 40 * p '                                            surface index
  414.     GOSUB slimit '                                                    limit suri
  415.     IF lock1 THEN hover = 1: lock1 = 0
  416. IF (i$ = "+") AND (zoom < 2) THEN zoom = zoom + 1: starinit = 0
  417. IF (i$ = "-") AND (zoom > 0) THEN zoom = zoom - 1: starinit = 0
  418. IF i$ = "?" THEN rick = rick XOR 1 '                                  show speed of processing graph
  419. IF okrick AND (i$ = "U") THEN tilef = (tilef + 1) MOD 3 '             alternate tilings
  420. IF i$ = "/" THEN
  421.     cpal = (cpal + 1) MOD 3 '                                         cycle green/black & white/normal monitor
  422.     mes$(0) = "": mes$(1) = ""
  423.     IF cpal = 1 THEN mes$(0) = "GT40 mode"
  424.     IF cpal = 2 THEN mes$(1) = "Do not adjust your set.  We control the horizontal and the vertical!"
  425. IF k = 32 THEN '                                                      cycle thru features
  426.     IF lock1 > 0 THEN '                                               on auto, landing zone selected, abort landing
  427.         abort = 1
  428.         mes$(0) = "ABORT!"
  429.         IF vx! = 0 THEN vx! = .01
  430.         RETURN
  431.     END IF
  432.     IF convo THEN '                                                   or speed up rendesvous
  433.         sct! = .2
  434.         sc! = TIMER
  435.         RETURN
  436.     END IF
  437.  
  438.     IF skyoff THEN tmod = t ELSE tmod = 16
  439.     jf = (jf + 1) MOD tmod
  440.     '          01234567890123456
  441.     i$ = MID$("mtsiHg5wleObBWoR", jf + 1, 1) '                        cycle thru ground and sky features
  442.     k = ASC(i$)
  443.     IF demo AND (jf = 7) THEN i$ = "e" '                              skip LGM in demo, because it's on the grave
  444.  
  445. p = INSTR("RObBWo", i$) '                                             jump to CM, deathstar, etc.
  446. IF p AND (skyoff = 0) THEN p = p - 1: GOSUB GoSkyObject
  447.  
  448. IF i$ = "A" THEN
  449.     lam = lam XOR 1 '                                                 land at McDonalds
  450.     IF lam AND (auto = 0) THEN i$ = "a" '                             turn on autopilot
  451. IF i$ = "a" THEN '                                                    autopilot
  452.     abort = 0 '                                                       in case it was on
  453.     tfollow = 0
  454.     auto = auto XOR 1 '                                               toggle
  455.     IF auto AND (radarf = 0) THEN radarf = 2
  456.     IF auto = 0 THEN hover = 1 '                                      be nice, help user
  457.     pt! = TIMER '                                                     restart countdown
  458. IF i$ = "c" THEN GOSUB CutOrOutOfFuel
  459. IF i$ = "C" THEN doclock = doclock XOR 1
  460. IF i$ = "d" THEN dump = dump XOR 1 '                                  fuel
  461. IF i$ = "D" THEN restart = 1 '                                        restart with defaults
  462. IF (i$ = "E") AND (starstatus > 0) THEN '                             end of universe
  463.     IF eou = 0 THEN eou = -1 ELSE eou = eou + 1 '                     restart or speedup
  464. IF i$ = "F" THEN
  465.     fuel! = h
  466.     lockfuel = 1
  467. IF i$ = "f" THEN lockfuel = lockfuel XOR 1 '                          THIS cheat the GT40 had, using toggle switches!
  468. IF i$ = "G" THEN gstyle = (gstyle + 1) MOD 6 '                        ground style
  469. IF i$ = "h" THEN hover = hover XOR 1: apd = 1 '                       apd=autopilot disconnect warning
  470. IF i$ = "I" THEN
  471.     invincible = ABS(invincible) XOR 1
  472.     mes$(0) = "INVINCIBLE MODE " + OnOff$(invincible)
  473.     GOSUB ReadLM '                                                    to change thrusters
  474. IF i$ = "j" THEN
  475.     darkstars = (darkstars + 1) MOD 5
  476.     mes$(0) = "Deathstar rotation" + STR$(darkstars)
  477. IF i$ = "k" THEN '                                                    kill threats or, if none, shoot at ground feature
  478.     firel = 1 '                                                       fire laser
  479.     FOR z = 1 TO 20 '                                                 IBM shells
  480.         shd(z) = 1
  481.     NEXT z
  482. IF i$ = "L" THEN GetSurface -1 '                                      level ground
  483. IF (i$ = "M") AND ((contact + inpause) = 0) THEN '                    laser level & land
  484.     magic = magic + 1
  485. IF (i$ = "n") AND inpause THEN nation = ((nation - 1) XOR 1) + 1 '    flag 1 US, 2 USSR
  486. IF i$ = "p" THEN GOSUB pause '                                        pause LM movement
  487. IF (i$ = "P") AND (contact = 0) AND (warp! < 1) AND (paraf = 0) THEN
  488.     paraf = 1 '                                                       parachute!
  489.     chs = 0
  490.     a = 0
  491.     GOSUB CutOrOutOfFuel
  492. IF i$ = "q" THEN Quit
  493. IF i$ = "Q" THEN
  494.     oscar = oscar XOR 1 '                                            land or sea flags for LGM
  495.     IF oscar THEN z$ = "SEA" ELSE z$ = "LAND"
  496.     mes$(0) = "LGM flags: " + z$
  497. IF i$ = "r" THEN
  498.     IF cut THEN '                                                     restart engine
  499.         cut = 0
  500.         hover = 1
  501.         power = opower
  502.         powerloss = 0
  503.     ELSE
  504.         IF auto = 0 THEN
  505.             radarf = (radarf + 1) MOD 3
  506.             mes$(0) = "Radar " + MID$("OFFON FAT", radarf * 3 + 1, 3)
  507.         END IF
  508.     END IF
  509. IF i$ = "S" THEN MakeSur: restart = 1 '                               generate new surfaces
  510. IF i$ = "T" THEN jitter = jitter XOR 1 '                              thrust computation
  511. IF i$ = "u" THEN '                                                    instrument panel on/off
  512.     zz = gs
  513.     gs = (SGN(gs) XOR 1) * 85 '                                       graphics start
  514.  
  515.     panelinit = 0
  516.     pif = -1
  517.  
  518.     z = (gs + 30) - px!
  519.     IF (gs > 0) AND (z > 0) THEN
  520.         px! = px! + z
  521.         suri = suri - z
  522.         GOSUB slimit
  523.     END IF
  524. IF i$ = "v" THEN '                                                    vertical automatic
  525.     IF tfollow THEN
  526.         tfollow = 0
  527.         mes$(0) = "TERRAIN FOLLOWING OFF"
  528.     END IF
  529.     vert = vert XOR 1
  530.     apd = 1 '                                                         autopilot disconnect warning
  531. IF i$ = "x" THEN starinit = 0: starfiles = (starfiles + 1) MOD 3 '    star density
  532. IF i$ = "X" THEN starinit = 0: regen = 1: Stars '                     regenerate single star file
  533. IF i$ = "y" THEN
  534.     mouseswap = mouseswap XOR 1
  535.     IF mouseswap THEN z$ = "reversed" ELSE z$ = "normal"
  536.     mes$(0) = "Mouse buttons " + z$
  537. IF i$ = "Y" THEN min = 3: sec = 45 '                                  black hole at 3:50
  538. IF (i$ = "z") AND (crash = 0) THEN
  539.     mes$(0) = "" '
  540.     mes$(1) = "" '                                                    erase radiation messages
  541.     dead$ = "SELF-DESTRUCT"
  542.  
  543. IF i$ = "}" THEN
  544.     GOSUB CutOrOutOfFuel
  545.     sgs = gs: gs = 0
  546.     srf = radarf: radarf = 0
  547.     GOSUB Plotscreen
  548.     dissolve
  549.     dead$ = " "
  550.     gs = sgs: radarf = srf
  551.  
  552. '          1234567890
  553. p = INSTR("5wlemtsiHg", i$) '                                         jump to feature
  554. IF p AND (contact = 0) THEN
  555.     sf = p
  556.     IF demo AND sf = 9 THEN sf = t
  557.     IF (sf(sf, 1) >= suri) AND (sf(sf, 0) < (suri + q3)) THEN '       already in vicinity of IBM
  558.         IF sf = 8 THEN shoot = 1 '                                    tell IBM to fire
  559.         IF demo THEN '                                                IBM at special location in demo mode, deal with it
  560.             px! = sf(sf, 2) - 3130
  561.             suri = 3130
  562.         END IF
  563.     ELSE
  564.         px! = center '                                                move ship to screen center
  565.         suri = sf(sf, 0) - center - 30 - (sf = 9) * h '               move ground to IBM
  566.     END IF
  567.     a = -ma '                                                         angle = -malfunction angle
  568.     abort = 0
  569.     wa = -ma '                                                        want angle
  570.     lock1 = 0 '                                                       radar lock
  571.     tmt! = 0 '                                                        to move total
  572.     vx! = 0 '                                                         not moving
  573.     warp! = 0 '                                                       cancel warp
  574. GOTO endk '                                                           done with ordinary keys
  575.  
  576. is2: '                                                                extended key
  577. z = mdelay '                                                          master delay
  578. mdelay = mdelay - (k = 73) + (k = 81) '                               PgUp/PgDn
  579. IF mdelay < 1 THEN mdelay = 1
  580. IF mdelay <> z THEN '                                                 changed
  581.     mes$(0) = "_LIMIT " + OnOff$(SGN(mdelay))
  582.     IF mdelay THEN mes$(0) = mes$(0) + LTRIM$(STR$(mdelay))
  583. IF status AND 3 THEN '                                                left or right shift
  584.     IF k = 72 THEN k = 201 '                                          LM up
  585.     IF k = 75 THEN k = 203 '                                          LM left
  586.     IF k = 77 THEN k = 204 '                                          LM right
  587. IF (inpause = 0) AND ((k = 72) OR (k = 80)) THEN '                    up and down arrow
  588.     apd = 1 '                                                         autopilot disconnect
  589.     hover = 0
  590.     vert = 0
  591.     thrust! = thrust! + (k = 80) - (k = 72) '                         true = -1
  592. thrust! = INT(thrust! * t) / t '                                      t = 10
  593. IF (hover = 0) AND (vert = 0) THEN thrust! = INT(thrust!)
  594. IF thrust! > h THEN thrust! = h
  595. IF (dump = 0) AND (fuel! > 0) AND (contact = 0) THEN '                side thrust/angle
  596.     IF inpause = 0 THEN wa = a - (k = 75) + (k = 77) '                                    left/right arrows
  597.     IF ABS(wa) > 99 THEN wa = 99 * SGN(wa) '                          want angle, limit 99
  598.     IF a <> wa THEN apd = 1 '                                         autopilot disconnect
  599. IF k = 59 THEN '                                                      F1 help
  600.     mHelp
  601.     start1! = TIMER: mpass& = 0 '                                     reset speed timer
  602. IF k = 60 THEN '                                                      F2 demo
  603.     demo = demo XOR 1
  604.     GOSUB init2
  605.     cbh = demo '                                                      constant black holes
  606. IF k = 61 THEN '                                                      F3, sky feature toggle
  607.     skyoff = skyoff XOR 1
  608.     IF skyoff = 0 THEN convo = 0
  609.     mes$(0) = "SKY OBJECTS " + OnOff$(1 - skyoff)
  610. IF k = 62 THEN '                                                      F4 endless bh
  611.     cbh = cbh XOR 1
  612.     exv(3) = 0
  613.     mes$(0) = "CONSTANT BLACK HOLES " + OnOff$(cbh)
  614. IF k = 63 THEN '                                                      F5 instrument background
  615.     f5toggle = f5toggle XOR 1
  616.     IF f5toggle = 0 THEN background = background XOR 1
  617.     IF f5toggle = 1 THEN porb = porb XOR 1
  618.     pload = 0
  619. IF (k = 64) AND ((ASO + inpause) = 0) THEN '                          F6 seperate AS/DS
  620.     GOSUB liftoff
  621.     RETURN
  622. IF k = 65 THEN showmap = showmap XOR 1 '                              F7 map
  623. IF k = 66 THEN '                                                      F8 shields
  624.     shield = shield XOR 1
  625.     geof = shield * t
  626. IF k = 67 THEN '                                                      F9 LED color
  627.     z$ = RIGHT$("0" + LTRIM$(STR$(LEDc)), 2)
  628.     z = INSTR(LED$, z$): IF z = 11 THEN z = -1
  629.     LEDc = VAL(MID$(LED$, z + 2, 2))
  630.     LEDtri = 0
  631. IF k = 68 THEN '                                                      F10 LED tri-color
  632.     LEDtri = LEDtri XOR 1
  633.     IF LEDtri THEN LEDc = green
  634. IF k = 71 THEN rmin = 0: dmin = 0: starinit = 0 '                     Home, star RA/dec to 0
  635.  
  636. endk:
  637. IF k = 201 THEN hoverc = hoverc - t '                                 move up
  638. IF k = 203 AND (left = 0) THEN left = 16 '                            move left
  639. IF k = 204 AND (right = 0) THEN right = 16 '                          move right
  640. IF apd OR (k = 201) OR (k = 203) OR (k = 204) THEN '                  blink AUTO
  641.     IF auto THEN APdisengage = 20 '                                   blink 20 times
  642.     auto = 0 '                                                        turn it off
  643.     apd = 0 '                                                         reset flag
  644.  
  645. pause:
  646. IF inpause THEN RETURN '                                              already doing this....
  647. dead$ = ""
  648. inpause = 1
  649. pt! = TIMER '                                                         for demo mode
  650. wu! = pt! + 1 '                                                       delay before planting flag
  651. DO: _LIMIT mdelay
  652.     GOSUB KeyAndMouse
  653.     IF k = 60 THEN RETURN '                                           F2 demo
  654.     IF (i$ > "") AND (INSTR("zD", i$)) THEN RETURN '                  self-destruct or restart
  655.     GOSUB Plotscreen
  656.     IF LEN(dead$) THEN RETURN
  657.     IF auto AND contact THEN '                                        countdown to blast off
  658.         IF TIMER < pt! THEN pt! = TIMER '                             midnite crossing fix
  659.         z! = TIMER - pt!
  660.         z = t - z!
  661.         IF z < 0 THEN z = 0
  662.         TextOnLM$ = LTRIM$(STR$(z))
  663.         IF z! > t THEN i$ = CHR$(13) '                                like pressing the key
  664.     END IF
  665.     GOSUB CalcFuel
  666. LOOP UNTIL (i$ = CHR$(13)) OR (i$ = "p")
  667. ctime! = TIMER
  668. fb$ = "" '                                                            feedback
  669. inpause = 0
  670. c = (contact = 1) AND (crash = 0) AND (liftoff = 0) AND (ABS(a) < 31)
  671. IF c THEN GOSUB liftoff
  672.  
  673. CalculateMotion:
  674. i = 0
  675. IF (power = opower) AND (RND < .0003) THEN
  676.     i = ((auto + contact + liftoff + vert) = 0) AND ((min * 60 + sec) > t)
  677. IF fpl OR i THEN '                                                    force power loss
  678.     fpl = 0
  679.     powerloss = t + RND * t + ASO * 30 '                              10 TO 20%, 50% ASO
  680.     power = opower + powerloss / h * opower
  681.     mes$(0) = LTRIM$(STR$(powerloss)) + "% POWER LOSS - DUMP FUEL!"
  682.  
  683. IF lob THEN px! = px! + exv(2) '                                      landed on Borg
  684. IF contact OR inpause THEN GOTO other
  685.  
  686. ta = ((a + ma) + 270) MOD tsix '                                       temp angle = a+malfunction angle
  687. ma! = (vmass + fuel!) / th '                                          actually 54% fuel
  688. fo! = ((thrust! + super * 5) / ma!) / power '                         f = ma
  689. IF fuel! = 0 THEN fo! = 0 '                                           nix any force if running on empty
  690. fx! = fo! * c!(ta) / 2
  691. IF dump AND (ABS(a) < 5) THEN fx! = 0
  692. fy! = fo! * s!(ta) + grav! '                                          thrust + gravity
  693. IF warp! > 0 THEN fx! = fx! * (warp! * 2 + 1) '                       get thru warp msgs faster
  694. vx! = vx! - fx!
  695. IF a <> 0 THEN vx! = vx! + (RND - pf!) / h '                          help get to integer vx
  696. IF ABS(vx!) < .01 THEN vx! = 0
  697. avx = ABS(vx!)
  698. IF (avx > 5) AND (avx < 20) THEN xoff = vx! ELSE xoff = 0
  699. IF cut AND (magic = 0) THEN
  700.     cel! = TIMER - ctime! '                                           time since cut
  701.     vy! = cvy! + grav! * (cel! * cel!) '                              v = at^2  velocity = acceleration times time squared
  702.     fy! = 0 '                                                         null y force since it's a different situation
  703. vy! = vy! + fy!
  704. IF warp! >= 1 THEN vy! = 0
  705.  
  706. px! = px! + vx! - lob * exv(2)
  707. py! = py! + vy!
  708.  
  709. IF (liftoff = 0) AND (py! < 55) THEN '                                stop going off screen top
  710.     IF convo = 0 THEN mes$(0) = "Too high - reduce thrust!"
  711.     py! = 55
  712.     vy! = 0
  713.  
  714. other:
  715. GOSUB CalcFuel
  716. IF liftoff AND (lob = 0) THEN RETURN
  717. nomove = demo AND (((suri \ q3) + 1) = 5)
  718.  
  719. zz = px! - center
  720. z! = ABS(vx!)
  721.  
  722. IF (nomove = 0) AND ((rlink > 0) OR (z! < 3) OR (z! > 20)) THEN
  723.     dx! = px! - center
  724.     px! = center
  725.     tmt! = tmt! + dx!
  726.     zq = 0 '                                                          was 30 woof woof
  727.     c1 = (px! <= (gs + zq))
  728.     c2 = (px! >= (q3 - zq))
  729.     IF c1 OR c2 THEN
  730.         IF c1 THEN z = q3 - zq ELSE z = gs + zq
  731.         z = z - px!
  732.         tmt! = tmt! - z
  733.         px! = px! + z
  734.     ELSEIF (zz <> 0) AND (ABS(vx!) <= 5) AND (nomove = 0) THEN
  735.         z = zz \ 2 + 1
  736.         tmt! = tmt! + z
  737.         px! = px! - z
  738.     END IF
  739. IF ABS(tmt!) >= q3 THEN tmt! = SGN(tmt!) * q3 - 1
  740.  
  741. IF left THEN '                                                        jog left (shift left arrow)
  742.     IF left = 16 THEN sv! = vx!
  743.     IF left > 8 THEN a = 4 ELSE a = -4
  744.     left = left - 1
  745.     IF left = 0 THEN a = 0: vx! = sv!
  746. IF right THEN '                                                       jog right (shift right arrow)
  747.     IF right = 16 THEN sv! = vx!
  748.     IF right > 8 THEN a = -4 ELSE a = 4
  749.     right = right - 1
  750.     IF right = 0 THEN a = 0: vx! = sv!
  751.  
  752. CalcFuel:
  753. IF cut THEN thrust! = 0
  754. IF lockfuel = 0 THEN
  755.     ta = ABS(a): IF ta > 5 THEN ta = 5 '                              main angle, up to 5
  756.     z! = (ta + super + ABS(fst)) * t '                                plus 10% for thrusters
  757.     used! = (thrust! + z!) / 8000
  758.     IF ASO THEN used! = used! * 2 '                                   burn faster for AS
  759.     IF inpause THEN used! = 0
  760.     IF shield THEN used! = used! + .001
  761.     fuel! = fuel! - used! * 4
  762.     IF fuel! <= 0 THEN fuel! = 0: GOSUB CutOrOutOfFuel
  763.  
  764. Plotscreen:
  765. IF bit! = 0 THEN bit! = TIMER + pf!
  766. IF TIMER > bit! THEN
  767.     bbit = bbit XOR 1 '                                               toggles twice per second, used all over - instruments, IBM hazard lights, clock colon, LGM ear wiggle
  768.     bit! = 0
  769.  
  770. bolthit = 0
  771. bolthitf = 0
  772. IF (crash = 0) AND (ABS(vx!) >= h) THEN warp! = ABS(vx!) / h ELSE warp! = 0
  773. IF warp! >= 1 THEN paraf = 0 '                                        reckon parachute can be dropped at warp speeds
  774.  
  775. ' change styles every 10/30 seconds
  776. IF style! = 0 THEN style! = TIMER + t
  777. IF style! > 86400 THEN style! = 1 '                                   midnite xing
  778. IF TIMER > style! THEN
  779.     bstyle1 = (bstyle1 + 1) MOD 3 '                                   Borg guts every 10s
  780.     IF bstyle1 = 0 THEN bstyle2 = bstyle2 XOR 1 '                     Borg exhaust
  781.     style! = 0
  782.  
  783. IF (starstatus > 0) AND (eou = 0) AND (vert = 0) AND (RND > .9999) THEN '  stars on+not already falling+WHY?+rarely
  784.     mes$(0) = "THE SKY IS FALLING!  THE SKY IS FALLING!"
  785.     eou = 1
  786. GOSUB CalculateMotion
  787.  
  788. IF gs THEN '                                                          graphics start not 0, instruments are visible
  789.     VIEW
  790.     pif = (pif + 1) MOD (pdiv + 1)
  791.     IF pif THEN timemachine ELSE GOSUB Instruments '                  INSTRUMENTS
  792. IF starstatus THEN
  793.     VIEW SCREEN(gs, SGN(LEN(mes$(0))) * 20)-(q3, q4)
  794.     Stars '                                                           STARS
  795.     VIEW SCREEN(gs, 0)-(q3, q4)
  796.     VIEW SCREEN(gs, 0)-(q3, q4)
  797.     CLS
  798.  
  799. IF LEN(mes$(0)) THEN
  800.     VIEW SCREEN(gs, 0)-(q3, 20)
  801.     CLS
  802.     VIEW SCREEN(gs, 0)-(q3, q4)
  803.  
  804. Info '                                                                INFO show timed messages at top, if any
  805. 'VIEW SCREEN(gs, 0)-(q3, q4)
  806. IF warp! < 1 THEN '                                                   no sky features except star streaks at warp speeds
  807.     IF skyoff = 0 THEN GOSUB SkyStuff '                               CM/DS/Bo/BH/Wo/Co
  808.     GOSUB PlotGround '                                                GROUND/FEATURES
  809.     Shells '                                                          SHELLS
  810.     IF (invincible = 0) AND (shield = 0) AND (skyoff = 0) THEN GOSUB FiveWaysToDie
  811. IF platform THEN PUT (pminx, pminy), gbuff(), OR '                    falling descent stage
  812. IF LEN(dead$) = 0 THEN GOSUB PlotVehicle '                            VEHICLE
  813. IF (warp! < 1) AND showmap AND (crash = 0) THEN
  814.     VIEW
  815.     Map '                                                             LM, ground & sky features
  816.     VIEW SCREEN(gs, 0)-(q3, q4)
  817. IF bolthit THEN '                                                     lightning zap from Deathstar
  818.     boltc = boltc + 1 + (boltc = 9999)
  819.     rtl!(2) = TIMER + 5
  820.     rtlc(2) = boltc
  821.     IF ((invincible + shield) = 0) AND (boltc >= t) THEN dead$ = "Zapped!" '   by EPCOR!"
  822.  
  823. IF okrick AND (LEN(debug$) > 0) THEN LOCATE 1, 12: PRINT debug$;
  824. timemachine
  825.  
  826.  
  827. SkyStuff:
  828. IF (min = 3) AND (sec = 50) THEN '                                    Tree-fiddy! (Southpark), do black hole
  829.     ex(3) = suri + t
  830.     ey(3) = h
  831.     exv(3) = t
  832.     eyv(3) = 1
  833.  
  834. IF cmleaving THEN
  835.     exv(0) = exv(0) + 2
  836.     IF exv(0) = 0 THEN exv(0) = 1
  837.  
  838. RESTORE skycrud
  839. IF eou THEN mi = 2 ELSE mi = 5 '                                      end of universe, no celestial events
  840. FOR i = 0 TO mi '                                                     0CM 1DS 2Borg 3BH 4Worm 5Comet 6Al
  841.     READ g$, skyset1(i), skyset2(i)
  842.  
  843. FOR i = 0 TO mi + ufof '                                              0CM 1DS 2Borg 3BH 4Worm 5Comet 6Alien
  844.     xplus = skyset1(i): xminus = skyset2(i)
  845.     IF (i = 3) AND cbh THEN ek(i) = 0 '                               constant black hole
  846.     IF ek(i) = -1 THEN GOTO ni2
  847.  
  848.     IF (ey(i) > (q4 + 50)) OR (ey(i) < -50) OR (exv(i) = 0) THEN
  849.         ei(i) = 0 '                                                   ini
  850.         ek(i) = 9999
  851.         nx:
  852.         ex(i) = RND * q1
  853.         IF ABS(ex(i) - (px! + suri)) < q3 THEN GOTO nx '              start away from craft
  854.         IF ABS(ex(i) - px!) < q3 THEN GOTO nx '                       start away from craft
  855.         IF i = 2 THEN ex(i) = (ex(1) + 3200) MOD q1
  856.         ey(i) = 120 + RND * h '                                       random y 120-220
  857.         IF i = 0 THEN ey(i) = 22 '                                    CM
  858.         IF i = 1 THEN ey(i) = 170 '                                   DS
  859.         IF i = 2 THEN ey(i) = th '                                    Borg
  860.         '              0 1 2 3 4 5
  861.         '              CMDeBoBHWoCoAl
  862.         c1 = VAL(MID$("04010210120502", i * 2 + 1, 2)) '              min x velocity
  863.         c2 = VAL(MID$("09030210171005", i * 2 + 1, 2)) '              max x velocity
  864.         exv(i) = RND * (c2 - c1) + c1 '                               random in range
  865.         IF RND > pf! THEN exv(i) = -exv(i)
  866.  
  867.         z = VAL(MID$("00000003020100", i * 2 + 1, 2)) '               top range y velocity
  868.         eyv(i) = 0
  869.         IF z THEN eyv(i) = RND * (z - 1) + 1 '                        random in range
  870.  
  871.         IF RND > pf! THEN exv(i) = -exv(i)
  872.         IF RND > pf! THEN eyv(i) = -eyv(i)
  873.         IF (i = 3) AND cbh THEN
  874.             IF RND > pf! THEN
  875.                 ex(i) = suri - t
  876.                 exv(i) = t
  877.             ELSE
  878.                 ex(i) = suri + q3 + t
  879.                 exv(i) = -t
  880.             END IF
  881.         END IF
  882.     END IF
  883.  
  884.     ex(i) = ex(i) + exv(i)
  885.     ey(i) = ey(i) + eyv(i)
  886.  
  887.     IF ex(i) < 0 THEN
  888.         IF (i = 0) AND cmleaving THEN
  889.             ek(i) = -1: cmleaving = 0
  890.         ELSE
  891.             ex(i) = ex(i) + q1
  892.         END IF
  893.     END IF
  894.     IF ex(i) > q1 THEN
  895.         IF (i = 0) AND cmleaving THEN
  896.             ek(i) = -1: cmleaving = 0
  897.         ELSE
  898.             ex(i) = ex(i) - q1
  899.         END IF
  900.     END IF
  901.  
  902.     exl(i) = localize(ex(i), xplus, xminus)
  903.     IF (i = 3) AND cbh AND (exl(i) = 9999) THEN exv(i) = 0
  904.  
  905.     IF ek(i) <> -1 THEN ek(i) = 9999
  906.     IF exl(i) <> 9999 THEN
  907.         dx! = ABS(px! - exl(i))
  908.         dy! = ABS(py! - ey(i))
  909.         ek(i) = SQR(dx! * dx! + dy! * dy!)
  910.  
  911.         IF i = 0 THEN GOSUB CommandModule
  912.         IF i = 1 THEN DeathStar exl(i), f$(37)
  913.         IF i = 2 THEN Borg exl(i), ey(i)
  914.         IF i = 3 THEN
  915.             IF (LEN(mes$(0)) = 0) AND (showmap = 0) AND (cbh = 0) THEN
  916.                 mes$(0) = "DANGER, WILL ROBINSON, DANGER!"
  917.             END IF
  918.             IF sas = 0 THEN BlackHole 0
  919.             sas = 0
  920.         END IF
  921.         IF i = 4 THEN WormHole
  922.         IF i = 5 THEN
  923.             tx = localize(ex(5), 0, 0)
  924.             ty = ey(5)
  925.             Comet tx, ty
  926.         END IF
  927.         IF i = 6 THEN '                                               traditional alien - too silly
  928.             j = RND * h - h \ 2
  929.             z = ey(6) + j
  930.             IF (RND > .9) AND (z > h) AND (z < 250) THEN
  931.                 ey(6) = z
  932.                 alien = alien XOR 1
  933.                 ex(6) = ex(6) + 20 * SGN(alien - pf!)
  934.             END IF
  935.             UFO exl(6), ey(6), exv(6)
  936.         END IF
  937.     END IF
  938.     ni2:
  939.  
  940. FiveWaysToDie:
  941. IF (ek(2) >= 0) AND (ek(2) < 20) THEN '                               Borg
  942.     wu! = TIMER + 5
  943.     DO: _LIMIT mdelay
  944.         CLS
  945.         mes$(0) = "YOU ARE BORG"
  946.         Info
  947.         Borg exl(2), ey(2)
  948.         FOR i = 1 TO rp
  949.             p = POINT(LMrx(i), LMry(i))
  950.             IF p = black2 THEN c = green ELSE c = black2
  951.             PSET (LMrx(i), LMry(i)), c
  952.         NEXT i
  953.         timemachine
  954.     LOOP UNTIL TIMER > wu!
  955.     dead$ = "BORG"
  956.  
  957. IF (ek(3) >= 0) AND (ek(3) < 30) THEN '                               black hole
  958.     dead$ = "EATEN"
  959.     BlackHoleDoom
  960.  
  961. IF (ek(4) >= 0) AND (ek(4) < 30) THEN '                               wormhole
  962.     wu! = TIMER + 5
  963.     spx! = exl(4)
  964.     spy! = ey(4)
  965.     exv(4) = 0
  966.     eyv(4) = 0
  967.     wradar = radarf
  968.     radarf = 1
  969.     cut = 1
  970.     DO: _LIMIT mdelay
  971.         CLS
  972.         fb$ = ""
  973.         mes$(0) = "HOLY CRAP, BATMAN!"
  974.         mes$(1) = ""
  975.         Info
  976.         a = RND * 359
  977.         px! = spx! + (RND - pf!) * 20
  978.         py! = spy! + (RND - pf!) * 5
  979.         WormHole
  980.         LMdistort '                                                   optional
  981.         GOSUB PlotVehicle
  982.         timemachine
  983.     LOOP UNTIL TIMER > wu!
  984.     radarf = wradar
  985.     dead$ = "BATMAN"
  986.  
  987. IF (ek(5) >= 0) AND (ek(5) < 15) THEN dead$ = "HIT BY COMET"
  988. IF ufof AND (ek(6) >= 0) AND (ek(6) < 45) THEN dead$ = "HIT BY ALIEN"
  989.  
  990. GetAlt:
  991. alt! = (gety(-(rxm + wi2)) - ((sy1 + sy2) \ 2)) / 5
  992.  
  993. Instruments:
  994. osc = 8
  995. IF gs THEN LoadPanel '                                                graphics start not zero, instrument panel is on
  996. IF (warp! > 0) AND (contact = 0) THEN
  997.     IF warp! >= t THEN
  998.         dead$ = "WARP 10"
  999.         RETURN
  1000.     END IF
  1001.     RESTORE warp
  1002.     FOR i = 1 TO INT(warp!)
  1003.         READ z$
  1004.     NEXT i
  1005.     w$ = LTRIM$(STR$(INT(warp! * h) / h))
  1006.     IF LEN(w$) = 1 THEN w$ = w$ + ".00"
  1007.     IF LEN(w$) = 3 THEN w$ = w$ + "0"
  1008.     mes$(0) = "WARP " + w$ + " - " + z$
  1009.     IF gs AND ((TIMER MOD t) > 5) THEN
  1010.         Henonp f
  1011.         Wave '                                                        osc = 5 if commented out
  1012.         AuHoVe auto, hover, vert, lam
  1013.         GOTO clock
  1014.     END IF
  1015.  
  1016. IF gs = 0 THEN RETURN '                                               graphics start of 0 means the instrument panel is off
  1017.  
  1018. IF panelinit = 0 THEN
  1019.     IF crash THEN f = 15 ELSE f = ((f + 1) MOD 5) + t '               title graphic/face
  1020.  
  1021. Henonp f '                                                            title graphic
  1022.  
  1023. LINE (0, 0)-(gs - 1, 3), blue2, BF '                                  clear map area
  1024.  
  1025. IF pdiv THEN '                                                        instrument update frequency 1-4, mainly a way to slow down erratic thrust display
  1026.     j = 0
  1027.     FOR i = 1 TO 18 '                                                 my name in Morse
  1028.         p = VAL(MID$("002032023222300032", i, 1)) '                   Frost
  1029.         IF p < 3 THEN LINE (14 + j, 2)-(14 + j + p, 2), white
  1030.         j = j + p + 2
  1031.     NEXT i
  1032.  
  1033. IF (contact + auto + hover + vert + liftoff) = 0 THEN
  1034.     IF (vy! > .6) AND (-fy! < 0) THEN PrintVGA CHR$(24), 5, 241, red, black2
  1035.     IF (vy! < .4) AND (-fy! > -.01) THEN PrintVGA CHR$(25), 5, 250, yellow, black2
  1036.  
  1037. AuHoVe auto, hover, vert, lam
  1038.  
  1039. IF tfollow THEN '                                                     terrain following!
  1040.     FOR ty = glmax - 20 TO glmax
  1041.         FOR tx = 0 TO gs - 1
  1042.             IF POINT(tx, ty) = blue THEN PSET (tx, ty), red '         red bg
  1043.         NEXT tx
  1044.     NEXT ty
  1045.     FOR i = 0 TO 4 '                                                  TF
  1046.         p& = VAL("&H" + MID$("E744464444", i * 2 + 1, 2))
  1047.         LINE (2, 339 + i)-(10, 339 + i), green, , p& * 128
  1048.     NEXT i
  1049.  
  1050. osc = 0
  1051. c = LEDc
  1052. IF (sbest! >= h) OR powerloss THEN c = red
  1053. z! = thrust!: IF z! > h THEN z! = h '                                 200 at liftoff, show 100
  1054. PrepAndShowLED z!, 3, 1 '                                             thrust osc1
  1055. PrintCGA "T", 5, -1, c, -blue, 0 '                                    T is for flame
  1056. i = LEDc: j = black
  1057. IF jitter THEN SWAP i, j '                                            thrust calc type
  1058. LINE (4, 231)-(5, 232), i, B '                                        left light  (on = slow)
  1059. LINE (13, 231)-(14, 232), j, B '                                      right light (on = fast)
  1060. Bar z! / h, 0
  1061.  
  1062. c = dcolor(vy!, 2, 3, 1) '                                            vy osc2
  1063. z! = vy!
  1064. IF ABS(z!) > 99.97 THEN z! = 99.99
  1065. PrepAndShowLED z!, 3, 2
  1066. PrintCGA "V", 5, -1, c, -blue2, 0
  1067. z! = (z! + 3) / 6
  1068. Bar z!, 1
  1069.  
  1070. c = dcolor(vx!, 2, 3, 1) '                                            vx osc3
  1071. IF warp! THEN
  1072.     z! = warp!
  1073.     z! = vx! + rfs!
  1074. PrepAndShowLED z!, 3, 2
  1075. PrintCGA "H", 5, -1, c, -blue, 0
  1076. z! = (z! + 3) / 6
  1077. Bar z!, 1
  1078.  
  1079. GOSUB GetAlt '                                                        alt osc4
  1080. IF contact AND (alt! > 0) THEN alt! = 0
  1081. c = dcolor(alt!, t, 3, -1)
  1082. PrepAndShowLED alt!, 4, 1
  1083. PrintCGA "A", 5, -1, c, -blue2, 0
  1084. IF warp! OR (radarf = 0) THEN z! = 0 ELSE z! = alt! / 60
  1085. Bar z!, 0
  1086.  
  1087. 'IF rick = 1 THEN
  1088. 'zz = ((suri + px!) MOD q1) \ (q3 + 1) + 1
  1089. 'TinyFont LTRIM$(STR$(zz)), 11, 125, LEDc '                           optional area
  1090. 'TinyFont LTRIM$(STR$(gh)), 11, 131, LEDc '                             "     ground
  1091. 'END IF
  1092.  
  1093. c = dcolor(fuel!, t, 5, -1) '                                         fuel osc5
  1094. PrepAndShowLED fuel!, 4, 1
  1095. PrintCGA "F", 5, -1, c, -blue, 0
  1096. z! = fuel! / h
  1097. Bar z!, 0
  1098.  
  1099. clock:
  1100. IF TIMER < start2! THEN start2! = TIMER '                             midnite crossing
  1101. IF crash = 0 THEN el! = el! + (TIMER - start2!) '                     elapsed time
  1102. start2! = TIMER
  1103. IF el! >= 1 THEN
  1104.     WHILE el! >= 1 '                                                  catch-up
  1105.         el! = el! - 1
  1106.         sec = (sec + 1) MOD 60
  1107.         IF sec = 0 THEN min = (min + 1) MOD 99
  1108.     WEND
  1109.     IF sec MOD 5 = 0 THEN '                                           change title graphic
  1110.         IF crash THEN f = 15 ELSE f = ((f + 1) MOD 5) + t
  1111.     END IF
  1112. z$ = RIGHT$("0" + LTRIM$(STR$(min)), 2) + RIGHT$("0" + LTRIM$(STR$(sec)), 2)
  1113. osc = 6
  1114. LEDdisplay z$ '                                                       clock osc6
  1115.  
  1116. i = suri + px!
  1117. j = ABS(i - sf(5, 2))
  1118. k = sf(5, 2) + (q1 - i)
  1119. IF j <= 3200 THEN dtm! = j ELSE dtm! = k
  1120. PrepAndShowLED dtm!, 4, 0 '                                           dtm osc7
  1121. PrepAndShowLED CSNG(speed), 4, 0 '                                    speed osc8
  1122.  
  1123. ShowAngle a '                                                         angle osc9
  1124.  
  1125. 'IF rick > 0 THEN '                                                   show stats
  1126. '   FOR i = -2 TO 0
  1127. '       z$ = STR$(FRE(i))
  1128. '       IF i = -2 THEN z$ = " " + MID$(f$(38), 6, 1) + z$  ' star file
  1129. '       TinyFont z$, 3, 295 + i * 6, gunmetal
  1130. '   NEXT i
  1131. '   PrintCGA MID$("DOSBOX", dosbox * 3 + 1, 3), 3, 270, red, black, 0
  1132. 'END IF
  1133.  
  1134. panelinit = 1
  1135.  
  1136. LMcolors: '                                                           optional
  1137. IF contact OR (vx! = 0) THEN lbit = 0
  1138. IF (contact + vx!) = 0 THEN
  1139.     v1 = RND * 3
  1140.     v2 = RND * 3
  1141.     SWAP LMci(v1), LMci(v2)
  1142. FOR i = 1 TO rp '                                                     right pad
  1143.     oc = LMoc(i)
  1144.     LMc(i) = oc
  1145.     IF (oc = craft) OR (oc = red) THEN '                              shadow
  1146.         zx = LMrx(i) - px! + 2 - xoff * (inpause = 0)
  1147.         zy = LMry(i) - py!
  1148.         IF (oc = craft) AND ((warp! > 0) OR (zy > zx)) THEN
  1149.             tc = gray2
  1150.         ELSE
  1151.             tc = oc
  1152.         END IF
  1153.         LMc(i) = tc
  1154.     END IF
  1155.     IF (i < 279) AND (LMoc(i) = black2) THEN '                        Ascent stage cycle
  1156.         lbit = (lbit + 5) MOD 4
  1157.         LMc(i) = LMci(lbit)
  1158.     END IF
  1159. lbit = lbit - (vx! > 0) * 2 + ASO * t
  1160.  
  1161. PlotVehicle:
  1162. IF warp! < 1 THEN
  1163.     wda = 0
  1164.     px! = wx!: py! = wy!
  1165.     wda = warp! * 5 * s!((px! + 40) MOD tsix)
  1166.  
  1167. IF crash THEN
  1168.     FOR i = 1 TO rp
  1169.         PSET (LMrx(i), LMry(i)), LMc(i)
  1170.     NEXT i
  1171.     GOTO endproc
  1172.  
  1173. IF bolthit = 0 THEN GOSUB LMcolors
  1174.  
  1175. i = sf(4, 2) - 50 '                                                   left of volcano
  1176. j = sf(4, 2) + 50 '                                                   right of volcano
  1177. k = suri + px! '                                                      LM position
  1178. IF (k > i) AND (k < j) THEN '                                         in the locality?
  1179.     c = 0 '                                                           count
  1180.     FOR ty = py! + 8 TO py! + 18 '                                    leg/nozzle area
  1181.         FOR tx = px! - 17 TO px! + 17
  1182.             p = POINT(tx, ty) '                                       what color is the pixel?
  1183.             c = c - (p = orange) '                                    hot lava
  1184.         NEXT tx
  1185.     NEXT ty
  1186.     ' LINE (px! - 17, py! + 8)-(px! + 17, py! + 18), yellow, B '      diagnostics
  1187.     IF c THEN '                                                       contacted some lava
  1188.         FOR i = rp TO 1 STEP -1 '                                     from the bottom
  1189.             IF LMoc(i) = craft THEN '                                 is normal color?
  1190.                 LMoc(i) = red '                                       make red
  1191.                 nred = nred + 1 '                                     keep track of count
  1192.                 c = c - 1
  1193.                 IF c = 0 THEN EXIT FOR '                              enough
  1194.             END IF
  1195.         NEXT i
  1196.     END IF
  1197.  
  1198. IF nred = 0 THEN '                                                    number red
  1199.     temp = 0
  1200.     rtlc(1) = 0
  1201.     IF ASO THEN z = 115 ELSE z = 223 '                                max that COULD be normal
  1202.     otemp = temp
  1203.     temp = (nred * h / z) MOD 101 '                                   temperature
  1204.     rtlc(1) = temp
  1205.     IF temp > otemp THEN rtl!(1) = TIMER + 5
  1206.     c = 24 '                                                          gasoline
  1207.     IF temp > 30 THEN c = 32 '                                        dark red
  1208.     IF temp > 60 THEN c = 4 '                                         red
  1209.     IF temp = h THEN c = 15 '                                         white
  1210.     IF bw = 0 THEN PALETTE gasoline, c
  1211.     IF (temp = h) AND (invincible = 0) THEN dead$ = "FRIED BY VOLCANO"
  1212.     FOR i = 0 TO 20 '                                                 cool down some
  1213.         j = RND * rp
  1214.         IF LMoc(j) = red THEN LMoc(j) = craft: nred = nred - 1
  1215.     NEXT i
  1216.  
  1217. n = rp '                                                              last pixel = right pad
  1218. IF fuel! > 0 THEN GOSUB Exhaust '                                     maybe vehicle only
  1219.  
  1220. IF n > maxn THEN maxn = n
  1221. 'IF maxn > 1400 THEN END '                                             beyond array size
  1222. 'debug$ = LTRIM$(STR$(maxn))
  1223.  
  1224. ta = a + ma '                                                         temp a = a + malfunction
  1225. zz = ta * -(ABS(ta) > 4) '                                            rotate beyond 5 degrees
  1226. ta = (zz + wda + tsix) MOD tsix '                                             keep in array bounds
  1227. c! = c!(ta) '                                                         cosine
  1228. s! = s!(ta) '                                                         sine
  1229. ta = zz '                                                             angle to use
  1230.  
  1231. rfx = 0 '                                                             optional craft jitter
  1232. rfy = 0
  1233. rfs! = 0 '                                                            random change in vx
  1234. IF (jitter = 1) AND (cut = 0) THEN '                                  not slow or engine cut
  1235.     IF (RND > .9) AND (a = 0) THEN '                                  a = angle
  1236.         IF RND > pf! THEN rfx = 1 ELSE rfx = -1 '                     half right, half left
  1237.         rfs! = rfx * .01 * (INT(RND * 9) + 1) '                       how much? .01 - .09
  1238.     END IF
  1239.     IF RND > .9 THEN '                                                y jitter, 1 chance in 10
  1240.         IF RND > pf! THEN rfy = 1 ELSE rfy = -1 '                     half down, half up
  1241.     END IF
  1242.  
  1243. IF doclock THEN
  1244.     i = VAL(MID$(TIME$, 1, 2))
  1245.     j = VAL(MID$(TIME$, 4, 2))
  1246.     k = VAL(MID$(TIME$, 7, 2))
  1247.     clocka(0) = (i + j / 60) * 30 '                                   hour hand
  1248.     clocka(1) = j * 6 '                                               minute hand
  1249.     clocka(2) = k * 6 '                                               seconds
  1250.     FOR z = 0 TO 2 '                                                  prep for radians
  1251.         clocka(z) = (clocka(z) + 270) MOD tsix
  1252.     NEXT z
  1253.     ao = 0 '                                                          angle offset
  1254.     ao = (ao + 1) MOD 361
  1255.  
  1256. tvx = SGN(vx!): IF tvx = 0 THEN tvx = 1
  1257. tao = ao * tvx
  1258. sco = sco XOR 1
  1259. IF doclock THEN sco = 0
  1260. IF sco THEN tc = red ELSE tc = lmsl
  1261. z3 = tsix + (shield = 0) * 361
  1262. FOR z2 = 0 TO z3
  1263.     a2 = (z2 + tao * 5 + tsix0) MOD tsix
  1264.     tx = px! + 50 * c!(a2) * aspect!
  1265.     ty = py! + 50 * s!(a2)
  1266.     IF ty < gety(tx) THEN
  1267.         IF (z2 MOD 30) = 0 THEN
  1268.             CIRCLE (tx, ty), 1, tc, , , .75
  1269.             IF geof THEN
  1270.                 FOR i = z2 - 120 TO z2 STEP 30
  1271.                     j = (i + tsix) MOD tsix
  1272.                     tx2 = px! + 60 * c!(j) * aspect!
  1273.                     ty2 = py! + 60 * s!(j)
  1274.                     LINE (tx, ty)-(tx2, ty2), tc
  1275.                 NEXT i
  1276.             END IF
  1277.         END IF
  1278.         IF doclock THEN
  1279.             FOR i = 0 TO 2
  1280.                 IF a2 = clocka(i) THEN
  1281.                     c = VAL(MID$("021404", i * 2 + 1, 2))
  1282.                     CIRCLE (tx, ty), 4 - i, c, , , .75
  1283.                     PAINT (tx, ty), c, c
  1284.                 END IF
  1285.             NEXT i
  1286.         END IF
  1287.     END IF
  1288. NEXT z2
  1289.  
  1290. FOR i = 1 TO rp '                                                     rp = craft right pad
  1291.     LMrx(i) = px! + LMx(i) * c! + LMy(i) * s! + rfx '                 x rotated
  1292.     LMry(i) = py! - LMx(i) * s! + LMy(i) * c! + rfy '                 y rotated
  1293.     IF LMry(i) > glmax THEN LMry(i) = glmax '                         not below ground
  1294.     IF i = xp THEN sx0 = LMrx(i): sy0 = LMry(i) '                     save radar loc
  1295.     IF i = lp THEN sx1 = LMrx(i): sy1 = LMry(i) '                     save left pad loc
  1296.     IF i = rp THEN sx2 = LMrx(i): sy2 = LMry(i) '                     save right pad loc
  1297.     IF bolthit THEN LMc(i) = white
  1298.     PSET (LMrx(i), LMry(i)), LMc(i)
  1299.  
  1300. 'PSET (sx3, sy3), green '                                             eh?
  1301. 'FOR ii = -1 TO 1
  1302. 'FOR jj = -1 TO 1
  1303. 'PSET (sx3 + ii, sy3 + jj), green
  1304. 'NEXT jj
  1305. 'NEXT ii
  1306. IF fuel! < 95 THEN GOSUB flevel
  1307.  
  1308. eflag = 0 '                                                           determine flame climb
  1309. fx1 = 0 ' initialize for deflect
  1310. fx2 = 0
  1311. phg = (sx1 + sx2) \ 2 + ta * 2 '                                      point hit ground
  1312.  
  1313. tty! = py! + 26
  1314.  
  1315. FOR i = rp + 1 TO n '                                                 flame/fuel dump
  1316.     x = px! + LMx(i) * c! + LMy(i) * s! + rfx '                       x rotated
  1317.     y = py! - LMx(i) * s! + LMy(i) * c! + rfy '                       y rotated
  1318.     c = LMc(i) '                                                      fuel dump/flame
  1319.     IF warp! < 1 THEN GOSUB deflect '                                 deflect off ground
  1320.     c = ABS(c) '                                                      color
  1321.     PSET (x, y), c '                                                  flame particle
  1322.     IF i <= n3 THEN '                                                 main exhaust
  1323.         IF (i MOD t) = 1 THEN '                                       every 10th pixel
  1324.             LINE (x - 1, y)-(x + 1, y), c '                           make "+"
  1325.             LINE (x, y - 1)-(x, y + 1), c
  1326.         END IF
  1327.     END IF
  1328.  
  1329. IF rfx AND dump AND (a = 0) THEN vx! = vx! + rfs! '                   make jitter real
  1330. IF rfx AND (dump = 0) AND (a <> 0) THEN vx! = vx! + rfs!
  1331.  
  1332. endproc:
  1333.  
  1334. IF doclock THEN TextOnLM$ = LEFT$(TIME$, 5)
  1335. 'IF showspeed THEN TextOnLM$ = LTRIM$(STR$(speed))
  1336. IF LEN(TextOnLM$) THEN GOSUB TextOnLM
  1337.  
  1338. GOSUB radar
  1339.  
  1340. fc = 0 '                                                              LGM flame count
  1341. IF (sf(3, 1) >= suri) AND (sf(3, 0) < (suri + q3)) THEN
  1342.     x1 = sf(3, 0) - suri
  1343.     y1 = gety(x1) - 14
  1344.     FOR x = x1 + 5 TO x1 + 15
  1345.         FOR y = y1 - 9 TO y1 + 12
  1346.             IF POINT(x, y) = yellow THEN fc = fc + 1
  1347.         NEXT y
  1348.     NEXT x
  1349.  
  1350. GOSUB KillThreats
  1351.      
  1352. geof = geof - 1 - (geof = 0)
  1353.  
  1354. IF ok AND (TIMER > wu2!) AND (INSTR(mes$(0), "IN CAR") = 0) THEN FlagandFireworks
  1355.  
  1356. mpass& = mpass& + 1
  1357. IF TIMER <= start1! THEN start1! = TIMER: mpass& = 1
  1358. speed = ((TIMER - start1!) / mpass&) * h * t
  1359.  
  1360. IF rick THEN GraphSpeed
  1361.  
  1362. IF magic = 1 THEN '                                                   magic landing, 1st step laser the surface to level
  1363.     sf = 0
  1364.     z = suri + px!
  1365.     IF z > q1 THEN z = z - q1
  1366.     sf(0, 0) = z - 35 '                                               cut out a swath 70 units wide
  1367.     sf(0, 1) = z + 35
  1368.     GOSUB lsurface '                                                  apply laser
  1369.     a = 0 '                                                           angle
  1370.     auto = 0 '                                                        autopilot
  1371.     vx! = 0 '                                                         cancel any x velocity
  1372.     vy! = 0 '                                                         cancel any y velocity
  1373.     py! = 331 + ASO * 9 '                                             ground has been cut to the lowest
  1374.     cut = 1 '                                                         signal engine off
  1375.     magic = 2
  1376.  
  1377. '                                                                     kill surface feature
  1378. IF firel AND ksf AND (contact = 0) AND (sf(sf, 2) > 0) THEN
  1379.     GOSUB lsurface
  1380. firel = ks '                                                          ks = keep shooting
  1381.  
  1382. '                                                                     terrain following
  1383. IF tfollow AND (contact = 0) AND (dump = 0) AND (liftoff = 0) THEN
  1384.     hover = 1
  1385.     hp = q1
  1386.     svx = SGN(vx!)
  1387.     IF svx < 0 THEN tx = sx1 ELSE tx = sx2
  1388.     la = ABS(vx!) * t
  1389.     IF la < t THEN la = t
  1390.     IF la > h THEN la = h
  1391.     FOR i = -(wi + 5) TO la
  1392.         j = tx + i * svx
  1393.         k = j
  1394.         IF k < 0 THEN k = k + q1
  1395.         IF k > q1 THEN k = k - q1
  1396.         z = gety(k)
  1397.         IF z < hp THEN hp = z: sx = j
  1398.     NEXT i
  1399.     cx = ABS(sx - tx)
  1400.     IF cx THEN
  1401.         cy = hp - t - ABS(a / 2) - sy1
  1402.         st! = cy / cx * (ABS(vx!) + 1)
  1403.         IF st! > 2 THEN st! = 2
  1404.         IF st! < -t THEN st = -t
  1405.         fst = -SGN(st!) * 2
  1406.         py! = py! + st!
  1407.         IF py! < 250 THEN py! = 250
  1408.     END IF
  1409. IF paraf THEN
  1410.     IF py! > 150 THEN mes$(0) = "Parachutes don't work in a vacuum!"
  1411.     Parachute
  1412.  
  1413.  
  1414. TextOnLM:
  1415. IF (ASO = 0) AND (ABS(ta) < t) THEN
  1416.     lt = LEN(TextOnLM$)
  1417.     tx = px! - lt * 2 + rfx
  1418.     ty = py! + rfy
  1419.     IF ty > 340 THEN ty = 340
  1420.     TinyFont TextOnLM$, tx, ty, white
  1421. TextOnLM$ = ""
  1422.  
  1423. KillThreats:
  1424. killed = 0
  1425. FOR i = 0 TO 20 '                                                     shells
  1426.     c1 = shield AND (shx(i) > 0) AND (shd(i) < 70) '                  shield on and shell close to LM
  1427.     c2 = firel AND (shx(i) > 0) '                                     fire laser and shell in air
  1428.     IF c1 OR c2 THEN
  1429.         killed = 1 '                                                  found something to kill
  1430.         tx = shx(i) - suri
  1431.         ty = shy(i)
  1432.         GOSUB LMfl '                                                  fl = fire laser
  1433.         IF LEN(dead$) THEN RETURN
  1434.         ExplodeShell i
  1435.     END IF
  1436.  
  1437. ks = 0
  1438. FOR i = 1 TO 6
  1439.     IF skyoff OR (ek(i) = -1) THEN GOTO ni3
  1440.     '                   CM DS BO BH WO Co
  1441.     '   kd = VAL(MID$(" 80150120 50 50 50", i * 3 + 1, 3))
  1442.     '   c1 = shield AND c0 AND (ek(i) < kd)
  1443.     '   IF (i = 2) AND (sy1 < borgt) THEN c1 = 0
  1444.     '   c2 = firel AND c0
  1445.     IF firel AND (exl(i) > gs) AND (exl(i) < q3) THEN
  1446.         killed = 1
  1447.         ks = 1
  1448.         tx = exl(i)
  1449.         ty = ey(i)
  1450.         IF laserb = 0 THEN laserb = 5
  1451.         IF laserb > 0 THEN
  1452.             GOSUB LMfl
  1453.             IF LEN(dead$) THEN RETURN
  1454.             k = (5 - laserb) * 4
  1455.             IF i > 1 THEN
  1456.                 CIRCLE (tx, ty), k, yellow
  1457.                 PAINT (tx, ty), yellow, yellow
  1458.             END IF
  1459.             laserb = laserb - 1
  1460.         END IF
  1461.         IF laserb = 0 THEN
  1462.             ks = 0
  1463.             IF i = 1 THEN
  1464.                 mes$(1) = "The Dark Side has cookies!"
  1465.             ELSE
  1466.                 FOR a2 = 0 TO tsix STEP 2
  1467.                     x2 = tx + RND * h * c!(a2) * aspect!
  1468.                     y2 = ty + RND * h * s!(a2)
  1469.                     LINE (tx, ty)-(x2, y2), gold
  1470.                 NEXT a2
  1471.                 ek(i) = -1
  1472.                 exv(i) = 0
  1473.                 exl(i) = -1
  1474.                 IF (i = 2) AND lob THEN dead$ = "SELF-DESTRUCT"
  1475.             END IF
  1476.         END IF
  1477.     END IF
  1478.     ni3:
  1479. IF killed THEN ksf = 0 ELSE ksf = 1
  1480.  
  1481. lsurface: '                                                           laser surface feature
  1482. z = (RND > .9) OR (magic = 1) '                                       1 out of 10 destroys, magic always
  1483. FOR i = sf(sf, 0) TO sf(sf, 1)
  1484.     tx = i - suri
  1485.     IF tx < 0 THEN tx = tx + q1
  1486.     ty = gety(tx)
  1487.     IF sf <> 3 THEN ty = ty + RND * (q4 - ty)
  1488.     IF i MOD 2 THEN GOSUB LMfl '                                      fire laser
  1489.     IF z THEN gh(i) = glmax '                                         level
  1490.     Smooth sf(sf, 0) - 1 '                                            smooth transition from where the ground has been leveled, left side
  1491.     Smooth sf(sf, 1) '                                                                                                            , right side
  1492.     sf(sf, 2) = -1
  1493.  
  1494. LMfl: '                                                               fire laser
  1495. IF (cwd < 50) AND (sy1 > szs) THEN '                                  in car wash?
  1496.     dead$ = "REFLECTED LASER"
  1497.     cwd = 999
  1498.     firel = 0
  1499.     laserb = 0
  1500.     ks = 0
  1501.     RETURN
  1502. FOR zx = -1 TO 1
  1503.     FOR zy = -1 TO 1
  1504.         LINE (sx0 + zx, sy0 + zy)-(tx, ty), lmsl
  1505.     NEXT zy
  1506. NEXT zx
  1507. geof = t
  1508.  
  1509. flevel: '                                                             make fuel level when angle > 4
  1510. IF ASO THEN RETURN '                                                  no fuel shown with AS
  1511. ptk = (h - fuel!) * 2.7 '                                             pixels to kill
  1512. z = ptk '                                                             ptk used by ExplodeLM
  1513. x1 = px! - 16
  1514. x2 = px! + 14
  1515. y1 = py! - 15
  1516. y2 = py! + 15
  1517. 'LINE (x1, y1)-(x2, y2), red, B
  1518. FOR y = y1 TO y2
  1519.     FOR x = x1 TO x2
  1520.         IF POINT(x, y) = fuel THEN
  1521.             PSET (x, y), black2
  1522.             z = z - 1
  1523.         END IF
  1524.     NEXT x
  1525.     IF z <= 0 THEN EXIT FOR
  1526.  
  1527. deflect: '                                                            flame bounce
  1528. oz = gety(-x)
  1529. IF deflectat > 0 THEN oz = deflectat
  1530. z = oz
  1531.  
  1532. '       dump           side t      st in pause
  1533. IF (c = fuel) OR (c = -yellow) OR (c = -blue) THEN
  1534.     IF (fx1 > 0) AND (x < fx1) THEN z = 0
  1535.     IF (fx2 > 0) AND (x > fx2) THEN z = 0
  1536.     rf1 = RND * t + 1
  1537.     rf2 = RND * 20 - t
  1538.     IF y >= (z - 1) THEN '                                            yep, deflect it
  1539.         IF x < sx1 THEN
  1540.             IF fx1 = 0 THEN fx1 = x: fy1 = LMry(th1)
  1541.             x = fx1 + rf1
  1542.             y = fy1 + rf2
  1543.         ELSE
  1544.             IF fx2 = 0 THEN fx2 = x: fy2 = LMry(th2)
  1545.             x = fx2 - rf1
  1546.             y = fy2 + rf2
  1547.         END IF
  1548.     END IF
  1549.     RETURN
  1550.  
  1551. IF y >= (z - 1) THEN '                                                yep, deflect it
  1552.     IF sy1 < borgt THEN ky1 = 1: GOTO isborg
  1553.     '  IF aboveborg THEN ky1 = 1: GOTO isborg
  1554.     IF eflag = 0 THEN '                                               limit flame climbing
  1555.         eflag = 1 '                                                   only once per position
  1556.         xmin2 = phg - thrust! * 1.5 '                                 point hit ground
  1557.         xmax2 = phg + thrust! * 1.5
  1558.         u1 = 0 '                                                      up count l of nozzle
  1559.         u2 = 0 '                                                      up count r of nozzle
  1560.         wu1 = 0 '                                                     worst l up count
  1561.         wu2 = 0 '                                                     worst r up count
  1562.         ky1 = 0 '                                                     keep y
  1563.         ky2 = 0 '                                                     keep y
  1564.         FOR zz = phg TO phg - h STEP -1 '                             from LM center left
  1565.             z2 = gety(-zz): IF zz = phg THEN lz = z2
  1566.             k1 = z2 - lz
  1567.             lz = z2
  1568.             IF k1 > 0 THEN '                                          down
  1569.                 u1 = 0
  1570.             ELSE
  1571.                 u1 = u1 - k1 '                                        up
  1572.                 IF u1 > wu1 THEN wu1 = u1 '                           worst up
  1573.             END IF
  1574.             IF u1 > 20 THEN xmin2 = zz + 2: EXIT FOR
  1575.             IF ABS(k1) > 20 THEN ky1 = 1 '                            90 degrees TMA etc
  1576.         NEXT zz
  1577.         FOR zz = phg TO phg + h '                                     from LM center right
  1578.             z2 = gety(-zz): IF zz = phg THEN lz = z2
  1579.             k2 = z2 - lz
  1580.             lz = z2
  1581.             IF k2 > 0 THEN '                                          down
  1582.                 u2 = 0
  1583.             ELSE
  1584.                 u2 = u2 - k2 '                                        up
  1585.                 IF u2 > wu2 THEN wu2 = u2 '                           worst up
  1586.             END IF
  1587.             IF u2 > 20 THEN xmax2 = zz - 2: EXIT FOR
  1588.             IF ABS(k2) > 20 THEN ky2 = 1 '                            90 degrees TMA etc
  1589.         NEXT zz
  1590.     END IF
  1591.  
  1592.     isborg:
  1593.     r = thrust! * 2 + (RND - pf!) * 80
  1594.     x = (phg - r) + RND * (r * 2)
  1595.     k = ABS(x - phg + a * 2) / 4
  1596.  
  1597.     tx = x + suri '                                                   McDonalds
  1598.     IF (tx >= sf(5, 0)) AND (tx <= sf(5, 1)) AND (py! > 250) THEN
  1599.         ky1 = 0: ky2 = 0
  1600.     END IF
  1601.  
  1602.     IF (ky1 = 1) OR (ky2 = 1) THEN '                                  keep
  1603.         y = z - RND * k - 1: RETURN
  1604.     END IF
  1605.  
  1606.     x2 = (RND - pf!) * 20
  1607.     IF x < xmin2 THEN x = xmin2 + RND * (xmax2 - xmin2) + x2
  1608.     IF x > xmax2 THEN x = xmin2 + RND * (xmax2 - xmin2) - x2
  1609.  
  1610.     IF (platform > 0) AND (ABS(px! - (pminx + 17)) < 20) THEN
  1611.         y = y - platform
  1612.     ELSE
  1613.         y = gety(-x) - RND * k - 1
  1614.     END IF
  1615.  
  1616.     IF (deflectat > 0) AND (y > deflectat) THEN y = deflectat - (y - deflectat)
  1617.  
  1618. CWceiling: '                                                          car wash
  1619. cwd = ABS((suri + px!) - sf(2, 2)) '                                  car wash distance
  1620. IF ASO THEN szs = 323 ELSE szs = 340 '                                safe zone start
  1621. IF (cwd < 69) AND (sy1 > 304) THEN '                                  lower than top of building
  1622.     IF sy1 >= q4 THEN '                                               touched down inside
  1623.         cc1 = -1
  1624.     ELSEIF sy2 >= q4 THEN '                                           touched down inside
  1625.         cc2 = -1
  1626.     ELSEIF sy1 > szs THEN '                                           in safe zone
  1627.         cc1 = 0
  1628.         cc2 = 0
  1629.         IF cwd < 50 THEN mes$(0) = "Washee washee no starchee!"
  1630.     ELSE
  1631.         IF (sy1 > (szs - t)) AND (sy1 <= szs) THEN '                  bouncing off ceiling
  1632.             cc1 = 0
  1633.             cc2 = 0
  1634.             vy! = 1
  1635.             py! = py! + 2
  1636.             'hover = 1
  1637.         END IF
  1638.     END IF
  1639.  
  1640. CheckHit: '                                                           contact with ground
  1641. cc1 = ((sy1 + 1) >= gety(-sx1)) '                                     left pad
  1642. cc2 = ((sy2 + 1) >= gety(-sx2)) '                                     right pad
  1643. mingx = 0
  1644. mingy = q1
  1645. FOR zx = sx1 TO sx2 '                                                 check between pads
  1646.     zy = sy1 - 2
  1647.     p = POINT(zx, zy)
  1648.     IF p = gray THEN '                                                got 1
  1649.         ty = gety(-zx)
  1650.         IF ty < mingy THEN mingx = zx: mingy = ty
  1651.     END IF
  1652. NEXT zx
  1653. IF mingx THEN
  1654.     i = mingx - sx1
  1655.     j = sx2 - mingx
  1656.     IF i < j THEN cc1 = -1 ELSE cc2 = -1
  1657.  
  1658. GOSUB CWceiling '                                                     car wash
  1659. IF vy! < 0 THEN RETURN '                                              going UP
  1660.  
  1661. IF cc1 OR cc2 THEN '                                                  pad(s) on ground
  1662.     contact = 1
  1663.     tmt! = 0
  1664.     py! = py! + rfy '                                                 no time to correct jitter
  1665.     TexOnLM$ = ""
  1666.     warp! = 0
  1667.     GOSUB CutOrOutOfFuel
  1668.  
  1669.     IF (vy! > 0) AND ABS(sy1 - (ey(2) - 40)) < t THEN
  1670.         lob = 1 '                                                     landed on Borg
  1671.         vx! = vx! - exv(2)
  1672.     END IF
  1673.  
  1674.     IF (ABS(vx!) > t) OR (vy! > 20) THEN
  1675.         dead$ = "HIGH SPEED IMPACT!"
  1676.         RETURN
  1677.     END IF
  1678.  
  1679.     dp = 8 + (h - fuel!) \ 25 '                                       8 - 12
  1680.     IF (vy! > dp) OR (ABS(vx!) > 8) THEN '                            too fast given load
  1681.         crash = 1
  1682.         panelinit = 0
  1683.         shield = 0
  1684.         dead$ = "CRASHED"
  1685.         z = ABS(vx!) * t + ABS(vy!) * t
  1686.         FOR i = 1 TO rp '                                             create layer of debris
  1687.             LMrx(i) = LMrx(i) + RND * z - (z \ 2)
  1688.             LMry(i) = gety(LMrx(i)) - RND * 2 - 1
  1689.         NEXT i
  1690.         IF bw = 0 THEN
  1691.             PALETTE green, 0 '                                            blank instruments
  1692.             'PALETTE red, 32
  1693.             PALETTE yellow, 0
  1694.         END IF
  1695.         RETURN
  1696.     END IF
  1697.  
  1698.     IF (vy! > 3) OR (ABS(vx!) > 3) THEN fb$ = "vehicle damaged"
  1699.  
  1700.     IF (vy! > 4) OR (ABS(vx!) > 4) THEN
  1701.         fb$ = "vehicle severely damaged"
  1702.         LMdistort '                                                   randomly vary structure
  1703.         vsd = 1 '                                                     vehicle severely damaged
  1704.     END IF
  1705.  
  1706.     savea = a + ma
  1707.  
  1708.     IF lob THEN '                                                     landed on Borg
  1709.         a = 0
  1710.         IF sx1 < borgl THEN a = 45
  1711.         IF sx2 > borgr THEN a = -45
  1712.         py! = py! - t * (ABS(a) = 45)
  1713.         RETURN
  1714.     END IF
  1715.  
  1716.     '                                                                 optional, allow ANY part of pad
  1717.     IF cc1 THEN cd = -1: cpx = sx2: cpy = sy2 + 1
  1718.     IF cc2 THEN cd = 1: cpx = sx1: cpy = sy1 + 1
  1719.     FOR i = 1 TO 4
  1720.         cpx = cpx + cd
  1721.         IF (cpy >= gety(-cpx)) THEN
  1722.             IF cc1 THEN cc2 = 1 ELSE cc1 = 1
  1723.         END IF
  1724.     NEXT i
  1725.  
  1726.     IF NOT (cc1 AND cc2) THEN '                                       only 1 pad down
  1727.         npass = 0
  1728.         DO: _LIMIT mdelay * 2 '                                       settle LM
  1729.             a = a + (cc1 - cc2)
  1730.             pa:
  1731.             npass = npass + 1
  1732.             IF npass > 150 THEN EXIT DO
  1733.             GOSUB Plotscreen '                                        show change
  1734.             IF LEN(dead$) THEN EXIT DO
  1735.             IF ABS(a) > 40 THEN
  1736.                 a = 180 '                                             upside down
  1737.                 py! = glmax - ny
  1738.                 LMdistort '                                           optional
  1739.                 EXIT DO
  1740.             END IF
  1741.             IF cc1 AND (sy1 < gety(-sx1)) THEN py! = py! + 1: GOTO pa
  1742.             IF cc2 AND (sy2 < gety(-sx2)) THEN py! = py! + 1: GOTO pa
  1743.             cc3 = ((sy1 + 1) >= gety(-sx1))
  1744.             cc4 = ((sy2 + 1) >= gety(-sx2))
  1745.             IF ABS(a) > 80 THEN py! = glmax - wi2
  1746.  
  1747.             z = gety(INT(px!)) - py! - ny + 5
  1748.             IF (z < 0) AND (paraf = 0) THEN
  1749.                 dead$ = "PUNCTURE DAMAGE"
  1750.                 RETURN
  1751.             END IF
  1752.         LOOP UNTIL (cc1 AND cc4) OR (cc2 AND cc3)
  1753.     END IF
  1754.  
  1755. slimit: '                                                             surface index bounds
  1756. z = 0
  1757. IF suri < 0 THEN z = q1
  1758. IF suri >= q1 THEN z = -q1
  1759. suri = suri + z
  1760. IF lock1 THEN lock1 = lock1 + z
  1761.  
  1762. radar: '                                                              autopilot landing here too
  1763. IF contact OR liftoff THEN RETURN
  1764. z = SGN(vx!): IF z = 0 THEN z = 1
  1765. IF z = -1 THEN sbl = -280 ELSE sbl = 220
  1766. bt = (bt MOD 4) + 1
  1767. div = ABS(alt!) \ 2 + bt
  1768.  
  1769. IF right OR left THEN tvx! = sv! ELSE tvx! = vx!
  1770. IF ABS(tvx!) > 99 THEN tvx! = 99 * SGN(tvx!)
  1771. IF (tfollow = 0) AND (aboveborg OR ((radarf = 0) AND (auto = 0))) THEN tvx! = 0
  1772. bl = sbl * ABS(tvx!) + (sx1 - sx2)
  1773. IF ABS(bl) > ABS(sbl) THEN bl = sbl
  1774. IF auto = 0 THEN lock1 = 0
  1775. IF lock1 = 0 THEN rxm = sx2 + bl ELSE rxm = lock1 - suri
  1776.  
  1777. level = 1
  1778. FOR j = 0 TO wi '                                                     width (distance between pads)
  1779.     tx = rxm + j
  1780.     ty = gety(-tx)
  1781.     IF aboveborg AND (sx1 >= borgl) AND (sx2 <= borgr) THEN ty = borgt
  1782.     IF j = 0 THEN cmp = ty
  1783.     IF ABS(cmp - ty) > 1 THEN level = 0
  1784.  
  1785. IF level THEN
  1786.     IF auto AND (lock1 = 0) THEN '                                    automatic yet no current lock
  1787.         lock1 = suri + rxm - SGN(rxm) * 2 * (vx! <> 0) '              lock onto level ground
  1788.     END IF
  1789.     rbeam = green '                                                   radar beam color
  1790.     lock1 = 0 '                                                       not level, cancel lock
  1791.     rbeam = red '                                                     radar beam color
  1792.  
  1793. 'IF lock1 <> olock1 THEN
  1794. '   LOCATE 2, 10: PRINT lock1; olock1;
  1795. '   timemachine
  1796. '   WHILE INKEY$ = "": WEND
  1797. '   olock1 = lock1
  1798. 'END IF
  1799.  
  1800. rpass = rpass XOR 1
  1801. IF level AND (vx! = 0) THEN
  1802.     div = div \ 2
  1803.     IF div < 1 THEN div = 1
  1804.     IF rpass THEN rbeam = 0
  1805.  
  1806. FOR i = 0 TO (wi + 1) STEP 5
  1807.     IF vx! > 0 THEN tx = rxm + i ELSE tx = rxm + wi - i
  1808.     IF aboveborg THEN
  1809.         tx = sx1 + i
  1810.         ty = borgt
  1811.     ELSE
  1812.         ty = gety(tx)
  1813.     END IF
  1814.     IF (warp! < 1) AND (ty > sy0) AND (radarf > 0) THEN GOSUB rbeam
  1815.  
  1816. IF auto = 0 THEN GOTO end6
  1817. IF aboveborg OR (abort = 0) THEN GOTO skipit
  1818.  
  1819. abort:
  1820. hover = 1
  1821. hoverc = 0
  1822. lock1 = 0
  1823.  
  1824. i = (py! > 120) '                                                     too low
  1825. j = NOT ((vx! = 0) AND (level = 1)) AND (ABS(vx!) < (ideal! - .05)) ' too slow
  1826. k = (ABS(vx!) > (ideal! + .05)) '                                     too fast
  1827. IF i THEN wa = -ma: hoverc = -3
  1828. IF j THEN wa = 4 * -z + ma
  1829.     wa = ABS(vx!) * z - ma
  1830.     IF ABS(wa) > 20 THEN wa = 20 * z
  1831. IF i OR j OR k THEN abort = 1: GOTO end6
  1832. abort = 0
  1833.  
  1834. skipit:
  1835. IF lam THEN '                                                         land at McDonalds
  1836.     dis = ABS((suri + rxm) - sf(5, 2))
  1837.     IF dis > 80 THEN level = 0: lock1 = 0
  1838. wa = -ma ' want angle = -malfunction angle
  1839.  
  1840. IF dflag THEN dump = 0: dflag = 0
  1841. IF level = 0 THEN '                                                   locked onto a target
  1842.     abort = 1
  1843.     ddd = ABS(px! - rxm)
  1844.     IF (ddd < 120) AND (lock1 > 0) AND (auto = 1) AND (fuel! > 70) THEN
  1845.         dump = 1
  1846.         dflag = 1
  1847.     END IF
  1848.     IF ddd < h THEN '                                                 100 clicks away
  1849.         hover = 0 '                                                   stop hovering
  1850.         vert = 1 '                                                    start moving down
  1851.         dist = sx1 - rxm '                                            distance to target
  1852.         thv! = ABS(dist) / 27 '                                       to horizontal velocity
  1853.         IF thv! < .08 THEN mu = 1 ELSE mu = 4
  1854.         IF thv! < .01 THEN mu = 0
  1855.         IF aboveborg = 0 THEN
  1856.             ' IF okrick THEN
  1857.             '     LOCATE 3, 11: PRINT dist;
  1858.             '     LOCATE 4, 11: PRINT vx!;
  1859.             ' END IF
  1860.             ' IF (SGN(vx!) = SGN(dist)) OR (ABS(vx!) > thv!) THEN wa = wa + mu * z
  1861.             IF ABS(vx!) > thv! THEN wa = wa + mu * z
  1862.         END IF
  1863.     END IF
  1864. end6:
  1865. GOSUB angle
  1866.  
  1867. rbeam:
  1868. dx! = (tx - sx0) / div
  1869. dy! = (ty - sy0) / div
  1870. FOR j = 1 TO q1
  1871.     tx = sx0 + j * dx!
  1872.     ty = sy0 + j * dy!
  1873.     my = gety(-tx)
  1874.     IF ty >= my THEN
  1875.         IF (tx < rxm) OR (tx > (rxm + wi + 1)) THEN level = 0: rbeam = red
  1876.         EXIT FOR
  1877.     END IF
  1878.     IF i AND (rbeam > 0) THEN
  1879.         PSET (tx, ty), rbeam
  1880.         IF radarf = 2 THEN PSET (tx + 1, ty), rbeam
  1881.     END IF
  1882.  
  1883. angle:
  1884. cf = 0
  1885. IF a <> wa THEN '                                                     current angle, wanted angle
  1886.     w = a '                                                           was = angle
  1887.     a = a + SGN(wa - a)
  1888.     change = a - w
  1889.     IF change THEN
  1890.         cf = 1
  1891.         a1 = ABS(w + ma)
  1892.         a2 = ABS(a + ma)
  1893.         IF (a1 > 4) OR (a2 > 4) THEN wan = 3 '                        activate up/down
  1894.     END IF
  1895.      
  1896. IF liftoff OR ((auto = 0) AND (vert = 1) AND (ma = 0)) THEN RETURN
  1897. cp = (a <> 0) AND (RND < .01) '                                       clear problem
  1898.  
  1899. IF cf OR cp THEN
  1900.     IF cp OR (RND < .01) THEN
  1901.         z = ma
  1902.         IF cp THEN ma = 0 ELSE ma = a
  1903.         IF ma <> z THEN '                                             new malfunction angle
  1904.             IF ma THEN
  1905.                 z$ = LTRIM$(STR$(-ma))
  1906.                 IF ma < 0 THEN z$ = "+" + z$
  1907.                 mes$(0) = "DANGER! STUCK THRUSTER " + z$
  1908.                 IF auto THEN a = a - ma: wa = a - ma '                immediate correct
  1909.             ELSE
  1910.                 mes$(0) = "THRUSTERS OK"
  1911.                 IF auto THEN a = a + z: wa = a + z '                  immediate correct
  1912.             END IF
  1913.         END IF
  1914.     END IF
  1915.  
  1916. Exhaust:
  1917. IF inpause THEN tflame = blue ELSE tflame = flame
  1918.  
  1919. IF cut THEN thrust! = 0
  1920. d = thrust! - (RND * 20 - t) * (thrust! > 0)
  1921. x = (LMx(lp) + LMx(rp)) \ 2 '                                         halfway between pads
  1922.  
  1923. IF ASO THEN '                                                         ascent stage only
  1924.     i = 30 '                                                          divisor for exhaust width
  1925.     j = 1 '                                                           throwing x off up to this amount
  1926.     k = 3 '                                                           flame decrement
  1927.     y = ny + 1 '                                                      starting y
  1928.     i = 20 '                                                          divisor for exhaust width
  1929.     j = 2 '                                                           throwing x off up to this amount
  1930.     k = 2 '                                                           flame decrement
  1931.     y = ny - 3 '                                                      starting y
  1932.  
  1933. WHILE d > 0 '                                                         until thrust decremented to 0
  1934.     p = d \ i
  1935.     FOR z = -1 TO 1 STEP 2
  1936.         FOR jj = 0 TO 3
  1937.             n = n + 1 '                                               add to vehicle daa
  1938.             IF n > 1400 THEN END '                                    beyond array size
  1939.             LMx(n) = x + p * z + RND * (j * 2) - j
  1940.             LMy(n) = y + RND * 2
  1941.             IF (powerloss > 0) AND (RND < .3) THEN zz = orange ELSE zz = tflame
  1942.             LMc(n) = zz '                                             yellow normally, blue during pause
  1943.             IF RND > .95 THEN '                                        some way off plume for realism
  1944.                 LMx(n) = LMx(n) - RND * 80 + 40
  1945.                 LMy(n) = LMy(n) + 5
  1946.             END IF
  1947.         NEXT jj
  1948.     NEXT z
  1949.     y = y + 1 '                                                       next flame row
  1950.     d = d - k '                                                       decrement temp thrust
  1951. n3 = n '                                                              main/side thrusters
  1952.  
  1953. '                                                                     if there's a thruster malfunction, may have both thrusters active
  1954. IF (ma = 0) OR (a = 0) OR (SGN(a) = SGN(ma)) THEN
  1955.     ta = a + ma
  1956.     pass = 1
  1957.     ta = a
  1958.     pass = 2
  1959. IF dump THEN ta = t
  1960.  
  1961. dors: '                                                               dump fuel or sideways motion
  1962. IF liftoff THEN ta = 0
  1963. IF rfx AND (dump = 0) THEN ta = rfs! * 50
  1964. IF (contact = 1) AND (dump = 0) THEN ta = 0: wan = 0: super = 0
  1965. IF ta <> 0 THEN
  1966.     IF ta < 0 THEN th0 = th1: z! = -2
  1967.     IF ta > 0 THEN th0 = th2: z! = 2
  1968.     zz = ta: IF zz > t THEN ta = t
  1969.     tt = ABS(zz * 4 + 4 * SGN(ta))
  1970.     IF ABS(zz) > 20 THEN tt = t
  1971.     DO
  1972.         n = n + 1
  1973.         LMx(n) = LMx(th0) + z! + RND * 2 - 1
  1974.         LMy(n) = LMy(th0) + (RND * 2 - 1) * (ABS(ta) > 2)
  1975.         IF dump THEN
  1976.             tc = fuel
  1977.             z = 20 - 20 * s!(90 + (LMx(n) - LMx(th0)) * 1.8)
  1978.             IF a = 180 THEN z = -z
  1979.             LMy(n) = LMy(n) + z
  1980.         ELSE
  1981.             tc = -tflame
  1982.         END IF
  1983.         LMc(n) = tc
  1984.         tt = tt - 1
  1985.         z! = z! * 1.15
  1986.     LOOP UNTIL (tt = 0) OR (ABS(z!) > 40)
  1987.     IF dump THEN
  1988.         ta = -ta
  1989.         IF lockfuel = 0 THEN fuel! = fuel! - .1 + (fuel! > 5) * 2
  1990.         IF ta = -t THEN GOTO dors
  1991.         IF fuel! < 1 THEN dump = 0
  1992.     END IF
  1993. pass = pass - 1
  1994. IF pass THEN ta = ma: GOTO dors
  1995. noside:
  1996.  
  1997. '                                                                     super - use side thrusters to augment main thrust when more than
  1998. '                                                                     100% thrust is called for
  1999. IF fst OR super OR (wan > 0) THEN '                                   up/down to change angle beyond 5 degrees
  2000.     IF change > 0 THEN th1d = -1: th2d = 1
  2001.     IF change < 0 THEN th2d = -1: th1d = 1
  2002.     IF super THEN th1d = 1: th2d = 1
  2003.     IF fst THEN th1d = fst: th2d = fst: fst = 0
  2004.     FOR z = 0 TO 6
  2005.         n = n + 1
  2006.         LMx(n) = LMx(th1) + RND * 2
  2007.         LMy(n) = LMy(th1) + th1d * (z + RND * 2) + 2
  2008.         LMc(n) = tflame '                                             blue flame in pause
  2009.         n = n + 1 '                                                   other thruster opposite
  2010.         LMx(n) = LMx(th2) + RND * 2 - 2
  2011.         LMy(n) = LMy(th2) + th2d * (z + RND * 2) + 2
  2012.         LMc(n) = tflame
  2013.     NEXT z
  2014.     wan = wan - 1
  2015.     IF wan = 1 THEN change = -change
  2016.  
  2017.  
  2018. init1: '                                                              only done once
  2019. DATA convo,f1,f2,lmx1,lmy1,lmc1,lmx2,lmy2,lmc2
  2020. DATA h1,h2,h3,h4,h5,h6,cybill,surv2,cm,rad,af2,sf2,panel
  2021. DATA sd,sl,s0,s1,s2,s3,s4,s5,s6,s7,s8,s9,panel0,panel1
  2022. DATA dstarm,stars,lanblank,alien
  2023.  
  2024. RESTORE init1
  2025. IF _FILEEXISTS("rick.") THEN okrick = 1
  2026. tc$ = UCASE$(COMMAND$ + "   ")
  2027. IF LEFT$(tc$, 1) = "/" THEN tc$ = "   "
  2028. IF INSTR(tc$, "DOS") THEN dosbox = 0 '                                use large star file
  2029. IF INSTR(tc$, "BOX") THEN dosbox = 1 '                                use small star file
  2030. IF INSTR(tc$, "CD ") THEN iscd = 1 '                                  simulate CD
  2031. IF INSTR(tc$, "UFO ") THEN ufof = 1 '
  2032. IF _FILEEXISTS("cd.dat") THEN iscd = 1 '                              include/create this file for CD/DVD distribution (read only)
  2033.  
  2034. z = 0
  2035. FOR i = 1 TO 40
  2036.     READ f$(i)
  2037.     IF i = 38 THEN '                                                  stars
  2038.         j = 2 - dosbox '                                              1=small, 2=medium, 3=huge
  2039.         f$(i) = f$(i) + CHR$(48 + j)
  2040.     END IF
  2041.     IF i THEN
  2042.         f$(i) = f$(i) + ".dat" '                                      try lowercase first
  2043.         IF _FILEEXISTS(f$(i)) = 0 THEN
  2044.             f$(i) = UCASE$(f$(i)) '                                   try uppercase (Linux cares!)
  2045.             IF _FILEEXISTS(f$(i)) = 0 THEN
  2046.                 z = z + 1
  2047.                 IF z = 1 THEN CLS
  2048.                 PRINT f$(i)
  2049.             END IF
  2050.         END IF
  2051.     END IF
  2052.     PRINT
  2053.     PRINT "Above file(s) missing"
  2054.     SLEEP
  2055.     SYSTEM
  2056.  
  2057. s& = VARSEG(p(0, 0))
  2058. o& = VARPTR(p(0, 0))
  2059. DEF SEG = s&
  2060. BLOAD "F1.dat", o&
  2061. z$ = "386C6C38" '                                                    degree symbol
  2062. FOR i = 0 TO 3
  2063.     p(0, i) = VAL("&H" + MID$(z$, i * 2 + 1, 2))
  2064.  
  2065. s& = VARSEG(p2(0, 0))
  2066. o& = VARPTR(p2(0, 0))
  2067. DEF SEG = s&
  2068. BLOAD "F2.dat", o&
  2069.  
  2070. canvas& = _NEWIMAGE(640, 350, 9)
  2071. SCREEN canvas&
  2072. _TITLE "Lander"
  2073. auto = 0 '                                                            full automatic
  2074. background = 1 '                                                      textured LED displays
  2075. cbh = 0 '                                                             constant black holes
  2076. darkstars = 1 '                                                       spin
  2077. darkstart = 1 '                                                       thickness of lines
  2078. demo = 0 '                                                            cram onto one page
  2079. doclock = 0 '                                                         shield effect
  2080. gh = 9
  2081. gs = 85 '                                                             graphics start
  2082. glmax = q4 '                                                          ground level max
  2083. glmin = glmax - 49 '                                                  ground level min
  2084. gs = 85 '                                                             graphics start (flying area)
  2085. 'gstyle = 5
  2086. invincible = 1 '                                                      easier for beginner, thrusters gold
  2087. jitter = 1 '                                                          thrust calc
  2088. LED$ = "021404120115" '                                               color sequence - gr ye re or gun wh
  2089. LEDc = green '
  2090. LEDtri = 0 '                                                          off
  2091. mdelay = t '                                                          master delay
  2092. opower = 62 '                                                         original thrust factor
  2093. pdiv = 0 '                                                            instrument update
  2094. radarf = 1
  2095. restart = 0 '                                                         shift-d load defaults
  2096. segs$ = "abcdefg" '                                                   for 7 segment displays
  2097. settings$ = "LANDER.SET"
  2098. shield = 0 '                                                          Star Trek!
  2099. showmap = 0 '                                                         silly legend at top
  2100. skyoff = 1 '                                                          DS, BH, Wo, Co
  2101. starfiles = 1 '                                                       dat1, dat2, dat3
  2102. starstatus = 1 '                                                      show stars only, no names/info
  2103. twinkle = 0
  2104. zoom = 1 '                                                            starfield 6 hours 45 degrees
  2105.  
  2106. black = 0: blue = 1: green = 2: gunmetal = 3: red = 4: gasoline = 5
  2107. gray2 = 6: white = 7: gray = 8: dred = 9: gold = 10: black2 = 11
  2108. orange = 12: blue2 = 13: yellow = 14: white2 = 15
  2109.  
  2110. craft = white: flame = yellow: fuel = gasoline: LEDc = green
  2111. LMci(0) = gray2 '                                                     ASO shifting colors
  2112. LMci(1) = gold
  2113. LMci(2) = gray2
  2114. LMci(3) = black2
  2115.  
  2116. IF _FILEEXISTS(settings$) THEN
  2117.     OPEN settings$ FOR INPUT AS #1
  2118.     INPUT #1, g$, auto
  2119.     INPUT #1, g$, background
  2120.     INPUT #1, g$, cbh
  2121.     INPUT #1, g$, demo
  2122.     INPUT #1, g$, doclock
  2123.     INPUT #1, g$, invincible
  2124.     INPUT #1, g$, jitter
  2125.     INPUT #1, g$, LEDc
  2126.     INPUT #1, g$, LEDtri
  2127.     INPUT #1, g$, radarf
  2128.     INPUT #1, g$, shield
  2129.     INPUT #1, g$, showmap
  2130.     INPUT #1, g$, starstatus
  2131.     INPUT #1, g$, zoom
  2132.     INPUT #1, g$, skyoff
  2133.     INPUT #1, g$, gstyle
  2134.     INPUT #1, g$, mouseswap
  2135.     INPUT #1, g$, porb
  2136.     INPUT #1, g$, starfiles
  2137.     INPUT #1, g$, mdelay
  2138.     INPUT #1, g$, fsf
  2139.     CLOSE #1
  2140. IF fsf THEN
  2141.  
  2142. FOR i = 0 TO tsix '                                                    table faster
  2143.     s!(i) = SIN(_D2R(i))
  2144.     c!(i) = COS(_D2R(i))
  2145.  
  2146. clines = 0
  2147. OPEN f$(1) FOR INPUT AS #1 '                                          convo.dat, LM/CM chatter
  2148.     clines = clines + 1
  2149.     LINE INPUT #1, convo$(clines)
  2150.  
  2151. s& = VARSEG(cmp&(0)) '                                                Command Module
  2152. o& = VARPTR(cmp&(0))
  2153. DEF SEG = s& '                                                        cm.dat
  2154. BLOAD f$(18), o&
  2155.  
  2156. IF (RND > .95) AND (okrick = 0) AND (INSTR(COMMAND$, "NOS") = 0) THEN MakeSur
  2157.  
  2158. start1! = TIMER
  2159.  
  2160. init2: '                                                              each cycle
  2161. a = 0 '                                                               angle
  2162. a51i = 0
  2163. ASO = 0 '                                                             ascent stage only = false
  2164. boltc = 0 '                                                           lightning count
  2165. center = 362
  2166. contact = 0 '                                                         with ground
  2167. convo = 0 '                                                           with CM
  2168. crash = 0
  2169. cut = 0 '                                                             engine
  2170. dump = 0 '                                                            fuel
  2171. eou = 0 '                                                             end of universe
  2172. fb$ = "" '                                                            landing feedback
  2173. flx = 0 '                                                             where to plot flag
  2174. fuel! = h
  2175. hover = 1 '                                                           start safe
  2176. ideal! = 2.7 '                                                        autopilot speed
  2177. inpause = 0
  2178. jf = -1 '                                                             jump to feature
  2179. LGMc = 1 '                                                            little green man color
  2180. lmsl = blue '                                                         LM shield & laser
  2181. lob = 0 '                                                             landed on Borg
  2182. lock1 = 0 '                                                           radar tracking
  2183. lockfuel = 0
  2184. ma = 0 '                                                              malfunction angle
  2185. magic = 0 '                                                           landing
  2186. mes$(0) = "" '                                                        messages ^ landing eval
  2187. mes$(1) = "" '                                                        radiation, landing comments
  2188. ok = 0 '                                                              landing status
  2189. panelinit = 0 '                                                       instruments
  2190. paraf = 0 '                                                           parachute flag
  2191. pif = -1 '                                                            counter for instruments
  2192. platform = 0 '                                                        for detached DS
  2193. power = opower '                                                      thrust factor
  2194. powerloss = 0 '                                                       random malfunction
  2195. px! = 320 '                                                           vehicle x
  2196. py! = 70 '                                                            vehicle y
  2197. radiationdeath = 0 '                                                  rads > 1000
  2198. rads = 0 '                                                            radiation count
  2199. rlink = 0 '                                                           LM/CM radio link
  2200. rmin = RND * 23 '                                                     stars right ascension 0 - 23
  2201. dmin = (INT(RND * 18) - 9) * t '                                      stars declination -90 to 90
  2202. sia = 0 '                                                             shells in air
  2203. sspinit1 = 0
  2204. sspinit2 = 0
  2205. starinit = 0
  2206. tfollow = 0 '                                                         terrain following
  2207. tmt! = 0 '                                                            to move total
  2208. wa = 0 '                                                              wanted angle
  2209. vert = 1 '                                                            vertical autopilot on
  2210. vsd = 0 '                                                             vehicle severely damaged
  2211.  
  2212. Setcolor
  2213. GetSurface gh
  2214.  
  2215. IF demo THEN
  2216.     auto = 0
  2217.     px! = sf(6, 2) - 3130 '                                           TMA
  2218.     py! = 130
  2219.     sf = 6 '                                                          surface feature
  2220.     suri = 3130 '                                                     surface index
  2221.     vx! = 0 '                                                         not moving
  2222.     vy! = 0
  2223.     a = RND + t
  2224.     IF RND > pf! THEN a = -a
  2225.     sf = 4
  2226.     suri = RND * q1
  2227.     px! = 320
  2228.     thrust! = 95
  2229.     vx! = SGN(a) * 5
  2230.     vy! = RND + 1
  2231.  
  2232. ERASE exv, ei, ek, rtl!, rtlc, shx, shd
  2233.  
  2234. mes$(0) = "F1 FOR HELP AND INFORMATION"
  2235. IF ufof > 0 THEN mes$(1) = "Alien on the loose!" '                    10% active
  2236. IF LEDtri THEN LEDc = green
  2237. GOSUB ReadLM
  2238. start2! = TIMER '                                                     elapsed time clock
  2239. sec = 0
  2240. min = 0
  2241.  
  2242. PlotGround:
  2243. IF crash = 0 THEN
  2244.     surd = SGN(tmt!) '                                                direction
  2245.     tomo = INT(ABS(tmt!)) '                                           to move
  2246.     IF tomo > (q3 - gs) THEN tomo = q3 - gs
  2247.     tmt! = tmt! - tomo * surd '                                       to move total
  2248.     suri = suri + tomo * surd '                                       surface index
  2249.     GOSUB slimit '                                                    limit values to 0-6399
  2250.          
  2251. IF gh = -1 THEN '                                                     ground height = flat
  2252.     LINE (gs, q4)-(q3, q4), gray
  2253.     GOTO stuff
  2254.  
  2255. FOR x = gs TO q3 '                                                    graphics start to 639
  2256.     z = (suri + x) MOD q1
  2257.     'IF showspeed THEN tc = gc(z) ELSE tc = gray
  2258.     tc = gray
  2259.     IF (z >= sf(5, 0)) AND (z <= sf(5, 1)) THEN
  2260.         PSET (x, glmax), tc '                                         optional McD fix
  2261.     ELSE
  2262.         IF (z >= sf(7, 0)) AND (z <= sf(7, 1)) THEN '                 Surveyor
  2263.             'y = gh(sf(7, 0))
  2264.             y = glmax
  2265.         ELSE
  2266.             y = gety(x)
  2267.         END IF
  2268.         SELECT CASE gstyle
  2269.             CASE IS = 0 '                                             solid
  2270.                 LINE (x, y)-(x, glmax), tc
  2271.             CASE IS = 5 '                                             solid
  2272.                 LINE (x, y)-(x, glmax), tc
  2273.             CASE IS = 1 '                                             fancy
  2274.                 LINE (x, glmax)-(x, y), black2
  2275.                 LINE -(x, glmax), tc, , z + y
  2276.                 PSET (x, y), tc
  2277.             CASE IS = 2
  2278.                 LINE (x, y)-(x, glmax), tc
  2279.                 ty = y + 5
  2280.                 IF ty < glmax THEN
  2281.                     LINE (x, ty)-(x, glmax - 1), black, , &HFEFE
  2282.                 END IF
  2283.             CASE ELSE '                                               minimal or tiling
  2284.                 LINE (x, glmax)-(x, y), black2
  2285.                 LINE -(x, y + 3), tc
  2286.         END SELECT
  2287.     END IF
  2288.  
  2289. IF gstyle > 3 THEN Tile
  2290.  
  2291. stuff:
  2292. FOR i = 1 TO t
  2293.     ' Surv before IBM+TMA, IBM before TMA, LGM last
  2294.     '              1 2 3 4 5 6 7 8 9 0
  2295.     j = VAL(MID$("01070802040506091003", (i - 1) * 2 + 1, 2))
  2296.     z = VAL(MID$("80000080000080000000", (j - 1) * 2 + 1, 2))
  2297.     fb = sf(j, 0) - z
  2298.     fe = sf(j, 1) + z
  2299.     c1 = (fe >= (suri + gs)) AND (fb <= (suri + q3))
  2300.     c2 = ((fe + q1) >= (suri + gs)) AND ((fb + q1) <= (suri + q3))
  2301.     IF c1 OR c2 THEN
  2302.         sf = 0
  2303.         IF sf(j, 2) = -1 THEN GOTO nf
  2304.         sf = j
  2305.         x = sf(sf, 0) - suri
  2306.         z = sf(sf, 1) - suri
  2307.  
  2308.         'w1 = sf(sf, 2) - suri - h '                                  show limits of landing at feature
  2309.         'w2 = sf(sf, 2) - suri + h
  2310.         'w3 = gety(w1)
  2311.         'w4 = gety(w2)
  2312.         'IF bbit THEN
  2313.         '    LINE (w1, w3)-(w1, w3 - t), green
  2314.         '    LINE (w2, w4)-(w2, w4 - t), green
  2315.         'END IF
  2316.         'LOCATE 3, 12: PRINT w1; w2; w3; w4;
  2317.  
  2318.         IF (j = 1) AND (x < 0) AND (suri > 3000) THEN x = x + q1: z = z + q1
  2319.         bolthitf = (skyoff = 0) AND (boltx >= x) AND (boltx <= z) AND (exl(1) <> 9999)
  2320.         IF j = 1 THEN
  2321.             Area51 f$(40)
  2322.             IF (cut = 0) AND (LEFT$(mes$(1), 7) = "AREA 51") THEN
  2323.                 GOSUB CutOrOutOfFuel
  2324.             END IF
  2325.         END IF
  2326.         IF j = 2 THEN CarWash
  2327.         IF j = 3 THEN LGM fc
  2328.         IF j = 4 THEN Volcano
  2329.         IF j = 5 THEN McD
  2330.         IF j = 6 THEN TMA
  2331.         IF j = 7 THEN Surveyor
  2332.         IF j = 8 THEN IBM
  2333.         IF j = 9 THEN Hollywood
  2334.         IF j = t THEN Grave x, fb$
  2335.     END IF
  2336.     nf:
  2337.  
  2338. CommandModule: '                                                      27 * 9
  2339. IF ek(0) = -1 THEN RETURN
  2340. cminview = 1
  2341. tx = localize(ex(0), 14, 14)
  2342. IF tx = 999 THEN cminview = 0: GOTO nocm
  2343. x1 = tx - 14
  2344. x2 = tx + 14
  2345.  
  2346. VIEW SCREEN(gs + 1, 0)-(q3, q4) '                                     protect panel
  2347. LINE (x1 + 0, 18)-(x1 + 26, 26), black2, BF
  2348. FOR z = 1 TO 27
  2349.     LINE (x1 + z, 17)-(x1 + z, 26), white, , cmp&(z)
  2350.  
  2351. CMshadow tx, x1, x2 '                                                 optional
  2352.  
  2353. sd! = ABS(exv(0)) - ABS(vx!) '                                        speed diff
  2354. dbc = ABS(px! - tx)
  2355.  
  2356. 'IF okrick AND (py! < h) THEN '                                       rendesvous assist
  2357. '    FOR z = -1 TO 1 STEP 2
  2358. '        tx2 = tx + z * 50
  2359. '        LINE (tx2, 18)-(tx2, 28), yellow
  2360. '        z! = INT(sd! * h) / h
  2361. '        z$ = STR$(z!)
  2362. '        TinyFont z$, tx - t, 33, yellow
  2363. '    NEXT z
  2364. 'END IF
  2365. '
  2366. IF (py! < h) AND (dbc < 50) AND (ABS(sd!) < .06) THEN
  2367.     rlink = t
  2368.     LINE (LMrx(1), LMry(1))-(tx + 8, 27), green, , RND * &H7FFF
  2369.     IF (cmleaving + convo) = 0 THEN
  2370.         mes$(0) = "Establishing link with Campbell soup cans and string"
  2371.         sct! = 2
  2372.         convo = 1
  2373.     END IF
  2374.     IF sc! = 0 THEN sc! = TIMER + sct! '                              start conversation in xs
  2375.     IF TIMER > sc! THEN
  2376.         convo = convo + 1
  2377.         IF convo > (clines + 1) THEN
  2378.             sc! = 0
  2379.             convo = 0
  2380.             cmleaving = 1
  2381.         ELSE
  2382.             mes$(0) = convo$(convo)
  2383.             sc! = TIMER + sct!
  2384.         END IF
  2385.     END IF
  2386.      
  2387. nocm:
  2388. rlink = rlink - 1 - (rlink = 0) '                                     allows brief radio interruption
  2389. IF rlink = 0 THEN '                                                   lost awhile ago
  2390.     IF convo THEN mes$(0) = " " '                                     clear current dialogue
  2391.     convo = 0 '                                                       stop conversation
  2392.     sc! = 0 '                                                         talk timer
  2393.  
  2394. IF cmleaving AND cminview THEN '                                      CM exhaust
  2395.     ty = 22
  2396.     LINE (x1, ty - 2)-(x1, ty + 2), yellow
  2397.     LINE -(x1 - 15, ty), yellow
  2398.     LINE -(x1, ty - 2), yellow
  2399.  
  2400. liftoff: '                                                            forced seperation or surface launch
  2401. IF (contact OR liftoff) AND (cwd < 69) AND (py! > 322) THEN
  2402.     dead$ = "HIT CAR WASH"
  2403.     RETURN
  2404.  
  2405. IF contact THEN vx! = 0
  2406. IF lob THEN vx! = exv(2): a = 0 '                                     landed on Borg
  2407.  
  2408. goy = -h '                                                            AS go y
  2409. IF ASO THEN '                                                         ascent stage only
  2410.     IF fuel! = 0 THEN RETURN
  2411.     thrust! = h
  2412.     falling = 0
  2413.     platform = 0
  2414.     IF lob THEN pminy = borgt
  2415.     power = opower
  2416.     thrust! = th '                                                    simulate explosive seperation
  2417.     platform = 22 '                                                   deflect flame from DS
  2418.     IF contact THEN
  2419.         falling = 0 '                                                 DS already on surface
  2420.     ELSE
  2421.         falling = 1 '                                                 DS in air
  2422.         goy = py! - 20 '                                              go y - not to screen top
  2423.     END IF
  2424.     LINE (gs, 30)-(q3, q4), 0, BF '                                   erase "space" area
  2425.     pminx = q1: pmaxx = -pminx
  2426.     pminy = q1: pmaxy = -pmaxy
  2427.     FOR i = 279 TO rp '                                               draw descent stage
  2428.         c = LMc(i)
  2429.         IF c < 0 THEN c = fuel
  2430.         PSET (LMrx(i), LMry(i)), c
  2431.         IF LMrx(i) < pminx THEN pminx = LMrx(i)
  2432.         IF LMrx(i) > pmaxx THEN pmaxx = LMrx(i)
  2433.         IF LMry(i) < pminy THEN pminy = LMry(i)
  2434.         IF LMry(i) > pmaxy THEN pmaxy = LMry(i)
  2435.     NEXT i
  2436.     GOSUB flevel
  2437.     IF platform > 0 THEN deflectat = pminy
  2438.     zz = pmaxy - pminy
  2439.     GET (pminx, pminy)-(pmaxx, pmaxy), gbuff() '                      save descent stage
  2440.     LINE (gs, 30)-(q3, q4), 0, BF '                                   erase "space" area
  2441.  
  2442.     ta = (a + tsix) MOD tsix
  2443.     px! = px! - t * s!(ta)
  2444.     py! = py! - 15 * c!(ta) '                                         explosive seperation
  2445.  
  2446. wASO = ASO
  2447. ASO = 1
  2448. GOSUB ReadLM
  2449. IF wASO = 0 THEN fuel! = h
  2450. IF vsd THEN LMdistort
  2451.  
  2452. IF contact THEN
  2453.     dropvx! = 0
  2454.     IF lob AND (ABS(px! - center) > 2) THEN dropvx! = exv(1)
  2455.     dropvy! = 0
  2456.     dropvx! = vx!
  2457.     dropvy! = vy!
  2458.  
  2459. IF lob OR (contact = 0) THEN
  2460.     wa = 0
  2461.     wa = SGN(-exv(0)) * 20 '                                          want angle
  2462.     IF wa = 0 THEN wa = -20
  2463.  
  2464. sauto = auto: auto = 1
  2465. contact = 0
  2466. cut = 0
  2467. dump = 0
  2468. hover = 0
  2469. liftoff = 1
  2470. lminx = pminx
  2471. lock1 = 0
  2472. lockfuel = 0
  2473. lpass = 0
  2474. IF wASO = 0 THEN ma = 0
  2475. mes$(0) = ""
  2476. mes$(1) = ""
  2477. np = 0
  2478. paraf = 0
  2479. pcontact = 0
  2480. powerloss = 0
  2481. psuri = suri
  2482. py! = py! - 2 '                                                       fool CheckHit
  2483. svert = vert
  2484. vert = 0
  2485.  
  2486. DO: _LIMIT mdelay * 1.5
  2487.     IF py! < 280 THEN GOSUB angle '                                   make a=wa (angle=wanted)
  2488.     GOSUB Plotscreen
  2489.     np = np + 1
  2490.     IF np >= t THEN GOSUB CheckHit
  2491.     z = (sy1 + sy2) / 2 - 2
  2492.     IF (deflectat > 0) AND (z > deflectat) AND (z > deflectat) THEN contact = 1
  2493.     IF contact THEN dead$ = "NOT YOUR DAY": EXIT DO
  2494.     lpass = lpass + 1
  2495.     IF thrust! = th THEN thrust! = h
  2496.     IF vsd THEN '                                                     very severe damage
  2497.         thrust! = h - (lpass + RND) '                                 slowly drop power
  2498.         IF thrust! < 50 THEN thrust! = 50 + RND
  2499.         IF RND > .95 THEN
  2500.             dead$ = "STRUCTURAL FAILURE"
  2501.             EXIT DO
  2502.         END IF
  2503.     END IF
  2504.     GOSUB KeyAndMouse
  2505.     IF LEN(dead$) THEN GOTO endl
  2506.     IF lob OR ((platform > 0) AND (falling = 1)) THEN
  2507.         pminx = pminx + dropvx!
  2508.         pmaxx = pmaxx + dropvx!
  2509.         pminy = pminy + dropvy!
  2510.         pmaxy = pmaxy + dropvy!
  2511.         IF lob = 0 THEN
  2512.             dropvy! = dropvy! + .6
  2513.             dropy! = gety(-(pminx + nx))
  2514.             IF pmaxy < dropy! THEN
  2515.                 lminx = pminx
  2516.                 lminy = dropy! - zz
  2517.                 deflectat = pminy
  2518.             ELSE
  2519.                 pminx = lminx
  2520.                 pminy = lminy
  2521.                 psuri = suri
  2522.                 pcontact = 1
  2523.                 falling = 0
  2524.             END IF
  2525.         END IF
  2526.     ELSE
  2527.         pminx = lminx + (psuri - suri)
  2528.     END IF
  2529.     IF cut THEN lpass = 0
  2530.     IF wASO THEN
  2531.         IF (py! <= goy) AND (cut = 0) THEN EXIT DO
  2532.     ELSE
  2533.         IF pcontact OR (pminx < gs) OR (pminx > 580) THEN EXIT DO
  2534.         IF (cut = 0) AND (py! <= goy) THEN
  2535.             hover = 1
  2536.             GOSUB Autopilot
  2537.             IF falling = 0 THEN EXIT DO
  2538.         END IF
  2539.     END IF
  2540. LOOP UNTIL (alt! > h) OR LEN(dead$)
  2541.  
  2542. endl:
  2543. auto = sauto
  2544. crash = 0
  2545. deflectat = 0
  2546. liftoff = 0
  2547. lock1 = 0
  2548. platform = 0
  2549. vert = svert
  2550.  
  2551. ReadLM:
  2552. LMbloads
  2553. IF ASO THEN '                                                         ascent stage only
  2554.     lp = 294
  2555.     nx = 16
  2556.     ny = 9
  2557.     rp = 302
  2558.     th1 = 170
  2559.     th2 = 198
  2560.     vmass = 60
  2561. ELSE '                                                                AS&DS 34*36
  2562.     lp = 696 '                                                        left pad
  2563.     nx = 17 '                                                         center x (for rotating)
  2564.     ny = 18 '                                                         center y
  2565.     rp = 705 '                                                        right pad
  2566.     th1 = 449 '                                                       left thruster
  2567.     th2 = 483 '                                                       right thruster
  2568.     vmass = h '                                                       full mass
  2569.  
  2570. nred = 0 '                                                            number red (volcanic heating)
  2571. temp = 0 '                                                            temperature
  2572. IF bw = 0 THEN PALETTE gasoline, 24
  2573. xp = 97 ' radar
  2574. wi = LMx(rp) - LMx(lp) + 1 '                                          width
  2575. wi2 = wi \ 2
  2576.  
  2577. IF invincible THEN c = gold ELSE c = gray '                           thruster color
  2578. FOR i = 1 TO rp
  2579.     LMx(i) = LMx(i) - nx
  2580.     LMy(i) = LMy(i) - ny
  2581.     IF (LMc(i) = gray) OR (LMc(i) = gold) THEN LMc(i) = c '           thrusters
  2582.     IF LMc(i) < 0 THEN LMc(i) = fuel '                                fuel
  2583.     LMoc(i) = LMc(i)
  2584. GOSUB LMcolors
  2585. ' --------------------------------------------------------------------------
  2586. d1:
  2587. DATA 27,"Elapsed time"
  2588. DATA 36,"Distance to McD"
  2589. DATA 45,"CPU"
  2590. DATA 54,"Rads/temperature"
  2591. DATA 86,"Fuel"
  2592. DATA 126,"Altitude"
  2593. DATA 166,"Horizontal velocity"
  2594. DATA 206,"Vertical velocity"
  2595. DATA 244,"Main thrust"
  2596. DATA 277,"Sideways thrust"
  2597. DATA 307,"Autopilot (full)"
  2598. DATA 322,"Hover control"
  2599. DATA 337,"Vertical automatic"
  2600.  
  2601. DATA "Scored on vertical & horizontal speed:"
  2602. DATA "0.00 - 0.50 Excellent"
  2603. DATA "0.51 - 1.00 Good"
  2604. DATA "1.01 - 2.00 Fair"
  2605. DATA "2.01 - 3.00 Poor"
  2606. DATA ""
  2607. DATA "Landing surface should be near flat,"
  2608. DATA with required ending angle under 5ø.
  2609. DATA ""
  2610. DATA Based on a 1974 program running on a
  2611. DATA DEC PDP/11 with GT40 vector display
  2612. DATA terminal at the University of Alberta.
  2613. DATA The graphic at top left is usually a Henon
  2614. DATA "plot, dealing with the stability of orbits."
  2615. DATA The face appearing in TMA-1 when it shoots
  2616. DATA "is Cybill Shepherd. If you land on TMA-1,"
  2617. DATA it displays a Mandelbrot. The semaphores
  2618. DATA "use proper flag positions, and the Morse"
  2619. DATA code in the McDonalds sign is real too.
  2620. DATA "Little Green Man can be turned into a pile"
  2621. DATA of ashes.  Beware the beach balls of IBM!
  2622. DATA ""
  2623. DATA F2 for a demo mode showing most features.
  2624. DATA ""
  2625. DATA "Esc or <: Back to Lander   > Next page"
  2626.  
  2627. d2:
  2628. DATA "ud        main thrust"
  2629. DATA "<>        side thrust/angle"
  2630. DATA "Shift ud  move up"
  2631. DATA "Shift <>  move left/right"
  2632. DATA "<>        ground back/forward"
  2633. DATA "space     abort/feature cycle"
  2634. DATA "Bkspace   random star position"
  2635. DATA "Esc       quit"
  2636. DATA "01234     stars off/on/info"
  2637. DATA "aA        autopilot on/off/McD"
  2638. DATA "b         goto Borg"
  2639. DATA "B         goto black hole"
  2640. DATA "c         cut engine"
  2641. DATA "C         clock(s) on/off"
  2642. DATA "d         dump fuel"
  2643. DATA "D         restart with defaults"
  2644. DATA "fF        fuel lock/unlimited"
  2645. DATA "G         new ground"
  2646. DATA "h         hover"
  2647. DATA "I         invincible mode"
  2648. DATA "k         kill (fire laser)"
  2649. DATA "wlemtsiHg goto surface feature"
  2650. DATA "L         level ground"
  2651. DATA "M         Magic landing!"
  2652. DATA "n         nation (flag)"
  2653. DATA "o         goto comet"
  2654. DATA "O         goto EPCOR"
  2655. DATA "p         pause"
  2656. DATA "P         parachute"
  2657. DATA "r         radar"
  2658. DATA "R         rendesvous with CM"
  2659. DATA "T         thrust accuracy"
  2660. DATA "u         instruments"
  2661. DATA "v         vertical automatic"
  2662. DATA "y         swap mouse buttons"
  2663. DATA "z         self-destruct"
  2664. DATA ".         terrain following"
  2665. DATA "F2        demo mode (compressed)"
  2666. DATA "F3        sky features"
  2667. DATA "F4        constant black holes"
  2668. DATA "F5        panel/instruments"
  2669. DATA "F6        drop descent stage"
  2670. DATA "F7        map at top"
  2671. DATA "F8        shields (uses fuel)"
  2672. DATA "F9/F10    LED color/tri-color"
  2673. DATA "PgDn/Up   slower/faster"
  2674. DATA "< Previous page   > Next page"
  2675.  
  2676. d3:
  2677. DATA "/  green/b&w/regular screen"
  2678. DATA "+  zoom in starfield"
  2679. DATA "-  zoom out starfield"
  2680. DATA "\  drop bomb"
  2681. DATA ".  terrain following"
  2682. DATA "_  star twinkle"
  2683. DATA "j  DeathStar rotation"
  2684. DATA "|  generate all star files (hours!)"
  2685. DATA "x  more/less starfiles"
  2686. DATA "X  regenerate current star file"
  2687. DATA "Q  oscar (LGM flag colors)"
  2688. DATA "=  show LM data"
  2689. DATA "[  crude black & white"
  2690. DATA "]  UFO toggle"
  2691. DATA "U  ground tiling style"
  2692. DATA "ctrl-c or -s: SCREEN capture"
  2693. DATA "alt-Enter: fullscreen toggle"
  2694. DATA ""
  2695. DATA "< Previous page   > Next page"
  2696.  
  2697. d4:
  2698. DATA "      Programmed by:   R. Frost"
  2699. DATA "                       Edmonton, Alberta, Canada"
  2700. DATA ""
  2701. DATA "                       rfrost@mail.com "
  2702. DATA ""
  2703. DATA ""
  2704. DATA " 1) 2001 A Space Odyssey: TMA-1, HAL, CM/LM chatter"
  2705. DATA " 2) Star Trek: warp messages, phasers, shield, Borg"
  2706. DATA " 3) Lost in Space: black hole warning"
  2707. DATA " 4) Southpark: black hole at 3:50 (Tree-fiddy! - Chef)"
  2708. DATA " 5) Simpsons: LGM saying he has semaphore flags"
  2709. DATA " 6) Rocky & Bullwinkle: a hall of Montezuma (car wash)"
  2710. DATA " 7) Bonanza: car wash traverse generates a Hop Sing quote"
  2711. DATA " 8) SCTV: CM/LM chatter"
  2712. DATA " 9) a McDonalds on the Moon, and an instrument for it"
  2713. DATA "10) Little Green Man wiggles ears & reacts to LM exhaust"
  2714. DATA "11) pirate books & movies: CM/LM chatter"
  2715. DATA "12) Command Module leaves you stranded"
  2716. DATA "13) a Steve Martin quote precedes black hole death"
  2717. DATA "14) half the time the USSR flag is planted"
  2718. DATA "15) Cybil Shepherd's face appears in TMA-1 when it fires"
  2719. DATA "16) Halley's Comet is renamed Halle Berry"
  2720. DATA "17) digital, analog, and binary clocks!"
  2721. DATA "18) End Of The Universe is signaled by Chicken Little"
  2722. DATA "19) Mt. Etna spews volcanic cheese"
  2723. DATA "20) a parachute that doesn't work in a vacuum"
  2724. DATA "21) Area 51 is the first level landing zone"
  2725. DATA "22) IBM weapon is a fishing float or beach ball"
  2726. DATA ""
  2727. DATA "< Previous page   Esc or >: Back to Lander"
  2728.  
  2729. leds:
  2730. DATA a,0,-2,1,-2
  2731. DATA b,1,-2,1,-1
  2732. DATA c,1,-1,1,0
  2733. DATA d,0,0,1,0
  2734. DATA e,0,-1,0,0
  2735. DATA f,0,-2,0,-1
  2736. DATA g,0,-1,1,-1
  2737.        
  2738. DATA 0,abcdef,1,bc,2,abged,3,abgcd,4,fgbc,5,acdfg,6,acdefg,7,abc,8,abcdefg,9,abcdfg,10,g,11,def
  2739.  
  2740. features:
  2741. '               x   y  lz
  2742. DATA "Area 51",65,40,45
  2743. DATA "Car Wash",100,44,130
  2744. DATA "Little Green Man",12,0,70
  2745. DATA "Etna",10,49,20
  2746. DATA "McDonalds",38,0,80
  2747. DATA "TMA-1",45,71,80
  2748. DATA "Surveyor",28,0,80
  2749. DATA "IBM",50,45,90
  2750. DATA "Hollywood",170,0,0
  2751. DATA "a grave",68,49,98
  2752.  
  2753. MorseData:
  2754. DATA a,.-,b,-...,c,-.-.,d,-..,e,.,f,..-.,g,--.
  2755. DATA h,....,i,..,j,.---,k,-.-,l,.-..,m,--,n,-.
  2756. DATA o,---,p,.--.,q,--.-,r,-.-,s,...,t,-,u,..-
  2757. DATA v,...-,w,.--,x,-..-,y,-.--,z,--..,1,.----,2,..---
  2758. DATA 3,...--,4,....-,5,.....,6,-...,7,--..,8,---..,9,----.
  2759. DATA 0,-----,!,..--.,$,...-..-,&,.-...
  2760.  
  2761. warp:
  2762. DATA "The Rockwell warranty is now void"
  2763. DATA "Hope we don't collide with Klingons!"
  2764. DATA "You need a vacation, Jim!  - Bones!"
  2765. DATA "It's a long way to Tipperary!"
  2766. DATA "Do we know this universe?  - Spock"
  2767. DATA "My miniskirt is getting shorter! - Uhuru"
  2768. DATA "Da engines kanna tayke much more! - Scotty"
  2769. DATA "Keptin, are you insane? - Chekhov"
  2770. DATA "Hit 10 and we die!"
  2771.  
  2772. radcomments:
  2773. DATA "has caused genetic damage"
  2774. DATA "causes glowing in the dark"
  2775. DATA "5 years"
  2776. DATA "1 year"
  2777. DATA "6 months"
  2778. DATA "1 month"
  2779. DATA "1 week"
  2780. DATA "8 hours"
  2781. DATA "5 minutes"
  2782. DATA "has killed you - press Esc"
  2783.  
  2784. skycrud:
  2785. DATA CM,14,14
  2786. DATA DS,150,150
  2787. DATA BO,58,46
  2788. DATA BH,200,200
  2789. DATA Wo,90,90
  2790. DATA Co,20,100
  2791. DATA AL,40,40
  2792. DATA ZZ,1,1
  2793.  
  2794. semadata:
  2795. DATA a 1,225,180
  2796. DATA b 2,270,180
  2797. DATA c 3,315,180
  2798. DATA d 4,0,180
  2799. DATA e 5,180,45
  2800. DATA f 6,180,90
  2801. DATA g 7,180,135
  2802. DATA h 8,270,225
  2803. DATA i 9,225,315
  2804. DATA j,0,90
  2805. DATA k 0,225,0
  2806. DATA l,225,45
  2807. DATA m,225,90
  2808. DATA n,225,135
  2809. DATA o,270,315
  2810. DATA p,270,0
  2811. DATA q,270,45
  2812. DATA r,270,90
  2813. DATA s,270,135
  2814. DATA t,315,0
  2815. DATA u,315,45
  2816. DATA v,0,135
  2817. DATA w,45,90
  2818. DATA x,45,135
  2819. DATA y,315,90
  2820. DATA z,135,90
  2821. DATA " ",180,180
  2822. DATA !,0,0
  2823.  
  2824. say:
  2825. DATA "The time is 1234"
  2826. DATA "Welcome to the Moon"
  2827. DATA "I am a little green man"
  2828. DATA "I have semaphore flags"
  2829. DATA "R Frost is a nerd!"
  2830. DATA "abcdefghijklmnopqrstuvwxyz"
  2831.  
  2832. BigM: '                                                               37 * 16
  2833. DATA "          X               X          "
  2834. DATA "         X X             X X         "
  2835. DATA "        X   X           X   X        "
  2836. DATA "       X     X         X     X       "
  2837. DATA "      X       X       X       X      "
  2838. DATA "     X         X     X         X     "
  2839. DATA "     X         X     X         X     "
  2840. DATA "    X           X   X           X    "
  2841. DATA "    X           X   X           X    "
  2842. DATA "   X             X X             X   "
  2843. DATA "   X             X X             X   "
  2844. DATA "  X              XXX              X  "
  2845. DATA " X                                 X "
  2846. DATA " X                                 X "
  2847. DATA "X                                   X"
  2848. DATA "X                                   X"
  2849. '     1234567890123456789012345678901234567
  2850. '              1         2         3
  2851. tinyfontd:
  2852. DATA 0,7,5,5,5,7
  2853. DATA 1,2,6,2,2,7
  2854. DATA 2,7,1,7,4,7
  2855. DATA 3,7,1,7,1,7
  2856. DATA 4,5,5,7,1,1
  2857. DATA 5,7,4,7,1,7
  2858. DATA 6,7,4,7,5,7
  2859. DATA 7,7,1,1,1,1
  2860. DATA 8,7,5,7,5,7
  2861. DATA 9,7,5,7,1,7
  2862. DATA .,0,0,0,0,2
  2863. DATA -,0,0,1,0,0
  2864. DATA ":",0,2,0,2,0
  2865. DATA " ",0,0,0,0,0
  2866.  
  2867. '2010 :
  2868. 'DATA ALL THESE WORLDS
  2869. 'DATA ARE YOURS EXCEPT
  2870. 'DATA EUROPA
  2871. 'DATA ATTEMPT NO
  2872. 'DATA LANDING THERE
  2873. 'DATA USE THEM TOGETHER
  2874. 'DATA USE THEM IN PEACE
  2875.  
  2876. lmshow:
  2877. FOR pass = 1 TO 2
  2878.     CLS
  2879.     FOR i = 1 TO rp
  2880.         x = (LMx(i) + 17 - ASO) * 16 + 30 + (pass = 2)
  2881.         y = (LMy(i) + 18 - ASO * 9) * 8 + t
  2882.         IF pass = 1 THEN z$ = LTRIM$(STR$(LMc(i))) ELSE z$ = RIGHT$("  " + STR$(i), 3)
  2883.         IF LEN(z$) = 1 THEN z$ = "0" + z$
  2884.         c = LMc(i)
  2885.         TinyFont z$, x + 3, y + 3, c
  2886.     NEXT i
  2887.     FOR i = 1 TO 35 '                                                 line of numbers at top
  2888.         z$ = RIGHT$(" " + LTRIM$(STR$(i)), 2)
  2889.         TinyFont z$, (i - 1) * 16 + 33, 4, gray
  2890.         x = (i - 1) * 16 + 30 + 16
  2891.         LINE (x, 0)-(x, 320), red
  2892.     NEXT i
  2893.     FOR i = 1 TO 36 '                                                 columb of numbers at left
  2894.         z$ = RIGHT$(" " + LTRIM$(STR$(i)), 2)
  2895.         TinyFont z$, 8, i * 8 + 13, gray
  2896.         y = i * 8 + t + 8 + 1
  2897.         LINE (0, y)-(q3, y), red
  2898.     NEXT i
  2899.     LINE (0, 0)-(q3, 320), red, B
  2900.     _DISPLAY
  2901.     SLEEP
  2902. NEXT pass
  2903. ' -------------------------------------------------------------------------------------------------------x
  2904. SUB mHelp
  2905.     VIEW: CLS
  2906.     hp = 1
  2907.     DO
  2908.         CLS
  2909.         IF hp = 1 THEN GOSUB Help1
  2910.         IF hp = 2 THEN GOSUB Help2
  2911.         IF hp = 3 THEN GOSUB Help3
  2912.         IF hp = 4 THEN GOSUB credits
  2913.         timemachine
  2914.         DO: _LIMIT 30
  2915.             i$ = INKEY$
  2916.         LOOP UNTIL LEN(i$)
  2917.         IF LEN(i$) = 1 THEN k = ASC(i$) ELSE k = ASC(RIGHT$(i$, 1))
  2918.         hp = hp + (k = 75) - (k = 77)
  2919.         IF (k = 27) OR (hp < 1) OR (hp > 4) THEN EXIT DO
  2920.     LOOP
  2921.     CLS
  2922.     EXIT SUB
  2923.     ' --------------------------------------------------------------------------
  2924.     ReadAndReplace:
  2925.     READ z$
  2926.     z = INSTR(z$, "ground")
  2927.     p = INSTR(z$, "<"): IF (p > 0) AND (z = 0) THEN MID$(z$, p, 1) = CHR$(27)
  2928.     p = INSTR(z$, ">"): IF (p > 0) AND (z = 0) THEN MID$(z$, p, 1) = CHR$(26)
  2929.     RETURN
  2930.     ' --------------------------------------------------------------------------
  2931.     Help1:
  2932.     RESTORE d1
  2933.     REDIM gbuff2(8000)
  2934.     s& = VARSEG(gbuff2(0))
  2935.     o& = VARPTR(gbuff2(0))
  2936.     DEF SEG = s&
  2937.     BLOAD "PANEL.DAT", o&
  2938.     PUT (0, 0), gbuff2(0)
  2939.     REDIM gbuff2(0)
  2940.     LINE (85, 0)-(260, q4), gray, BF
  2941.     FOR i = 1 TO 13 '                                                 define the panel first
  2942.         READ ty, z$
  2943.         IF i < 5 THEN
  2944.             sprint2 z$, 90, ty, white, 0
  2945.         ELSE
  2946.             IF i = 9 THEN z$ = CHR$(24) + CHR$(25) + z$ '             up & down arrow keys
  2947.             IF i = 10 THEN z$ = CHR$(27) + CHR$(26) + z$ '            left & right arrow keys
  2948.             sprint z$, 90, ty, white, 0
  2949.             IF (i = 9) OR (i = 10) THEN sprint LEFT$(z$, 2), 90, ty, red, 0
  2950.             IF i > 10 THEN sprint LEFT$(z$, 1), 90, ty, red, 0
  2951.         END IF
  2952.     NEXT i
  2953.     LINE (261, 0)-(639, q4), blue2, BF '                              summary of program
  2954.     ty = 11: c = white
  2955.     FOR i = 1 TO 25
  2956.         GOSUB ReadAndReplace
  2957.         p = INSTR(z$, "*auto")
  2958.         IF p THEN qm$ = CHR$(34): MID$(z$, p, 6) = qm$ + "auto" + qm$
  2959.         sprint z$, 275, ty, c, 0
  2960.         ty = ty + 9 - (z$ <> "") * 5
  2961.     NEXT i
  2962.     RETURN
  2963.     ' --------------------------------------------------------------------------
  2964.     Help2:
  2965.     RESTORE d2
  2966.     c1 = gray
  2967.     c2 = black
  2968.     z$ = "KEYBOARD COMMANDS"
  2969.     GOSUB pageprep
  2970.     tx = 40: ty = 26
  2971.     FOR i = 1 TO 46
  2972.         GOSUB ReadAndReplace
  2973.         p = INSTR(z$, "ud")
  2974.         IF p THEN MID$(z$, p, 2) = CHR$(24) + CHR$(25)
  2975.         IF i = 3 THEN MID$(z$, 8, 1) = " "
  2976.         e = INSTR(z$, "main t") + INSTR(z$, "side t")
  2977.         IF e THEN c = green ELSE c = white
  2978.         IF INSTR("ahv", LEFT$(z$, 1)) THEN c = gasoline
  2979.         sprint2 z$, tx, ty, c, 0
  2980.         ty = ty + 11: IF ty > 276 THEN tx = 340: ty = 26
  2981.     NEXT i
  2982.     LINE (50, 300)-(585, 300), 0
  2983.     LINE (55, 302)-(590, 302), 0
  2984.     GOSUB ReadAndReplace
  2985.     sprint2 "When landed or paused, arrow keys move stars", 135, 282, white, 0
  2986.     ty = 310
  2987.     sprint z$, 350, ty, white, 0
  2988.     sprint "essential", 50, ty, green, 0
  2989.     sprint "other flight", 150, ty, gasoline, 0
  2990.     RETURN
  2991.  
  2992.     Help3:
  2993.     RESTORE d3
  2994.     c1 = gray
  2995.     c2 = black
  2996.     z$ = "MORE KEYBOARD COMMANDS"
  2997.     GOSUB pageprep
  2998.     tx = 200: ty = 36: c2 = blue
  2999.     FOR i = 1 TO 19
  3000.         GOSUB ReadAndReplace
  3001.         IF i = 19 THEN ty = 310: c2 = black
  3002.         sprint z$, tx, ty, white, c2
  3003.         ty = ty + 15
  3004.     NEXT i
  3005.  
  3006.     LINE (50, 300)-(585, 300), 0
  3007.     LINE (55, 302)-(590, 302), 0
  3008.     RETURN
  3009.     ' --------------------------------------------------------------------------
  3010.     credits:
  3011.     RESTORE d4
  3012.     c1 = dred
  3013.     c2 = white
  3014.     z$ = "AUTHOR & HUMOUR SUMMARY"
  3015.     GOSUB pageprep: x1 = 86: ty = 40
  3016.     FOR i = 1 TO 30
  3017.         GOSUB ReadAndReplace
  3018.         IF i = 30 THEN
  3019.             x1 = 320 - LEN(z$) * 4 - 8
  3020.             x2 = 320 + LEN(z$) * 4 + 8
  3021.             ty = 330
  3022.             LINE (x1, ty)-(x2, ty + 11), dred, BF
  3023.         END IF
  3024.         sprint2 z$, x1 + 8, ty, c2, 0
  3025.         ty = ty + t
  3026.     NEXT i
  3027.     RETURN
  3028.     ' --------------------------------------------------------------------------
  3029.     pageprep:
  3030.     CLS: PAINT (1, 1), c1
  3031.     x1 = 30: y1 = 5: x2 = 610: y2 = 345
  3032.     FOR q = 2 TO 20 STEP 4
  3033.         LINE (x1 - q, y1 + q)-(x2 + q, y2 - q), c1, B
  3034.         LINE (x1 - q + 1, y1 + q + 1)-(x2 + q + 1, y2 - q + 1), c2, B
  3035.     NEXT q
  3036.     z = LEN(z$) + 2: x1 = 320 - z * 4: x2 = 320 + z * 4
  3037.     LINE (x1, 9)-(x2, 22), c1, BF
  3038.     sprint z$, x1 + 8, t, white, -c2
  3039.     RETURN
  3040. ' -------------------------------------------------------------------------------------------------------x
  3041. SUB sprint (z$, tx, ty, c1, c2) '                                     VGA font
  3042.     FOR i = 1 TO LEN(z$)
  3043.         d = ASC(MID$(z$, i, 1))
  3044.         IF d = 248 THEN d = 0 '                                       degree symbol
  3045.         x = tx + (i - 1) * 8
  3046.         FOR byte = 0 TO 13
  3047.             y = ty + byte
  3048.             p& = (p(d, byte) AND 255) * 128
  3049.             IF c2 >= 0 THEN LINE (x + 1, y)-(x + 8, y), c2, , p&
  3050.             LINE (x, y)-(x + 7, y), c1, , p&
  3051.         NEXT byte
  3052.     NEXT i
  3053. ' -------------------------------------------------------------------------------------------------------x
  3054. SUB sprint2 (c$, tx, ty, c1, c2) '                                    CGA font
  3055.     FOR i = 1 TO LEN(c$)
  3056.         d = ASC(MID$(c$, i, 1))
  3057.         IF d = 248 THEN d = 0 '                                       degree symbol
  3058.         FOR k = 0 TO 7
  3059.             tx2 = tx + (i - 1) * 8 + k
  3060.             ty2 = ty + 2
  3061.             p& = p2(d, k)
  3062.             IF c2 >= 0 THEN
  3063.                 LINE (tx2 + 1, ty2 + 1)-(tx2 + 1, ty2 + 9), c2, , p&
  3064.             END IF
  3065.             LINE (tx2, ty2)-(tx2, ty2 + 8), c1, , p&
  3066.         NEXT k
  3067.     NEXT i
  3068. ' -------------------------------------------------------------------------------------------------------x
  3069. SUB AuHoVe (auto, hover, vert, lam)
  3070.     FOR i = 0 TO 2
  3071.         z$ = MID$(" AUTOHOVER VERT", i * 5 + 1, 5)
  3072.         IF i = 0 THEN k = auto
  3073.         IF i = 1 THEN k = hover
  3074.         IF i = 2 THEN k = vert
  3075.  
  3076.         ty = 307 + i * 15
  3077.         PrintCGA z$, 4, ty, gunmetal, black2, 0
  3078.  
  3079.         IF k THEN
  3080.             c1 = green
  3081.             c2 = black2
  3082.         ELSE
  3083.             c1 = black2
  3084.             c2 = red
  3085.         END IF
  3086.  
  3087.         IF crash THEN c1 = black2: c2 = black2
  3088.  
  3089.         IF lam AND k AND (i = 0) THEN c1 = gold '                     land at McD
  3090.  
  3091.         PrintCGA "ON ", 57, ty - 4, c1, -1, 0
  3092.  
  3093.         '                                                             blink OFF to indicate a keyboard command turned it off
  3094.         IF (i = 0) AND (APdisengage > 0) AND (c2 = red) THEN
  3095.             c2 = (APdisengage MOD 2) * red
  3096.             APdisengage = APdisengage - 1
  3097.         END IF
  3098.         PrintCGA "OFF", 57, ty + 3, c2, -1, 0
  3099.  
  3100.         tx1 = 48: ty1 = ty + 5 '                                      switches
  3101.         IF i = 1 THEN c = blue2 ELSE c = blue '                       background
  3102.         IF k THEN ta = 285 ELSE ta = 75 '                             up & down angles
  3103.         tx2 = tx1 + 5 * c!(ta)
  3104.         ty2 = ty1 + 5 * s!(ta)
  3105.         FOR k = 0 TO 1
  3106.             LINE (tx1 + 2, ty1)-(tx2 + k + 2, ty2), white '           plot switch
  3107.         NEXT k
  3108.         LINE (tx1 + 1, ty1)-(tx2 + 1, ty2), black2 '                  outline left
  3109.         LINE (tx1 + 3, ty1)-(tx2 + 4, ty2), black2 '                  outline right
  3110.     NEXT i
  3111. ' -------------------------------------------------------------------------------------------------------x
  3112. SUB Bar (xdat!, cl)
  3113.     xmax = gs - t '                                                   graphics start - ten
  3114.     xmin = xmax - 50
  3115.     ymax = 273 - osc * 39
  3116.     ymin = ymax - t
  3117.     'xcen = xmin + (xmax - xmin) / 2 '                                center line
  3118.     xbar = xmin + xdat! * (xmax - xmin) '                             data
  3119.     IF xbar < xmin THEN xbar = xmin '                                 limit min
  3120.     IF xbar > xmax THEN xbar = xmax '                                 limit max
  3121.  
  3122.     IF porb THEN '                                                    led bar
  3123.         IF LEDtri = 0 THEN c = LEDc
  3124.         IF cl THEN '                                                  center line
  3125.             LINE (xbar - 1, ymin + 4)-(xbar + 1, ymin + 7), c, BF
  3126.         ELSE
  3127.             LINE (xmin, ymin + 5)-(xbar, ymin + 7), c, BF
  3128.         END IF
  3129.     ELSE '                                                            mechanical pointer
  3130.         IF (osc = 4) AND (radarf = 0) THEN '                          altitude with radar off
  3131.             tc1 = gray
  3132.             tc2 = black
  3133.         ELSE '                                                        normal
  3134.             tc1 = white
  3135.             tc2 = white
  3136.         END IF
  3137.         LINE (xbar, ymin + 4)-(xbar - 4, ymin + 8), tc1
  3138.         LINE -(xbar + 4, ymin + 8), tc1
  3139.         LINE -(xbar, ymin + 4), tc1
  3140.         PAINT (xbar, ymin + 5), tc2, tc1
  3141.     END IF
  3142. ' -------------------------------------------------------------------------------------------------------x
  3143. SUB BlackHole (freeze) STATIC
  3144.     IF ei(3) = 0 THEN
  3145.         DIM tc(2)
  3146.         ei(3) = 1
  3147.         l! = aspect!
  3148.         tx = 30 + RND * 40
  3149.         IF RND > .7 THEN tx = tx + RND * h
  3150.         IF RND > .7 THEN tx = tx + RND * h '                          intentional repeat
  3151.         v! = tx / l!
  3152.         s1! = l! / t: r = RND * 90: ri = RND * 8 + 2
  3153.         bc = bc + 1 + (bc = 6) * 7
  3154.         z$ = "020105040906010613070603091301070605121404" '           colors
  3155.         FOR i = 0 TO 2
  3156.             tc(i) = VAL(MID$(z$, bc * 6 + i * 2 + 1, 2))
  3157.         NEXT i
  3158.         d1 = RND * 2 + 1
  3159.         d2 = RND * 2 + 1
  3160.     END IF
  3161.  
  3162.     x0 = localize(ex(3), 0, 0)
  3163.     y0 = ey(3)
  3164.  
  3165.     tri = ri
  3166.     IF freeze THEN tri = tri \ 2 '                                    rotation increment
  3167.     r = (r + tri) MOD tsix '                                           rotation
  3168.     dtlt! = -30 - 30 * ABS(c!((r * 3 + 50) MOD tsix)) '                tilt
  3169.     dtlti = (dtlt! + tsix) MOD tsix
  3170.     crot! = c!(r)
  3171.     srot! = s!(r)
  3172.     ctlt! = c!(dtlti) / d1
  3173.     stlt! = s!(dtlti) / d2
  3174.     co = (co + 1) MOD tsix
  3175.  
  3176.     bhx = 0: bhy = bhx
  3177.     FOR pass = 0 TO 1 '                                               90 degrees apart
  3178.         FOR za! = -l! TO l! STEP s1!
  3179.             pd = 0 '                                                  pen up
  3180.             FOR zb! = -l! TO l! STEP s1!
  3181.                 x1! = za!
  3182.                 y1! = zb!
  3183.                 IF pass THEN SWAP x1!, y1!
  3184.                 x! = x1! * crot! + y1! * srot!
  3185.                 y! = y1! * crot! - x1! * srot!
  3186.                 q! = -.8 / (x1! * x1! + y1! * y1!) + .8
  3187.                 z! = q! * ctlt! - y! * stlt!
  3188.                 y! = y! * ctlt! + q! * stlt!
  3189.                 s! = (l! * 2) / ((l! * 2) + y!)
  3190.                 xx = x0 + x! * v! * s!
  3191.                 yy = y0 - z! * v! * s!
  3192.                 x! = za! * 1.8: x! = x! * x!
  3193.                 y! = zb! * 1.8: y! = y! * y!
  3194.                 tc = tc((x! + y! + co) MOD 3)
  3195.                 IF pd THEN LINE -(xx, yy), tc ELSE PSET (xx, yy)
  3196.                 c1 = (xx > -120) AND (xx < 770)
  3197.                 c2 = (yy > -120) AND (yy < 470)
  3198.                 IF c1 AND c2 THEN '                                   on screen
  3199.                     bh = 1
  3200.                     IF (ABS(za!) < .1) AND (yy > bhy) THEN
  3201.                         bhx = xx
  3202.                         bhy = yy
  3203.                     END IF
  3204.                 END IF
  3205.                 pd = 1 '                                              pen down
  3206.             NEXT zb!
  3207.         NEXT za!
  3208.     NEXT pass
  3209. ' -------------------------------------------------------------------------------------------------------x
  3210. SUB BlackHoleDoom '                                                   fall in while shrinking
  3211.     fb$ = "" '                                                        silence feedback, if any
  3212.     sgs = gs '                                                        save graphics start (going to kill panel here)
  3213.     gs = 0 '                                                          kills panel
  3214.     VIEW
  3215.     DIM LMxi!(q2), LMyi!(q2)
  3216.     FOR i = 1 TO rp '                                                 rp=right pad (end of LM data)
  3217.         LMxi!(i) = (exl(3) - LMrx(i)) / 50
  3218.         LMyi!(i) = ((ey(3) + bhy) \ 2 - LMry(i)) / 50
  3219.     NEXT i
  3220.     FOR pass = 1 TO 50
  3221.         CLS
  3222.         mes$(0) = "Let's get SMALL! - Steve Martin"
  3223.         FOR i = 1 TO rp
  3224.             x = LMrx(i) + LMxi!(i) * pass
  3225.             y = LMry(i) + LMyi!(i) * pass
  3226.             c = LMc(i)
  3227.             IF (c = gasoline) AND (RND > pf!) THEN c = 0
  3228.             PSET (x, y), c
  3229.         NEXT i
  3230.         GOSUB ibd
  3231.         wu! = TIMER + .1
  3232.         DO: _LIMIT mdelay
  3233.             GOSUB ibd
  3234.             i$ = INKEY$
  3235.             IF (i$ = "q") OR (i$ = CHR$(27)) THEN Quit
  3236.         LOOP UNTIL TIMER > wu!
  3237.     NEXT pass
  3238.     mes$(0) = dead$
  3239.     mes$(1) = ""
  3240.     gs = sgs
  3241.     EXIT SUB
  3242.  
  3243.     ibd:
  3244.     Info
  3245.     BlackHole 1
  3246.     timemachine
  3247.     RETURN
  3248. ' -------------------------------------------------------------------------------------------------------x
  3249. SUB CMshadow (tx2, x1, x2)
  3250.     z = (TIMER MOD 17) + 1 '                                          rotation 1
  3251.     IF z < t THEN
  3252.         LINE (tx2 - 4, 17 + z)-(tx2 - 1, 17 + z), white
  3253.     END IF
  3254.     z = ((z + 8) MOD 17) + 1 '                                        rotation 2
  3255.     IF z < t THEN
  3256.         LINE (tx2 + 6, 17 + z)-(tx2 + 8, 17 + z), white
  3257.     END IF
  3258.     FOR tx = x1 TO x2 '                                               shadow
  3259.         FOR ty = 17 TO 26
  3260.             pp = POINT(tx, ty)
  3261.             zx = tx - x1 - (x2 - x1) \ 2
  3262.             zy = ty - 22
  3263.             IF (pp = white) AND (zy > (zx + 4)) THEN PSET (tx, ty), gray2
  3264.         NEXT ty
  3265.     NEXT tx
  3266. ' -------------------------------------------------------------------------------------------------------x
  3267. FUNCTION dcolor (v!, z1, z2, d) '                                     determine color for various displays
  3268.     dcolor = LEDc '                                                   normal
  3269.     IF liftoff = 0 THEN
  3270.         tv! = ABS(v!)
  3271.         IF d = 1 THEN '                                               problem higher
  3272.             IF tv! > z1 THEN dcolor = yellow '                        warning
  3273.             IF tv! > z2 THEN dcolor = red '                           serious warning
  3274.         ELSE '                                                        problem lower
  3275.             IF tv! < z1 THEN dcolor = yellow '                        warning
  3276.             IF tv! < z2 THEN dcolor = red '                           serious warning
  3277.         END IF
  3278.     END IF
  3279. ' -------------------------------------------------------------------------------------------------------x
  3280. SUB Evaluate (savea, z) '                                             landing analysis
  3281.     IF (ABS(z) > 4) AND (crash = 0) THEN
  3282.         IF ABS(savea) > 4 THEN
  3283.             z$ = "contact angle " + LTRIM$(STR$(-savea)) + CHR$(248)
  3284.             GOSUB tackon
  3285.         END IF
  3286.         IF ABS(z) > 4 THEN
  3287.             z$ = "ending angle " + LTRIM$(STR$(-(z))) + CHR$(248)
  3288.             GOSUB tackon
  3289.         END IF
  3290.     END IF
  3291.  
  3292.     IF ABS(vx!) > 3 THEN z$ = "horizontal velocity": GOSUB tackon
  3293.     IF ABS(vy!) > 3 THEN z$ = "vertical velocity": GOSUB tackon
  3294.     ok = -(LEN(fb$) = 0)
  3295.     z! = ABS(vx!)
  3296.     IF (z! <= 3) AND (vy! <= 3) THEN score = 5: z$ = "Poor"
  3297.     IF (z! <= 2) AND (vy! <= 2) THEN score = 4: z$ = "Fair"
  3298.     IF (z! <= 1) AND (vy! <= 1) THEN score = 3: z$ = "Good"
  3299.     IF (z! <= pf!) AND (vy! <= pf!) THEN score = 2: z$ = "Excellent"
  3300.     IF (z! < .1) AND (vy! < .1) THEN score = 1: z$ = "Fantastic"
  3301.     IF magic THEN z$ = "Magic"
  3302.     IF ok = 0 THEN z$ = "Bad"
  3303.     z$ = z$ + " landing"
  3304.     IF crash THEN fb$ = "": z$ = "CRASHED"
  3305.  
  3306.     IF lob THEN
  3307.         z$ = z$ + " on Borg": GOSUB tackon
  3308.         GOTO eother
  3309.     END IF
  3310.  
  3311.     v$ = "" '                                                         verb
  3312.     n$ = "" '                                                         noun
  3313.     ldis = q1 '                                                       last distance
  3314.  
  3315.     FOR i = 1 TO t '                                                  5wlemtsihg
  3316.         tx = sf(i, 2) - suri '                                        point of interest middle
  3317.         IF tx < 0 THEN tx = tx + q1
  3318.         poi$ = sf$(i) '                                               name of poi
  3319.         dis = ABS(px! - tx)
  3320.         IF (poi$ = "") OR (dis > ldis) THEN GOTO ni
  3321.         ldis = dis
  3322.         IF dis < h THEN
  3323.             n$ = poi$
  3324.             don = (sf(i, 2) - sf(i, 0)) + wi2 '                       distance to be "on"
  3325.             IF dis < don THEN
  3326.                 '        pad  349              LGM        Surveyor
  3327.                 IF (ABS(sy1 - q4) < 20) AND (i <> 3) AND (i <> 7) THEN
  3328.                     v$ = "in"
  3329.                 ELSE
  3330.                     v$ = "on"
  3331.                 END IF
  3332.             ELSE
  3333.                 v$ = "at"
  3334.             END IF
  3335.             IF ok THEN
  3336.                 IF (i = 1) THEN mes$(1) = "MIB will visit you shortly!"
  3337.                 IF (i = 3) AND (LGMc = gray) THEN n$ = "the ashes of " + n$
  3338.                 IF (i = 4) AND (v$ = "on") THEN mes$(1) = "On a volcano?  Are you crazy?"
  3339.                 IF (i = 5) THEN mes$(1) = "Buzz wants a Happy Meal!"
  3340.                 IF (i = t) AND (v$ = "on") THEN
  3341.                     mes$(1) = "Rude to land on a tombstone!"
  3342.                 END IF
  3343.             END IF
  3344.         END IF
  3345.         ni:
  3346.     NEXT i
  3347.  
  3348.     z$ = RTRIM$(z$ + " " + v$ + " " + n$): GOSUB tackon
  3349.  
  3350.     IF v$ = "in" THEN '                                               handle oddball cases
  3351.         IF n$ = sf$(6) THEN mes$(1) = "The aliens will not be pleased!"
  3352.         IF n$ = sf$(8) THEN mes$(1) = "Merged with the machine!"
  3353.         IF n$ = sf$(t) THEN mes$(1) = "Desecration of a grave!"
  3354.     END IF
  3355.  
  3356.     eother:
  3357.     IF fuel! = 0 THEN z$ = "ran out of fuel!": GOSUB tackon
  3358.     EXIT SUB
  3359.  
  3360.     tackon:
  3361.     IF LEN(fb$) THEN z$ = ", " + z$
  3362.     fb$ = fb$ + z$
  3363.     RETURN
  3364. ' -------------------------------------------------------------------------------------------------------x
  3365. SUB ExplodeLM
  3366.     DIM LMxi!(q2), LMyi!(q2)
  3367.     CountFuel = 0
  3368.     FOR i = 1 TO rp '                                                 for each pixel, a direction
  3369.         ta = RND * tsix '                                              pick an angle, any angle
  3370.         IF contact THEN ta = RND * 180 + 180 '                        upward only if on ground
  3371.         tf = RND * 20 + 2 '                                           force
  3372.         LMxi!(i) = tf * c!(ta) '                                      x increment
  3373.         LMyi!(i) = tf * s!(ta)
  3374.         IF LMc(i) = fuel THEN '                                       color
  3375.             CountFuel = CountFuel + 1
  3376.             IF CountFuel < ptk THEN LMc(i) = 0 '                      points to kill
  3377.         END IF
  3378.     NEXT i
  3379.     contact = 0
  3380.     fb$ = "" '                                                        eval feedback
  3381.     sgs = gs
  3382.     gs = 0 '                                                          full screen
  3383.     VIEW
  3384.     FOR pass = 1 TO 40 '                                              expanding debris
  3385.         CLS
  3386.         mes$(0) = dead$
  3387.         mes$(1) = ""
  3388.         Info '                                                        say why exploding
  3389.         FOR i = 1 TO rp
  3390.             LMrx(i) = LMrx(i) + LMxi!(i)
  3391.             LMry(i) = LMry(i) + LMyi!(i)
  3392.             LMyi!(i) = LMyi!(i) - grav! * (warp! = 0)
  3393.             x = (LMrx(i) - h) * aspect!
  3394.             y = LMry(i)
  3395.             s = i MOD 5 '                                             size
  3396.             LINE (x, y)-(x + s, y + s), LMc(i), BF
  3397.             z1 = ((RND * t) - 5) * 3
  3398.             z2 = ((RND * t) - 5) * 3
  3399.             LINE (x + z1, y + z2)-(x + z1 + s, y + z2 + s), LMc(i), BF
  3400.         NEXT i
  3401.         LINE (0, 0)-(q3, q4), 0, B '                                  erase ugly border
  3402.         timemachine
  3403.         w! = TIMER + .02: WHILE TIMER < w!: WEND
  3404.     NEXT pass
  3405.     gs = sgs
  3406. ' -------------------------------------------------------------------------------------------------------x
  3407. SUB ExplodeShell (s) '                                                not contact - when LM fires at them
  3408.     tx = shx(s) - suri
  3409.     ty = shy(s)
  3410.     LINE (tx - 5, ty - 5)-(tx + 5, ty + 5), black2, BF '              erase shell
  3411.  
  3412.     FOR d = t TO 30 STEP 2 '                                          distance
  3413.         FOR z = 0 TO 40 - d '                                         particles at above distance
  3414.             ang = RND * tsix '                                         angle
  3415.             tx2 = tx + d * c!(ang) * aspect!
  3416.             ty2 = ty + d * s!(ang)
  3417.             bit = bit XOR 1
  3418.             IF bit THEN c = red ELSE c = yellow
  3419.             PSET (tx2, ty2), c
  3420.         NEXT z
  3421.     NEXT d
  3422.     shx(s) = 0
  3423.     shd(s) = q1 '                                                     6400, any large number
  3424.     sia = sia - 1 '                                                   shells in air
  3425. ' -------------------------------------------------------------------------------------------------------x
  3426. SUB GetSurface (gh) '                                                 load surface array
  3427.     DIM lz(t) '                                                       landing zones
  3428.     f$ = "s" + LTRIM$(STR$(gh)) + ".dat" '                            0 - 10
  3429.     IF gh < 0 THEN f$ = "SL.DAT" '                                    l for level
  3430.     IF demo THEN f$ = "SD.DAT" '                                      d for demo
  3431.     CLOSE #6
  3432.     OPEN f$ FOR RANDOM AS #6 LEN = 2
  3433.     FOR i = 0 TO 6399
  3434.         GET #6, i + 1, gh(i)
  3435.         'gc(i) = gray
  3436.     NEXT i
  3437.     FOR i = 1 TO t '                                                  create landing zones
  3438.         IF demo THEN '                                                compress onto 1 page
  3439.             lz(i) = 3050 + (i - 1) * 80
  3440.         ELSE
  3441.             lz(i) = 320 + (i - 1) * (q3 + 1) '                        1 per page
  3442.         END IF
  3443.     NEXT i
  3444.     IF demo THEN '                                                    all on one page
  3445.         SWAP lz(9), lz(t) '                                           move grave 1 page left
  3446.         SWAP lz(2), lz(4) '                                           move car wash 2 pages right
  3447.     END IF
  3448.     RESTORE features
  3449.     FOR i = 1 TO t
  3450.         READ sf$(i), x, y, lz '                                       sf = special feature
  3451.         sf(i, 0) = lz(i) - x \ 2 '                                    start
  3452.         IF demo AND (i = 9) THEN sf(i, 0) = 3750 '                    Hollywood
  3453.         sf(i, 1) = sf(i, 0) + x '                                     end
  3454.         sf(i, 2) = sf(i, 0) + x \ 2 '                                 middle
  3455.     NEXT i
  3456.     IF demo THEN '                                                    move LGM to top of grave
  3457.         sf(3, 0) = sf(t, 0) + 14 '                                    x left
  3458.         sf(3, 1) = sf(t, 1) + 14 '                                    x right
  3459.         sf(3, 2) = sf(t, 2) + 14 '                                    x middle
  3460.     END IF
  3461.     sspinit2 = 0
  3462. ' -------------------------------------------------------------------------------------------------------x
  3463. FUNCTION gety (x) '                                                   ground level for given x
  3464.     ax = ABS(x)
  3465.     xx = (suri + ax) MOD q1
  3466.     IF sy1 > 310 THEN
  3467.         c1 = (xx >= sf(2, 0)) '                                       car wash start
  3468.         c2 = (xx <= sf(2, 1)) '                                       car wash end
  3469.         IF c1 AND c2 THEN
  3470.             IF ASO THEN z = 320 ELSE z = 338 '                        safe zone start different with ascent stage only
  3471.             IF sy1 > z THEN
  3472.                 gety = q4 '                                           349, max y
  3473.                 EXIT FUNCTION
  3474.             END IF
  3475.         END IF
  3476.     END IF
  3477.     IF x < 0 THEN
  3478.         c1 = (ek(2) <> -1) AND (ek(2) < h)
  3479.         c2 = (skyoff = 0) AND (sy1 < borgt) AND (ax > borgl) AND (ax < borgr)
  3480.         IF c1 AND c2 THEN
  3481.             ' LINE (borgl, borgt)-(borgl, borgt - 20), yellow ' debugging
  3482.             ' LINE (borgl, borgt)-(borgr, borgt - 20), yellow
  3483.             ' LINE (borgl, borgt)-(borgr, borgt), yellow
  3484.             gety = borgt
  3485.             EXIT FUNCTION
  3486.         END IF
  3487.     END IF
  3488.     gety = gh(xx)
  3489. ' -------------------------------------------------------------------------------------------------------x
  3490. SUB Hollywood
  3491.     FOR i = 1 TO 9
  3492.         tx = x + i * 16
  3493.         ty = gety(tx) - 14
  3494.         PrintVGA MID$("HOLLYWOOD", i, 1), tx - 4, ty, white, black
  3495.         LINE (tx, ty + 9)-(tx, ty + 22), gray2
  3496.     NEXT i
  3497. ' -------------------------------------------------------------------------------------------------------x
  3498.     DIM a(1)
  3499.     x0 = x
  3500.     y0 = 304
  3501.     IF bolthitf THEN tc = white ELSE tc = gasoline '                  lightning bolt from deathstar
  3502.     LINE (x0, y0)-(x0 + 50, y0 + 45), tc, BF '                        entire area
  3503.     LINE (x0, y0)-(x0 + 50, y0 + 45), gray, B '                       outline
  3504.  
  3505.     LINE (x0, y0 - 1)-(x0, y0 - 30), gray2 '                          light towers
  3506.     LINE (x0 + 50, y0 - 1)-(x0 + 50, y0 - 30), gray2
  3507.  
  3508.     IF bbit THEN '                                                    global seconds toggle
  3509.         PSET (x0, y0 - 30), red '                                     lights on towers
  3510.         PSET (x0 + 50, y0 - 30), red
  3511.         ltoggle = ltoggle XOR 1
  3512.         IF ltoggle THEN
  3513.             PSET (x0, y0 - 31), red
  3514.             PSET (x0 + 50, y0 - 31), red
  3515.             LINE (x0 - 2, y0 - 30)-STEP(4, 0), red
  3516.             LINE (x0 + 48, y0 - 30)-STEP(4, 0), red
  3517.         END IF
  3518.     END IF
  3519.  
  3520.     IF a(0) = 0 THEN a(0) = 30: a(1) = 150 '                          initial marker positions
  3521.     IF RND > pf! THEN '                                               reel mark direction&speed
  3522.         tdir = SGN(RND - pf!) * INT(RND * 4 + 2)
  3523.         IF RND > .8 THEN tdir = 0 '                                   sometimes not moving
  3524.     END IF
  3525.     LINE (x0 + 6, y0 + 15)-(x0 + 19, y0 + 21), black2 '               tape
  3526.     LINE -(x0 + 33, y0 + 21), black2
  3527.     LINE -(x0 + 44, y0 + 15), black2
  3528.     LINE (x0 + 24, y0 + 19)-STEP(3, 1), dred, BF '                    head
  3529.     FOR i = 0 TO 1 '                                                  reels/rollers
  3530.         a(i) = (a(i) + t * tdir + tsix) MOD tsix '                      marker angle
  3531.         x = x0 + 13 + i * 24
  3532.         y = y0 + 11
  3533.         FOR d! = 5 TO 9
  3534.             CIRCLE (x, y), d!, white, , , .73 '                       reel
  3535.             CIRCLE (x, y), d!, white, , , .68
  3536.         NEXT d!
  3537.         x1 = x + 3 * s!(a(i)) * grav!
  3538.         y1 = y + 3 * c!(a(i))
  3539.         x2 = x + 6 * s!(a(i)) * grav!
  3540.         y2 = y + 6 * c!(a(i))
  3541.         LINE (x1, y1)-(x2, y2), black2 '                              rotation marker
  3542.         FOR d = 0 TO 4 '                                              hub
  3543.             CIRCLE (x, y), d, dred, , , .73
  3544.         NEXT d
  3545.     NEXT i
  3546.  
  3547.     IF sia > 0 THEN '                                                 shells in air = building gets MEAN title
  3548.         PrintLines "HAL", 0, 47, x0 + 1, y0 + 39, red, white, 1, 2
  3549.     ELSE
  3550.         PrintLines "IBM", 0, 47, x0, y0 + 39, blue, white, 1, 2
  3551.     END IF
  3552.  
  3553.     '                                                                 binary clock
  3554.     z$ = TIME$ '                                                      hh:mm:ss
  3555.     z$ = LEFT$(z$, 2) + MID$(z$, 4, 2) + RIGHT$(z$, 2) '              hhmmss
  3556.     FOR i = 1 TO 6
  3557.         v = VAL(MID$(z$, i, 1)) '                                     value
  3558.         x = x0 + i * 5 + 2 - (i > 2) * 5 - (i > 4) * 5 '              column
  3559.         z = VAL(MID$("132323", i, 1)) '                               rows for this column
  3560.         FOR j = 0 TO z
  3561.             IF v AND 1 THEN c = red ELSE c = black2 '                 red = on
  3562.             v = v \ 2
  3563.             y = glmax - 2 - j * 2
  3564.             LINE (x - 1, y)-(x + 1, y), c, B '                        show bit
  3565.         NEXT j
  3566.     NEXT i
  3567.  
  3568.     IF ttf! < -2 THEN fat! = TIMER + 10
  3569.     ttf! = fat! - TIMER '                                             time to fire
  3570.     IF fat! > 86400 THEN fat! = t: ttf! = 0
  3571.  
  3572.     IF (ttf! > 0) AND (ttf! < 1) THEN '                               optional radar
  3573.         sky = (sky + 1) MOD tsix
  3574.         x1 = x0 + 25
  3575.         FOR sky2 = 0 TO 180 STEP 5
  3576.             zz = (sky + sky2) MOD 180
  3577.             x2 = x1 + q2 * c!(zz)
  3578.             y2 = (y0 - 1) - q2 * s!(zz) - 1
  3579.             LINE (x1, y0 - 1)-(x2, y2), red, , &H1111
  3580.         NEXT sky2
  3581.     END IF
  3582.  
  3583.     IF pat1& = 0 THEN pat1& = &H5555: pat2& = &HAAAA
  3584.     SWAP pat1&, pat2& '                                               countdown to firing
  3585.     z! = ttf!: IF z! < 0 THEN z! = 0
  3586.     tx = x0 + z! / t * 48
  3587.     IF tx > (x0 + 48) THEN tx = xo + 48 '                             crude fix for a midnite crossing
  3588.     ty = y0 + 1
  3589.     LINE (x0 + 1, ty)-(tx, ty), black2, , pat1&
  3590.     LINE (x0 + 1, ty)-(tx, ty), red, , pat2&
  3591.  
  3592.     IF (sia < 20) AND (shoot OR (ttf! <= 0)) THEN '                   initialize shell
  3593.         shoot = 0
  3594.         FOR s = 1 TO 20
  3595.             IF shx(s) = 0 THEN
  3596.                 sia = sia + 1 '                                       shells in air
  3597.                 shx(s) = suri + x0 + 25
  3598.                 shy(s) = 320
  3599.                 shellv = (-32 + (RND - pf!) * t) * t '                velocity
  3600.                 ta = 0
  3601.                 IF RND > .1 THEN '                                    smart 10%
  3602.                     IF RND > pf! THEN
  3603.                         ta = -RND * 25
  3604.                     ELSE
  3605.                         ta = RND * 50 '                               above or below
  3606.                     END IF
  3607.                     ta = ta + (RND - pf!) * 4 '                       vary it a little
  3608.                 END IF
  3609.                 dx = px! - shx(s) + suri
  3610.                 dy = shy(s) - py!
  3611.                 IF dy = 0 THEN dy = 1
  3612.                 shella = _R2D(ATN(dx / dy)) + (90 - 5 * SGN(dx) + ta)
  3613.                 IF py! > 280 THEN
  3614.                     shella = 90 + (RND - pf!) * 40
  3615.                     shellv = shellv * .75
  3616.                 END IF
  3617.                 shella = (shella + tsix) MOD tsix
  3618.                 shvx(s) = (shellv / t) * c!(shella)
  3619.                 shvy(s) = (shellv / t) * s!(shella)
  3620.                 shd(s) = q1
  3621.                 EXIT FOR
  3622.             END IF
  3623.         NEXT s
  3624.     END IF
  3625. ' -------------------------------------------------------------------------------------------------------x
  3626. SUB Info STATIC '                                                     show messages
  3627.     DIM lenmes(1)
  3628.     IF LEN(fb$) THEN mes$(0) = UCASE$(fb$): sm!(0) = mTIMER
  3629.  
  3630.     FOR i = 0 TO 1
  3631.         IF mes$(i) <> omes$(i) THEN sm!(i) = 0
  3632.         lenmes(i) = LEN(mes$(i))
  3633.         IF lenmes(i) AND (sm!(i) = 0) THEN
  3634.             sm!(i) = TIMER
  3635.             omes$(i) = mes$(i)
  3636.         END IF
  3637.         el! = TIMER - sm!(i)
  3638.         IF el! > 5 THEN mes$(i) = "": sm!(i) = 0
  3639.     NEXT i
  3640.     tcenter = (q3 + gs) \ 2 '                                         center of "space" area
  3641.     IF lenmes(0) THEN
  3642.         c1 = white2: c2 = gray
  3643.         z$ = LTRIM$(mes$(0))
  3644.         l3$ = LEFT$(z$, 3)
  3645.         IF l3$ = "CM:" THEN c1 = red '                                rendesvous chatter
  3646.         IF l3$ = "DAN" THEN c1 = red '                                Danger, Will Robinson
  3647.         IF c1 = red THEN c2 = black2
  3648.         IF (convo > 0) OR (INSTR("EstWARRad", l3$) > 0) THEN
  3649.             PrintVGA z$, tcenter - lenmes(0) * 4, 5, c1, -1
  3650.         ELSE
  3651.             IF lenmes(0) > (34 - (gs = 0) * 5) THEN
  3652.                 tcol = (tcol + 4) MOD (lenmes(0) * t)
  3653.                 z$ = SPACE$(4) + z$
  3654.                 PrintLines z$, tcol, tcol + 40 * 16, gs, 20, c1, c2, 2, 2
  3655.             ELSE
  3656.                 tx = tcenter - LEN(z$) * 8
  3657.                 'LINE (gs, 6)-(q3, 17), 0, BF
  3658.                 PrintLines z$, 0, lenmes(0) * 16 - 1, tx, 20, c1, c2, 2, 2
  3659.             END IF
  3660.         END IF
  3661.     END IF
  3662.  
  3663.     IF lenmes(1) THEN '                                               subordinate msg
  3664.         IF lenmes(0) THEN ty = 30 ELSE ty = 5
  3665.         PrintVGA mes$(1), tcenter - lenmes(1) * 4, ty, red, dred
  3666.     END IF
  3667.  
  3668.     IF (invincible = 0) AND (rads >= h) AND (TIMER < rtl!(0)) THEN
  3669.         z = rads \ h
  3670.         IF z >= t THEN radiationdeath = 1: z = t '                    >= ten
  3671.         IF z <= t THEN '                                              <= ten
  3672.             RESTORE radcomments
  3673.             FOR i = 1 TO z
  3674.                 READ z$
  3675.             NEXT i
  3676.             IF VAL(LEFT$(z$, 1)) THEN '                               does it start with a #?
  3677.                 z$ = "ensures your death within " + z$ '              yes, tack on phrase
  3678.             END IF
  3679.             mes$(1) = "Radiation exposure " + z$ + "!"
  3680.         END IF
  3681.     END IF
  3682. ' -------------------------------------------------------------------------------------------------------x
  3683. SUB LEDdisplay (t$) STATIC
  3684.     IF LEDinit = 0 THEN
  3685.         DIM segment(6, 3), number$(11)
  3686.         RESTORE leds
  3687.         FOR i = 0 TO 6
  3688.             READ g$
  3689.             FOR j = 0 TO 3
  3690.                 READ segment(i, j)
  3691.             NEXT j
  3692.         NEXT i
  3693.         FOR i = 0 TO 11
  3694.             READ g$, number$(i)
  3695.         NEXT i
  3696.         LEDinit = 1
  3697.     END IF
  3698.  
  3699.     IF (osc < 6) OR (osc = t) THEN '                                  fuel,alt,h,v,thrust,angle
  3700.         tc = c: IF LEDtri = 0 THEN tc = LEDc
  3701.         IF osc = t THEN '                                             angle
  3702.             segx = 14: segy = 14 '                                    segment size
  3703.             tx = 92 - LEN(t$) * segx * 2
  3704.             ty = 298
  3705.         ELSE
  3706.             tl = (LEN(t$) - SGN(INSTR(t$, "."))) * 16
  3707.             tx = gs - tl
  3708.             ty = 296 - osc * 39
  3709.             segx = 8: segy = 8
  3710.         END IF
  3711.     ELSE '                                                            6clock 7dtm 8speed 9rads
  3712.         IF osc = 9 THEN tc = red ELSE tc = orange
  3713.         IF crash THEN tc = white2
  3714.         tx = 50
  3715.         ty = 35 + (osc - 6) * 9
  3716.         IF osc = 9 THEN ty = 62
  3717.         segx = 4: segy = 3
  3718.     END IF
  3719.  
  3720.     IF crash AND (osc <> 6) THEN EXIT SUB '                           allow clock
  3721.  
  3722.     dpp = 0 '                                                         decimal point
  3723.     FOR si = 1 TO LEN(t$)
  3724.         z$ = MID$(t$, si, 1)
  3725.         IF z$ = "." THEN '                                            plot sub can't handle decimal
  3726.             tx1 = tx + (si - 1) * 16 - 5
  3727.             LINE (tx1, ty - 1)-(tx1 + 1, ty), tc, BF
  3728.             dpp = 1
  3729.         ELSE
  3730.             z = VAL(z$)
  3731.             IF z$ = "-" THEN z = t
  3732.             IF z$ = "L" THEN z = 11 '                                 "L" for lock fuel and level ground
  3733.             IF z$ <> " " THEN GOSUB leddigit
  3734.         END IF
  3735.     NEXT si
  3736.  
  3737.     IF osc = 6 THEN '                                                 colon for clock
  3738.         IF crash THEN bbit = 1
  3739.         PSET (tx + 14, ty - 4), tc * bbit
  3740.         PSET (tx + 14, ty - 2), tc * bbit
  3741.     END IF
  3742.     EXIT SUB
  3743.  
  3744.     leddigit:
  3745.     FOR i = 1 TO LEN(number$(z))
  3746.         seg$ = MID$(number$(z), i, 1)
  3747.         IF INSTR("abcdefg", z$) THEN seg$ = z$ '                      for wave effect
  3748.         segn = ASC(seg$) - 97
  3749.         x0 = tx + (si - 1 - dpp) * (segx * 2)
  3750.         x1 = x0 + segment(segn, 0) * segx
  3751.         y1 = ty + segment(segn, 1) * segy
  3752.         x2 = x0 + segment(segn, 2) * segx
  3753.         y2 = ty + segment(segn, 3) * segy
  3754.         IF x1 < x2 THEN
  3755.             LINE (x1 + 1, y1)-(x2 - 1, y1), tc '                      horizontal
  3756.             IF osc = t THEN '                                         angle (very thick)
  3757.                 LINE (x1 + 2, y1 - 1)-(x2 - 2, y1 - 1), tc
  3758.                 LINE (x1 + 2, y1 + 1)-(x2 - 2, y1 + 1), tc
  3759.             END IF
  3760.         ELSE
  3761.             LINE (x1, y1 + 1)-(x1, y2 - 1), tc '                      vertical
  3762.             IF osc = t THEN '                                         angle (very thick)
  3763.                 LINE (x1 - 1, y1 + 2)-(x1 - 1, y2 - 2), tc
  3764.                 LINE (x1 + 1, y1 + 2)-(x1 + 1, y2 - 2), tc
  3765.             END IF
  3766.         END IF
  3767.     NEXT i
  3768.     RETURN
  3769. ' -------------------------------------------------------------------------------------------------------x
  3770. SUB LMbloads
  3771.     p = ASO * 3 + 4
  3772.  
  3773.     s& = VARSEG(LMx(0))
  3774.     o& = VARPTR(LMx(0))
  3775.     DEF SEG = s&
  3776.     BLOAD f$(p), o&
  3777.  
  3778.     s& = VARSEG(LMy(0))
  3779.     o& = VARPTR(LMy(0))
  3780.     DEF SEG = s&
  3781.     BLOAD f$(p + 1), o&
  3782.  
  3783.     s& = VARSEG(LMc(0))
  3784.     o& = VARPTR(LMc(0))
  3785.     DEF SEG = s&
  3786.     BLOAD f$(p + 2), o&
  3787. ' -------------------------------------------------------------------------------------------------------x
  3788. SUB LMdistort
  3789.     FOR i = 1 TO rp
  3790.         IF (LMc(i) = craft) AND (RND > .6) THEN
  3791.             LMx(i) = LMx(i) + RND * 3 - 1
  3792.             LMy(i) = LMy(i) + RND * 3 - 1
  3793.         END IF
  3794.     NEXT i
  3795. ' -------------------------------------------------------------------------------------------------------x
  3796. SUB LoadPanel STATIC
  3797.     IF pload = 0 THEN
  3798.         z = 12500
  3799.         REDIM pb(z)
  3800.         tf$ = "PANEL" + CHR$(48 + background) + ".DAT"
  3801.         s& = VARSEG(pb(0))
  3802.         o& = VARPTR(pb(0))
  3803.         DEF SEG = s&
  3804.         BLOAD tf$, o&
  3805.         pload = 1
  3806.     END IF
  3807.     PUT (0, 67), pb(), PSET
  3808. ' -------------------------------------------------------------------------------------------------------x
  3809. FUNCTION localize (tx, p, m)
  3810.     z0 = 9999 '                                                       assume out of range
  3811.     z1 = suri - m '                                                   surface index - minus
  3812.     z2 = suri + p + q3 '                                              surface index + plus
  3813.     FOR z = -1 TO 1 '                                                 page before, current, next
  3814.         zx = tx + z * q1
  3815.         IF (zx <= z2) AND (zx >= z1) THEN z0 = tx - suri + q1 * z
  3816.     NEXT z
  3817.     localize = z0 '                                                   return 9999 or calculated
  3818. ' -------------------------------------------------------------------------------------------------------x
  3819. SUB Map
  3820.     LINE (0, 0)-(gs - 1, 1), blue2, BF
  3821.     FOR i = 1 TO 17 + ufof
  3822.         IF i <= t THEN '                                              surface features
  3823.             tx = sf(i, 2)
  3824.             IF tx = -1 THEN GOTO skipf '                              destroyed
  3825.             tc = blue
  3826.             z$ = sf$(i) '                                             surface feature name
  3827.             IF i = 3 THEN z$ = "LGM" '                                shorten some names
  3828.             IF i = 5 THEN z$ = "McD"
  3829.             IF i = 7 THEN z$ = "SSC"
  3830.             GOTO wubba
  3831.         END IF
  3832.         IF i = (17 + ufof) THEN
  3833.             tc = white
  3834.             tx = (suri + px!) MOD (q1 + 1)
  3835.             z$ = "LM"
  3836.         ELSE '                                                        sky feature
  3837.             IF skyoff THEN GOTO skipf
  3838.             j = i - 11
  3839.             IF (ek(j) = -1) OR eou THEN GOTO skipf '                  destroyed or not present
  3840.             IF j THEN tc = red ELSE tc = green '                      CM green, rest red
  3841.             tx = ex(j)
  3842.             '                     1    2    3    4    5    6
  3843.             '                 12345123451234512345123451234512345
  3844.             z$ = RTRIM$(MID$("CM   EPCORBorg BH   Worm CometAlien", j * 5 + 1, 5))
  3845.             IF j = 0 THEN z$ = z$ + STR$(exv(0)) '                    CM + velocity
  3846.         END IF
  3847.  
  3848.         wubba:
  3849.         tx = tx \ t
  3850.         LINE (tx, 0)-(tx + 1, 1), tc, BF
  3851.         zz = LEN(mes$(0)) + LEN(mes$(1)) - (liftoff = 1) '            quash names when messages active and during liftoff
  3852.         IF (zz = 0) AND (tx > (gs + 6)) THEN PrintLines z$, 0, LEN(z$) * 8, tx - 6, 16, tc, -99, 0, 1
  3853.         skipf:
  3854.     NEXT i
  3855. ' -------------------------------------------------------------------------------------------------------x
  3856. SUB McD STATIC '                                                      37 * 16
  3857.     IF McDi = 0 THEN '                                                initialize
  3858.         z$ = "    Burger, fries & Coke only $1.99!"
  3859.         FOR i = 1 TO LEN(z$) '                                        Morse code
  3860.             c$ = MID$(z$, i, 1)
  3861.             RESTORE MorseData
  3862.             FOR j = 1 TO 39
  3863.                 READ d$, x$
  3864.                 IF d$ = LCASE$(c$) THEN m$ = m$ + x$ + " "
  3865.             NEXT j
  3866.         NEXT i
  3867.         McDi = 1
  3868.     END IF
  3869.  
  3870.     mp = (mp + 4) MOD 320 '                                           show ad in text
  3871.     x2 = x + 38
  3872.     IF bolthitf THEN tc = white ELSE tc = gold
  3873.     LINE (x, glmax)-(x2, glmax - 19), tc, BF '                        clear sign area
  3874.     PrintLines z$, mp, mp + 37, x, glmax - 1, red, black2, 1, 1
  3875.  
  3876.     FOR mx = x TO x2 - 1 '                                            arch & red neon
  3877.         my = gety(mx)
  3878.         arch = (arch + 1) MOD t
  3879.         IF arch < 2 THEN tc = red ELSE tc = gold
  3880.         IF bolthitf THEN tc = white
  3881.         IF mx > x THEN LINE (mx, my)-(mx, my + 2), tc
  3882.         tmx = x + x2 - mx - 2
  3883.         IF tmx > x THEN LINE (tmx, glmax - 19)-(tmx + 2, glmax - 18), tc, BF
  3884.     NEXT mx
  3885.  
  3886.     y = glmax - 1 '                                                   show ad in Morse
  3887.     i = 0
  3888.     z = (z MOD LEN(m$)) + 1
  3889.     DO
  3890.         j = ((z + i) MOD LEN(m$)) + 1
  3891.         i = i + 1
  3892.         p = INSTR(".- ", MID$(m$, j, 1)) - 1
  3893.         IF p < 2 THEN LINE (x, y)-(x + p * 2, y), black2
  3894.         x = x + (p + 1) * 2
  3895.     LOOP UNTIL (x + 2) > x2
  3896. ' -------------------------------------------------------------------------------------------------------x
  3897. FUNCTION OnOff$ (v)
  3898.     OnOff$ = MID$("OFFON ", v * 3 + 1, 3)
  3899. ' -------------------------------------------------------------------------------------------------------x
  3900. SUB PrepAndShowLED (t!, nd, dp) STATIC
  3901.     osc = osc + 1
  3902.     IF dp = t THEN dp = 0: osc = 9
  3903.  
  3904.     ti = FIX(t!)
  3905.     z! = ABS(t! - ti)
  3906.     s$ = SPACE$(6)
  3907.     IF (t! < 0) AND (ti = 0) THEN
  3908.         t1$ = RIGHT$(s$ + "-" + LTRIM$(STR$(ti)), nd)
  3909.     ELSE
  3910.         t1$ = RIGHT$(s$ + LTRIM$(STR$(ti)), nd)
  3911.     END IF
  3912.  
  3913.     t2a$ = LTRIM$(STR$(INT(z! * (t ^ dp))))
  3914.     IF LEN(t2a$) < dp THEN t2a$ = RIGHT$("000" + t2a$, dp)
  3915.     t2$ = LEFT$(LTRIM$(t2a$) + "0000", dp)
  3916.     IF dp = 0 THEN z$ = t1$ ELSE z$ = t1$ + "." + t2$
  3917.  
  3918.     IF z$ = " -0.00" THEN z$ = "  0.00"
  3919.     'IF z$ = " -0.99" THEN z$ = " -1.00"
  3920.  
  3921.     IF (osc = 9) AND (t! = 0) THEN '                                  usually count for rads, lightning
  3922.         cylon = (cylon + 1) MOD 6 '                                    when blank, cycle a "-"
  3923.         zz = VAL(MID$("123432", cylon + 1, 1))
  3924.         z$ = "    "
  3925.         MID$(z$, zz, 1) = "-"
  3926.     END IF
  3927.  
  3928.     IF osc = 4 THEN
  3929.         IF (liftoff = 0) AND level THEN MID$(z$, 1, 1) = "L" '        altitude
  3930.         IF radarf = 0 THEN z$ = " ----"
  3931.     END IF
  3932.  
  3933.     IF (osc = 5) AND lockfuel THEN MID$(z$, 1, 1) = "L" '             fuel
  3934.  
  3935.     IF warp! > 0 THEN
  3936.         IF osc = 4 THEN z$ = " ----" '                                suppress altitude
  3937.         IF osc = 7 THEN z$ = "----" '                                 distance to McDonalds
  3938.     END IF
  3939.  
  3940.     LEDdisplay z$
  3941. ' -------------------------------------------------------------------------------------------------------x
  3942. SUB PrintCGA (c$, x, y, tc1, tc2, compress) STATIC '                  CGA font, 8 * 8
  3943.     c1 = tc1
  3944.     c2 = tc2
  3945.     IF y = -1 THEN '                                                  single char panel stuff - F for Fuel, etc.
  3946.         c2 = -1
  3947.         y = 263 - osc * 39
  3948.         tx1 = x - 3
  3949.         tx2 = x + 11
  3950.         ty1 = y
  3951.         ty2 = y + t
  3952.         IF bbit AND (LEDc = green) AND (radarf > 0) AND (contact = 0) AND ((c1 = red) OR (c1 = yellow)) THEN
  3953.             LINE (tx1 + 1, ty1 + 1)-(tx2 - 1, ty2 - 1), c1, BF
  3954.             c1 = black2
  3955.         ELSE
  3956.             IF (osc = 4) AND (radarf = 0) THEN c1 = gray ELSE c1 = white
  3957.         END IF
  3958.     END IF
  3959.  
  3960.     IF y + 9 > glmax THEN EXIT SUB
  3961.     tx = x + 1
  3962.  
  3963.     FOR i = 1 TO LEN(c$)
  3964.         d = ASC(MID$(c$, i, 1))
  3965.         'IF d = 248 THEN d = 0                                        ' degree symbol
  3966.         FOR k = 0 TO 7
  3967.             IF p2(d, k) OR (compress = 0) THEN
  3968.                 IF c2 >= 0 THEN
  3969.                     LINE (tx + 1, y + 2)-(tx + 1, y + t), c2, , p2(d, k)
  3970.                 END IF
  3971.                 LINE (tx, y + 1)-(tx, y + 9), c1, , p2(d, k)
  3972.                 tx = tx + 1
  3973.             END IF
  3974.         NEXT k
  3975.     NEXT i
  3976. ' -------------------------------------------------------------------------------------------------------x
  3977. SUB PrintLines (d$, i1, i2, x1, y1, c1, c2, sd, s) STATIC
  3978.     ' chars, index1, index2, x,y, color 1, color 2, shadow distance,size
  3979.     slant = -(c2 < -20)
  3980.     FOR i = i1 TO i2 - 1
  3981.         z = i \ (8 * s) + 1
  3982.         IF z > LEN(d$) THEN d = 32 ELSE d = ASC(MID$(d$, z, 1))
  3983.         IF d = 248 THEN d = 0 '                                       degree symbol
  3984.         m& = _SHL(1, (7 - (i \ s) MOD 8))
  3985.         p& = 0
  3986.         FOR j = 0 TO 13
  3987.             p& = p& * 2 + SGN((p(d, 13 - j) AND m&))
  3988.         NEXT j
  3989.         IF c2 = -99 THEN '                                            vertical
  3990.             ty1 = y1 + (i - i1)
  3991.             ty2 = ty1 - slant * 13
  3992.             LINE (x1, ty1)-(x1 + 13, ty2), c1, , p& * 2
  3993.         ELSE '                                                        horizontal
  3994.             tx1 = x1 + i - i1 + 1
  3995.             tx2 = tx1 + slant * 15
  3996.             ty2 = y1 - 15
  3997.             LINE (tx1, y1)-(tx2, ty2), c1, , p&
  3998.             IF c2 >= 0 THEN LINE (tx1 + sd, y1)-(tx2 + sd, ty2), c2, , p&
  3999.         END IF
  4000.     NEXT i
  4001. ' -------------------------------------------------------------------------------------------------------x
  4002. SUB PrintVGA (z$, tx, ty, c1, c2) '                                   VGA font, 8 * 14
  4003.     PrintLines z$, 0, LEN(z$) * 8 - 1, tx, ty + 13, c1, c2, 1, 1
  4004. ' -------------------------------------------------------------------------------------------------------x
  4005. SUB Setcolor
  4006.     'black = 0: blue = 1: green = 2: gunmetal = 3: red = 4: gasoline = 5
  4007.     'gray2 = 6: white = 7: gray = 8: dred = 9: gold = 10: black2 = 11
  4008.     'orange = 12: blue2 = 13: yellow = 14: white2 = 15
  4009.  
  4010.     '          b g g r g g w g d g b o b y w
  4011.     '          l r u e a y h y r o k r 2 e h
  4012.     '          1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
  4013.     IF bw THEN '
  4014.         z$ = "070707075607070756070007565656" '                       black and white (because I can!)
  4015.     ELSE
  4016.         z$ = "010249042456075632380052085407" '                       color
  4017.         'z$ = "010249322456075632380052085407" '                       color
  4018.     END IF
  4019.     FOR i = 0 TO 14
  4020.         PALETTE i + 1, VAL(MID$(z$, i * 2 + 1, 2))
  4021.     NEXT i
  4022. ' -------------------------------------------------------------------------------------------------------x
  4023. SUB Shells STATIC
  4024.     FOR s = 0 TO 20 '                                                 0 element is bomb, others from IBM
  4025.         IF shx(s) = 0 THEN GOTO nextshell '                           never active or already exploded
  4026.         shvy(s) = shvy(s) + grav! '                                   gravity
  4027.         shx(s) = shx(s) + shvx(s)
  4028.         shy(s) = shy(s) + shvy(s)
  4029.         tsx = shx(s) - suri
  4030.         tsy = shy(s)
  4031.  
  4032.         IF (s > 0) AND (crash = 0) THEN
  4033.             dx! = tsx - px!
  4034.             dy! = (tsy - py!) * aspect!
  4035.             shd(s) = SQR(dx! * dx! + dy! * dy!)
  4036.             IF (invincible = 0) AND (shd(s) < 20) THEN
  4037.                 dead$ = "HAL KILLED YOU"
  4038.                 EXIT SUB
  4039.             END IF
  4040.         END IF
  4041.  
  4042.         IF (tsy > 0) AND (shvy(s) > 0) AND ((tsy + shvy(s)) > gety(tsx)) THEN
  4043.             tsy = gety(tsx)
  4044.             FOR a2 = 0 TO tsix STEP 30 '                               explode, make star
  4045.                 bit = bit XOR 1 '                                     toggle
  4046.                 d2 = bit * t + t / 2
  4047.                 x2 = tsx + d2 * c!(a2) * aspect!
  4048.                 y2 = tsy + d2 * s!(a2)
  4049.                 IF a2 THEN LINE -(x2, y2), gold ELSE PSET (x2, y2), gold
  4050.             NEXT a2
  4051.             PAINT (tsx, tsy), gold, gold
  4052.             shx(s) = 0
  4053.             sia = sia - 1
  4054.             IF s = 0 THEN GOSUB makecrater
  4055.         ELSE '                                                        show shell
  4056.             IF shvx(s) < 0 THEN ai = -30 ELSE ai = 30 '               spin
  4057.             sha(s) = (sha(s) + ai + tsix) MOD tsix
  4058.             ss = 3 + (s = 0) * 2
  4059.             FOR i = 0 TO 1
  4060.                 IF i THEN cc = red ELSE cc = gold
  4061.                 a1 = (sha(s) + i * 180) MOD tsix '                     angle 1
  4062.                 a2 = a1 + 150 '                                       angle 2
  4063.                 ex = tsx + ss * c!(a1) * aspect! '                    1 of the endpoints
  4064.                 ey = tsy + ss * s!(a1) '                              a line from an endpoint to
  4065.                 FOR j = a1 TO a2 STEP t '                             each point on the half circle
  4066.                     zk = j MOD tsix '                                  seemed easier than a paint
  4067.                     zx = tsx + ss * c!(zk) * aspect!
  4068.                     zy = tsy + ss * s!(zk)
  4069.                     LINE (zx, zy)-(ex, ey), cc
  4070.                 NEXT j
  4071.             NEXT i
  4072.         END IF
  4073.         nextshell:
  4074.     NEXT s
  4075.     EXIT SUB
  4076.  
  4077.     makecrater:
  4078.     dd = ABS(sf(sf, 2) - suri - tsx) '                                distance to current surface feature
  4079.     IF dd < t THEN sf(sf, 2) = -1 '                                   under ten from a surface feature, kill feature
  4080.  
  4081.     'FOR crx = 0 TO q1
  4082.     'gc(crx) = gray
  4083.     'NEXT crx
  4084.     zz = 40 '                                                         distance +- impact
  4085.     r1 = RND * 40
  4086.     r2 = RND * 40 + 40
  4087.     FOR crx = -zz TO zz
  4088.         ta = (crx * 2 + 270) MOD tsix '                                angle
  4089.         tx = tsx + crx
  4090.         ty = gety(tc) - r1 - r2 * s!(ta)
  4091.         IF ty > glmax THEN ty = glmax
  4092.         ti = ((suri + tx + q1) MOD q1)
  4093.         gh(ti) = ty
  4094.         'gc(ti) = yellow
  4095.         IF iscd = 0 THEN PUT #6, ti + 1, ty
  4096.     NEXT crx
  4097.  
  4098.     ti = (suri + tsx - zz - 1 + q1) MOD q1
  4099.     Smooth ti
  4100.     ti = (suri + tsx + zz) MOD q1
  4101.     Smooth ti
  4102.     RETURN
  4103. ' -------------------------------------------------------------------------------------------------------x
  4104. SUB ShowAngle (a)
  4105.     zc = dcolor(CSNG(a), 0, 4, 1)
  4106.     c = zc
  4107.     IF (bbit = 0) AND (contact = 0) THEN c = black '                  blink
  4108.     IF a = 0 THEN z$ = "  "
  4109.     IF a > 0 THEN z$ = CHR$(17) + " " '                               point left
  4110.     IF a < 0 THEN z$ = " " + CHR$(16) '                               point right
  4111.     PrintVGA z$, 7, 270, c, black2
  4112.     IF LEDtri THEN c = zc ELSE c = LEDc
  4113.     osc = t
  4114.     a$ = LTRIM$(STR$(-a))
  4115.     LEDdisplay a$
  4116. ' -------------------------------------------------------------------------------------------------------x
  4117. SUB Surveyor STATIC
  4118.     DIM SSp&(1, 26), x(1), y(1)
  4119.     IF sspinit1 = 0 THEN
  4120.         s& = VARSEG(SSp&(0, 0))
  4121.         o& = VARPTR(SSp&(0, 0))
  4122.         DEF SEG = s&
  4123.         BLOAD f$(17), o& '                                            surv2.dat
  4124.         sc = white
  4125.         sspinit1 = 1
  4126.     END IF
  4127.  
  4128.     x0 = x
  4129.     ti = suri + x0 - 1
  4130.     IF ti > q1 THEN ti = ti - q1
  4131.     y0 = gh(ti)
  4132.  
  4133.     FOR i = 0 TO 26
  4134.         tx = x0 + i
  4135.         LINE (tx, y0 - 21)-(tx, y0 - 5), sc, , SSp&(0, i)
  4136.         LINE (tx, y0 - 16)-(tx, y0 - 0), sc, , SSp&(1, i)
  4137.     NEXT i
  4138.  
  4139.     '                                                                 modify ground to include Surveyor
  4140.     IF (x0 >= gs) AND (x0 < 604) AND (sspinit2 = 0) THEN
  4141.         FOR tx = x0 TO x0 + 32
  4142.             FOR ty = y0 - 20 TO glmax
  4143.                 IF POINT(tx, ty) = sc THEN
  4144.                     z = (suri + tx) MOD q1
  4145.                     gh(z) = ty
  4146.                     EXIT FOR
  4147.                 END IF
  4148.             NEXT ty
  4149.         NEXT tx
  4150.         sspinit2 = 1
  4151.     END IF
  4152.  
  4153.     FOR tx = x0 TO x0 + 26 '                                          optional shadow
  4154.         FOR ty = y0 - 21 TO y0
  4155.             p = POINT(tx, ty)
  4156.             IF p = sc THEN
  4157.                 zx = tx - (x0 + 13)
  4158.                 zy = ty - (y0 - t)
  4159.                 IF zy > (zx + 4) THEN PSET (tx, ty), gray
  4160.             END IF
  4161.         NEXT ty
  4162.     NEXT tx
  4163.  
  4164.     attack = 0
  4165.     sdd = q1
  4166.     FOR i = 180 TO 355 STEP 5 '                                       rays
  4167.         ra = i + RND * 5
  4168.         z = 25 + RND * t
  4169.         FOR j = 0 TO 1
  4170.             x(j) = (x + t) + z * c!(ra) * aspect!
  4171.             y(j) = y0 + z * s!(ra) - 1
  4172.             z = z + RND * 30 + t
  4173.         NEXT j
  4174.         xs! = (x(1) - x(0)) / 20
  4175.         ys! = (y(1) - y(0)) / 20
  4176.         FOR j = 0 TO 19
  4177.             tx = x(0) + j * xs!
  4178.             ty = y(0) + j * ys!
  4179.             x! = px! - tx
  4180.             y! = (py! - ty) * aspect!
  4181.             dd = SQR(x! * x! + y! * y!)
  4182.             IF dd < sdd THEN sdd = dd
  4183.             IF (shield = 0) OR (dd > 70) OR (j = 0) THEN PSET (tx, ty), gunmetal
  4184.             IF shield AND ((dd = 70) OR ((j = 0) AND (dd < 70))) THEN
  4185.                 LINE (sx0 + xoff, sy0 + vy!)-(tx, ty), lmsl
  4186.                 IF RND < .7 THEN
  4187.                     PSET STEP(0, 0), red
  4188.                 ELSE
  4189.                     LINE (tx - 1, ty)-(tx + 1, ty), red
  4190.                     LINE (tx, ty - 1)-(tx, ty + 1), red
  4191.                 END IF
  4192.                 EXIT FOR
  4193.             END IF
  4194.         NEXT j
  4195.         IF sdd < 20 THEN attack = 1
  4196.     NEXT i
  4197.     IF attack AND (crash = 0) AND (shield = 0) THEN
  4198.         oldr = rads
  4199.         rads = rads + RND * t + 1
  4200.         IF rads > 9999 THEN rads = 9999
  4201.         IF rads > oldr THEN
  4202.             rtl!(0) = TIMER + 5
  4203.             rtlc(0) = rads
  4204.             panelinit = 0
  4205.         END IF
  4206.     END IF
  4207. ' -------------------------------------------------------------------------------------------------------x
  4208. SUB Tile STATIC
  4209.     IF tinit = 0 THEN
  4210.         s = 7
  4211.         DIM t(1, s, s)
  4212.         FOR i = 0 TO 1
  4213.             FOR j = 0 TO 1
  4214.                 FOR k = 0 TO 90 STEP t
  4215.                     ta = k + j * 180
  4216.                     tx = j * s + (s \ 2) * c!(ta)
  4217.                     ty = j * s + (s \ 2) * s!(ta)
  4218.                     IF i THEN ty = s - ty
  4219.                     t(i, tx, ty) = 1
  4220.                 NEXT k
  4221.             NEXT j
  4222.         NEXT i
  4223.         tinit = 1
  4224.     END IF
  4225.  
  4226.     IF gstyle = 4 THEN tc = gray ELSE tc = black2
  4227.     FOR xo = gs TO q3 STEP s
  4228.         FOR yo = glmax TO (glmin - 50) STEP -s
  4229.             SELECT CASE tilef
  4230.                 CASE IS = 0
  4231.                     bp = gety(xo) + yo
  4232.                     z1 = bp MOD 128
  4233.                     z2 = (bp MOD 12) + 1
  4234.                     td = p(z1, z2)
  4235.                     kk = SGN(td AND _SHL(1, (bp MOD 8)))
  4236.                 CASE IS = 1
  4237.                     bp = SQR(xo * yo)
  4238.                     z1 = bp MOD 128
  4239.                     z2 = (bp MOD 12) + 1
  4240.                     td = p(z1, z2)
  4241.                     kk = SGN(td AND _SHL(1, (bp MOD 8)))
  4242.                 CASE IS = 2
  4243.                     kk = RND '
  4244.             END SELECT
  4245.             FOR i = 0 TO s
  4246.                 tx = xo + i
  4247.                 yy = gety(tx) + 1
  4248.                 FOR j = 0 TO s
  4249.                     ty = yo - j
  4250.                     IF ty <= yy THEN EXIT FOR
  4251.                     IF t(kk, i, j) THEN
  4252.                         zz = tx + suri
  4253.                         c1 = (sf(5, 2) = -1) OR (zz < sf(5, 0)) OR (zz > sf(5, 1)) '     McD
  4254.                         c2 = (sf(7, 2) = -1) OR (zz < sf(7, 0)) OR (zz > sf(7, 1)) '     Surv
  4255.                         IF c1 AND c2 THEN PSET (tx, ty), tc
  4256.                     END IF
  4257.                 NEXT j
  4258.             NEXT i
  4259.         NEXT yo
  4260.     NEXT xo
  4261. ' -------------------------------------------------------------------------------------------------------x
  4262.     DIM tmaa!(10), tmab!(10), tmac(10)
  4263.     IF ok AND (INSTR(fb$, "on TMA") > 0) THEN '                       landed, do Mandelbrot instead of moire
  4264.         Mandel
  4265.         GOTO tmaother
  4266.     END IF
  4267.     IF zdc = 0 THEN '                                                 then initialize
  4268.         nc = RND * 2 + 1 '                                            use 2-3 colors
  4269.         lc = -1 '                                                     last color, prevent repeats
  4270.         FOR z = 0 TO nc
  4271.             tmaa!(z) = RND + 4
  4272.             tmab!(z) = (RND - pf!) / 8
  4273.             DO
  4274.                 c = RND * 14 + 1
  4275.                 IF c = gray2 THEN c = gray '                          stars use gray2
  4276.                 IF c = white2 THEN c = white '                        stars use white2
  4277.                 IF c <> lc THEN lc = c: EXIT DO
  4278.             LOOP
  4279.             tmac(z) = c
  4280.         NEXT z
  4281.     END IF
  4282.  
  4283.     zdc = (zdc + 1) MOD 50
  4284.     FOR z = 0 TO 2
  4285.         tmaa!(z) = tmaa!(z) + tmab!(z)
  4286.     NEXT z
  4287.     y0 = glmax - 72
  4288.     y1 = y0 + 1
  4289.     y2 = glmax - 1
  4290.     LINE (x, glmax)-(x + 46, glmax), gray
  4291.  
  4292.     FOR gx = x TO x + 45
  4293.         x2! = gx / tmaa!(0)
  4294.         x2! = x2! * x2!
  4295.         FOR gy = y1 TO y2
  4296.             y2! = gy / tmaa!(0)
  4297.             y2! = y2! * y2!
  4298.             tcc = ABS((x2! + y2!) / tmaa!(1)) MOD (nc + 1)
  4299.             PSET (gx, gy), tmac(tcc)
  4300.         NEXT gy
  4301.     NEXT gx
  4302.  
  4303.     IF TIMER < cybilltime! THEN CybillPix f$(16) ELSE gotpix = 0
  4304.  
  4305.     tmaother:
  4306.     IF bolthitf THEN LINE (x, y0)-(x + 45, glmax), white, BF
  4307.  
  4308.     FOR s = 0 TO 20 '                                                 shells
  4309.         IF (shx(s) > 0) AND (shd(s) < 80) THEN
  4310.             tarx = shx(s) - suri
  4311.             tary = shy(s)
  4312.             IF (s > 0) OR (shy(s) > 200) THEN
  4313.                 GOSUB tmafl
  4314.                 ExplodeShell s '                                      show it exploded
  4315.             END IF
  4316.         END IF
  4317.     NEXT s
  4318.  
  4319.     FOR i = 2 TO 6 '                                                  not DS!
  4320.         IF (ek(i) > 0) AND (ek(i) < 30) THEN
  4321.             tarx = exl(i) '                                           where to shoot
  4322.             tary = ey(i)
  4323.             GOSUB tmafl '                                             fire laser
  4324.             ek(i) = 0
  4325.             ex(i) = 0 '                                               mark destroyed
  4326.             exv(i) = 0
  4327.         END IF
  4328.     NEXT i
  4329.     EXIT SUB
  4330.  
  4331.     tmafl: '                                                          fire laser
  4332.     FOR gx = x TO x + 45 STEP 2 '                                     along top of TMA1
  4333.         LINE (gx, y1 - 1)-(tarx, tary), blue '                        nice blue
  4334.     NEXT gx
  4335.     IF gotpix = 0 THEN '                                              not showing Cybill
  4336.         cybilltime! = TIMER + 2 '                                     keep on screen for 2 sec
  4337.         gotpix = 1 '                                                  flag onscreen
  4338.     END IF
  4339.     RETURN
  4340. ' -------------------------------------------------------------------------------------------------------x
  4341. SUB Wave STATIC '                                                     funny effect for warp speeds
  4342.     tdg = (tdg MOD 4) + 1
  4343.     FOR i = 1 TO 22
  4344.         '               1234567890123456789012
  4345.         '               TTTTHHHHHVVVVVAAAAFFFF
  4346.         osc = VAL(MID$("1111222223333344445555", i, 1))
  4347.         wll = VAL(MID$("45555", osc, 1))
  4348.         adg = (tdg + wll) MOD 4 + 1 - (wll = 4)
  4349.         z$ = MID$("agdgagdg", adg, wll)
  4350.         LEDdisplay z$
  4351.     NEXT i
  4352. ' -------------------------------------------------------------------------------------------------------x
  4353. SUB WormHole STATIC
  4354.     IF eou THEN EXIT SUB '                                            end of universe
  4355.  
  4356.     IF ei(4) = 0 THEN
  4357.         nc:
  4358.         c1 = RND * 14 + 1
  4359.         c2 = RND * 14 + 1
  4360.         IF c1 = c2 THEN GOTO nc
  4361.         IF (c1 = black2) OR (c1 = gray) THEN GOTO nc
  4362.         IF (c2 = black2) OR (c2 = gray) THEN GOTO nc
  4363.         ei(4) = 1
  4364.     END IF
  4365.  
  4366.     tx = localize(ex(4), 0, 0)
  4367.     wy = ey(4)
  4368.     ba = (ba + 30) MOD tsix
  4369.     FOR ta = 0 TO 720 STEP 2
  4370.         FOR d = 0 TO 3
  4371.             baa = (ta + ba + d * 90) MOD tsix
  4372.             tx1 = tx + ta / 8 * c!(baa)
  4373.             ty1 = wy + ta / 40 * s!(baa)
  4374.             IF d MOD 2 THEN c = c1 ELSE c = c2
  4375.             PSET (tx1, ty1), c
  4376.         NEXT d
  4377.     NEXT ta
  4378. ' -------------------------------------------------------------------------------------------------------x
  4379. SUB LGM (fc) STATIC '                                                 little green man
  4380.  
  4381.     x = x - 5
  4382.     IF LGMc = gray THEN '                                             LGM toasted - show pile of ashes
  4383.         y1 = gety(x + t) - 1
  4384.         FOR y = 0 TO 5
  4385.             LINE (x + y, y1 - y)-(x + 15 - y, y1 - y), gray
  4386.             p = VAL(MID$("162341", y + 1, 1))
  4387.             PSET (x + y + p, y1 - y), black2
  4388.             PSET (x + y + p + 3, y1 - y), black2
  4389.         NEXT y
  4390.         EXIT SUB
  4391.     END IF
  4392.  
  4393.     IF sema$ = "" THEN '                                              initialize
  4394.         DIM a(28, 1) '                                                angles
  4395.         RESTORE semadata
  4396.         FOR i = 1 TO 28 '                                             read angles
  4397.             READ z$, a(i, 0), a(i, 1)
  4398.         NEXT i
  4399.         DO
  4400.             READ z$
  4401.             IF z$ = "end" THEN EXIT DO
  4402.             sema$ = sema$ + " " + z$ + " "
  4403.         LOOP
  4404.         lc$ = CHR$(255): i = 0 '                                      lc = last character, i = index
  4405.     END IF
  4406.  
  4407.     IF crash THEN LGMc = dred '                                       white2 as many other colors g1
  4408.     IF TIMER < sema! THEN sema! = TIMER '                             midnite crossing fix
  4409.     IF (TIMER - sema!) > semat! THEN '                                signal next letter
  4410.         sema! = TIMER
  4411.         IF fc = 0 THEN '                                              flame count
  4412.             semat! = .3
  4413.             tsema$ = sema$
  4414.             IF si > 0 THEN i = si - 1: si = 0
  4415.         ELSE
  4416.             semat! = .2 '                                             0.2 seconds between letters
  4417.             IF fc < 5 THEN '                                          flame count
  4418.                 IF tsema$ <> "help  " THEN tsema$ = "!"
  4419.                 toast = 0
  4420.             ELSE
  4421.                 tsema$ = "help  "
  4422.                 toast = toast + 1
  4423.                 IF toast > 2 THEN toast = 0: LGMc = LGMc + 1
  4424.             END IF
  4425.         END IF
  4426.         i = (i MOD LEN(tsema$)) + 1
  4427.         p = INSTR(tsema$, "time is")
  4428.         IF p THEN
  4429.             z$ = MID$(TIME$, 1, 2) + MID$(TIME$, 4, 2)
  4430.             MID$(tsema$, p + 8, 4) = z$
  4431.         END IF
  4432.         y1 = gety(x) - 14
  4433.         IF demo THEN y1 = 286
  4434.         c$ = MID$(tsema$, i, 1)
  4435.         d = ASC(LCASE$(c$)) - 96
  4436.         IF d < 1 THEN d = 27
  4437.         IF c$ = "!" THEN d = 28
  4438.         p = INSTR("1234567890", c$): IF p THEN d = p - (c$ = "0")
  4439.         IF oscar THEN
  4440.             c1 = red
  4441.             c2 = gold
  4442.         ELSE
  4443.             c1 = blue
  4444.             c2 = white
  4445.         END IF
  4446.         IF (c$ <> " ") AND (c$ = lc$) THEN SWAP c1, c2
  4447.         lc$ = c$
  4448.     END IF
  4449.  
  4450.     '              1 2 3 4 5 6 7 8 9
  4451.     '              g y o r d g b
  4452.     '              r e r e r 2 2
  4453.     c = VAL(MID$("021412040906110015", (LGMc - 1) * 2 + 1, 2))
  4454.     IF bolthitf THEN c = white
  4455.     IF c = black2 THEN co = gray2 ELSE co = black2
  4456.     CIRCLE (x + t, y1 - 6), 4, c '                                    head
  4457.     PAINT (x + t, y1 - 6), c, c '                                     fill in head
  4458.     PSET (x + 8, y1 - 7), co '                                        left eye
  4459.     PSET (x + 12, y1 - 7), co '                                       right eye
  4460.     LINE (x + 9, y1 - 5)-(x + 11, y1 - 5), co '                       mouth
  4461.     LINE (x + 5, y1)-(x + 15, y1 + 12), c, BF '                       body
  4462.     IF c = black2 THEN
  4463.         CIRCLE (x + t, y1 - 6), 5, co '                               eye
  4464.         LINE (x + 5, y1)-(x + 15, y1 + 12), co, B '                   body
  4465.     END IF
  4466.  
  4467.     IF (d = 27) AND (c <> black2) AND (fc = 0) THEN '                 wiggle ears
  4468.         x2 = x + 5 - bbit
  4469.         x3 = x + 14 + bbit
  4470.         y2 = y1 - 8 + bbit
  4471.         LINE (x2, y2)-(x2 + 1, y2 + 1), c, BF
  4472.         LINE (x3, y2)-(x3 + 1, y2 + 1), c, BF
  4473.     END IF
  4474.  
  4475.     IF fc THEN '                                                      optional flame effect
  4476.         IF fc > t THEN di = 4 ELSE di = t '                           flame count
  4477.         FOR tx = x + 5 TO x + 15
  4478.             FOR ty = y1 - 9 TO y1 + 12
  4479.                 p = POINT(tx, ty)
  4480.                 z = (z + 1) MOD q1
  4481.                 IF p = c THEN
  4482.                     tc = (ty + tx + z) MOD di
  4483.                     IF tc = 0 THEN PSET (tx, ty), gold
  4484.                     IF tc = 1 THEN PSET (tx, ty), black2
  4485.                 END IF
  4486.             NEXT ty
  4487.         NEXT tx
  4488.     END IF
  4489.  
  4490.     IF c = black2 THEN c = gray2
  4491.     FOR j = 0 TO 1 '                                                  arms & flags
  4492.         a1 = a(d, j) - 90
  4493.         x2 = x + j * 20
  4494.         x3 = x2 + 26 * COS(_D2R(a1))
  4495.         y2 = y1 + 25 * SIN(_D2R(a1))
  4496.         LINE (x2, y1)-(x3, y2), c '                                   arm
  4497.         IF j = 0 THEN s = 1: IF INSTR("wxz", c$) THEN s = -s
  4498.         IF j = 1 THEN s = -1: IF INSTR("hio89", c$) THEN s = -s
  4499.         FOR q = 0 TO 3
  4500.             a1 = a1 - 90 * s
  4501.             x4 = x3 + t * COS(_D2R(a1))
  4502.             y4 = y2 + t * SIN(_D2R(a1))
  4503.             LINE -(x4, y4), gunmetal
  4504.             IF q = 1 THEN
  4505.                 sx = x4: sy = y4
  4506.                 r! = _D2R(a1 - 45 * s)
  4507.                 rx = x3 + 5 * COS(r!)
  4508.                 ry = y2 + 5 * SIN(r!)
  4509.             END IF
  4510.             IF q = 3 THEN
  4511.                 r! = _D2R(a1 - 45 * s)
  4512.                 yx = x3 + 5 * COS(r!)
  4513.                 yy = y2 + 5 * SIN(r!)
  4514.             END IF
  4515.             x3 = x4: y2 = y4
  4516.         NEXT q
  4517.         LINE -(sx, sy), gunmetal
  4518.         PAINT (rx, ry), c1, gunmetal
  4519.         PAINT (yx, yy), c2, gunmetal
  4520.     NEXT j
  4521.  
  4522.     IF c$ = UCASE$(c$) THEN
  4523.         x2 = x + 5 + SGN(INSTR("ACDHJMNOPSUV0123456789", c$)) '       letter centering
  4524.         y2 = y1 + 2
  4525.     ELSE
  4526.         x2 = x + 6 - SGN(INSTR("ijlnv", c$)) '                        as above
  4527.         y2 = y1 - SGN(INSTR("gjpqy", c$)) + 2
  4528.     END IF
  4529.  
  4530.     IF LGMc = 4 THEN tc = gold ELSE tc = red
  4531.     CALL PrintVGA(c$, x2, y2, tc, black2)
  4532. ' -------------------------------------------------------------------------------------------------------x
  4533. SUB Stars STATIC
  4534.  
  4535.     ' - starstatus  0 off, 1 on, 2+names, 3+RA & Dec & grid, 4+Mag
  4536.     ' - encodes magnitude into xy array by making negative
  4537.     ' - stars1 1797, stars2 16571, stars3 87470
  4538.     ' - parsec = 3.262 light years
  4539.  
  4540.     IF sinit = 0 THEN
  4541.         sinit = 1
  4542.         qq = 18000
  4543.         DIM starx(qq), stary(qq), starn(30), star$(2, 50)
  4544.         starmax = qq: namemax = 100
  4545.         gc = blue '                                                   grid color
  4546.         sc = gray2 '                                                  star info color
  4547.     END IF
  4548.     nh = 12 / (zoom + 1) '                                            hours (RA)
  4549.     nd = 90 / (zoom + 1) '                                            degrees (Dec)
  4550.  
  4551.     IF eou <> 0 THEN '                                                End of Universe
  4552.         alldown = 1
  4553.         FOR star = 1 TO nstars
  4554.             sy = stary(star)
  4555.             ay = ABS(sy)
  4556.             IF ay < q4 THEN '                                         less than screen bottom
  4557.                 stary(star) = stary(star) + SGN(stary(star))
  4558.                 alldown = 0 '                                         not done
  4559.             END IF
  4560.         NEXT star
  4561.         IF alldown THEN CLS: EXIT SUB
  4562.     END IF
  4563.  
  4564.     IF regen = 0 THEN CLS
  4565.     tss = starstatus
  4566.     IF starinit = 0 THEN
  4567.         starinit = 1
  4568.         eou = 0 '                                                     End of Universe
  4569.         alldown = 0
  4570.         nstars = 0
  4571.         named = 0
  4572.         rmax! = rmin + nh '                                           hours
  4573.         dmax! = dmin + nd '                                           degrees
  4574.         n1& = 0
  4575.         isred1 = 0: isred2 = 0
  4576.         rmin$ = RIGHT$("00" + LTRIM$(STR$(rmin)), 2) '                0 - 24
  4577.         dmin$ = RIGHT$("000" + LTRIM$(STR$(dmin)), 3) '               -90 to 90
  4578.         zz$ = LTRIM$(STR$(starfiles)) + rmin$ + dmin$ + ".DAT"
  4579.         IF (warp! >= 1) AND (starfiles = 2) THEN tfs = 1 ELSE tfs = starfiles
  4580.         SELECT CASE tfs
  4581.             CASE IS = 0
  4582.                 th! = 5.07 + zoom: tf$ = "STARS1.DAT": d$ = "DAT1\": nl& = 1797
  4583.             CASE IS = 1
  4584.                 th! = 7.07 + zoom: tf$ = "STARS2.dat": d$ = "DAT2\": nl& = 16571
  4585.             CASE IS = 2
  4586.                 th! = 8.07 + zoom: tf$ = "STARS3.dat": d$ = "DAT3\": nl& = 87470
  4587.         END SELECT
  4588.         IF okrick = 0 THEN d$ = ""
  4589.         tf1$ = d$ + "SI" + zz$: tif1 = _FILEEXISTS(tf1$)
  4590.         tf2$ = d$ + "SX" + zz$: tif2 = _FILEEXISTS(tf2$)
  4591.         tf3$ = d$ + "SY" + zz$: tif3 = _FILEEXISTS(tf3$)
  4592.         isstari = ((tif1 + tif2 + tif3) = -3)
  4593.         IF regen THEN isstari = 0
  4594.         IF isstari THEN
  4595.             GOSUB readstar
  4596.             GOTO plot
  4597.         END IF
  4598.         regen = 0
  4599.         FOR i = 0 TO qq
  4600.             starx(i) = 0
  4601.             stary(i) = 0
  4602.         NEXT i
  4603.         tf = FREEFILE
  4604.         OPEN tf$ FOR INPUT AS #tf
  4605.         DO
  4606.             INPUT #tf, r!, d!, m!, dis$, n$
  4607.             n1& = n1& + 1
  4608.             IF (starfiles > -1) AND ((n1& MOD h) = 1) THEN
  4609.                 zz1 = h + t '                                         hundred + 10 = 110
  4610.                 zz2 = zz1 + n1& / nl& * 500
  4611.                 LINE (gs, 0)-(639, 40), black, BF
  4612.                 LINE (zz1, t)-(zz1 + 500, 13), red, B
  4613.                 LINE (zz1, t)-(zz2, 13), red, BF
  4614.                 PrintCGA "Loading stars...", 300, 14, red, black, 0
  4615.                 PrintCGA tf1$, 110, 14, red, black, 0
  4616.                 IF mstar > 0 THEN '                                   regenerating all starfiles, show progress
  4617.                     zz2 = zz1 + mstar / 1368 * 500
  4618.                     LINE (zz1, 27)-(zz1 + 500, 30), red, B
  4619.                     LINE (zz1, 27)-(zz2, 30), red, BF
  4620.                 END IF
  4621.                 timemachine
  4622.             END IF
  4623.             'y$ = STR$(INT(VAL(dis$) * 3.262 * h) / h) '              convert to light years
  4624.             'y$ = LTRIM$(RIGHT$(SPACE$(6) + y$, 6))
  4625.  
  4626.             sa = (LEFT$(n$, 1) = "*") '                               show always (low mag)
  4627.             tt! = th! '                                               temp threshold
  4628.             IF ABS(d!) > 70 THEN tt! = tt! + 2
  4629.             IF ABS(d!) > 80 THEN tt! = tt! + 2
  4630.             abd = ABS(d!): tt! = tt! - (abd > 70) - (abd > 80)
  4631.             IF sa OR (m! <= tt!) THEN '                               show always or bright
  4632.                 FOR z1 = 0 TO 1 '                                     why why why?
  4633.                     FOR z2 = 0 TO 1
  4634.                         tr! = r! + z1 * 24
  4635.                         td! = d! + z2 * 180
  4636.                         IF (tr! > rmin) AND (tr! < rmax!) AND (td! > dmin) AND (td! < dmax!) THEN sr = z1: sd = z2
  4637.                     NEXT z2
  4638.                 NEXT z1
  4639.                 tx = q3 - (r! - rmin + sr * 24) / nh * q3
  4640.                 ty = q4 - (d! - dmin + sd * 180) / nd * q4
  4641.                 IF (tx > 0) AND (tx < q3) AND (ty > 0) AND (ty < q4) THEN
  4642.                     IF m! <= 3 THEN tx = -tx
  4643.                     IF m! <= 2 THEN ty = -ty
  4644.                     nstars = nstars + 1
  4645.                     starx(nstars) = tx
  4646.                     stary(nstars) = ty
  4647.                     IF sa THEN n$ = RIGHT$(n$, LEN(n$) - 1) '         show always, remove asterisk
  4648.                     IF LEN(n$) AND (sa OR (m! < 2)) AND (named < namemax) THEN
  4649.                         named = named + 1
  4650.                         starn(named) = nstars
  4651.                         star$(0, named) = n$
  4652.                         IF n$ = "Antares" THEN isred1 = nstars
  4653.                         IF n$ = "Mira" THEN isred2 = nstars
  4654.                         star$(1, named) = LTRIM$(STR$(m!)) + " " + dis$ ' + "P " + y$ + "L"
  4655.                         star$(2, named) = LTRIM$(STR$(r!)) + " " + LTRIM$(STR$(d!))
  4656.                     END IF
  4657.                 END IF
  4658.             END IF
  4659.         LOOP UNTIL EOF(tf) OR (nstars = starmax)
  4660.         CLOSE #tf
  4661.     END IF
  4662.  
  4663.     IF isstari = 0 THEN GOSUB writestar
  4664.     plot:
  4665.     CLS
  4666.     tss = starstatus
  4667.     IF auto AND (gstyle = 0) THEN tss = 4
  4668.  
  4669.     IF tss > 2 THEN '                                                 optional grids
  4670.         FOR i = 0 TO nh '                                             vertical lines
  4671.             tx = (i / nh * q3) MOD (q3 + 1)
  4672.             LINE (tx, 0)-(tx, q4), gc, , &H1111
  4673.             z = rmax! - i: z = z + (z > 23) * 24 '                    optional labeling
  4674.             TinyFont STR$(z), tx - 2, 0, -gc
  4675.         NEXT i
  4676.         z! = nd / t
  4677.         FOR de! = 0 TO z! '                                           horizontal lines
  4678.             ty = q4 - ((de! / z! * q4) MOD (q4 + 1))
  4679.             LINE (gs, ty)-(q3, ty), gc, , &H1111
  4680.             z = dmin + de! * t '                                      optional lableling
  4681.             z = z + ((z > 90) - (z < -90)) * 180
  4682.             z$ = STR$(z)
  4683.             TinyFont z$, q3 - LEN(z$) * 4 - 2, ty + 2, -gc
  4684.         NEXT de!
  4685.     END IF
  4686.  
  4687.     FOR star = 1 TO nstars
  4688.         stx = starx(star): ax = ABS(stx)
  4689.         sty = stary(star): ay = ABS(sty)
  4690.         IF warp! THEN
  4691.             tx = ax + SGN(-vx!) * warp! * 2
  4692.             IF ay < glmax THEN LINE (ax, ay)-(tx, ay), gray2
  4693.             IF tx < 1 THEN tx = tx + (q3 + 1)
  4694.             IF tx > q3 THEN tx = tx - (q3 + 1)
  4695.             starx(star) = tx * SGN(stx + .01)
  4696.         ELSE
  4697.             m = 3 + (stx < 0) + (sty < 0) '                           magnitude
  4698.             IF m < 3 THEN tc = white2 ELSE tc = gray2 '               slightly different brightness
  4699.             IF twinkle AND (RND > .9) AND (tc = white2) THEN tc = gray2
  4700.             IF star = isred1 THEN tc = red '                          Mira and Antares
  4701.             IF star = isred2 THEN tc = red
  4702.             IF m = 1 THEN '                                           small cross if < 2
  4703.                 LINE (ax - 1, ay)-(ax + 1, ay), tc
  4704.                 LINE (ax, ay - 1)-(ax, ay + 1), tc
  4705.             ELSE '                                                    bright or dim point
  4706.                 PSET (ax, ay), tc
  4707.             END IF
  4708.             ' IF (star MOD 37) = 0 THEN TinyFont STR$(star), ax, ay, sc ' diagnostic
  4709.             FOR i = 1 TO named '                                      show names & info
  4710.                 IF star = starn(i) THEN
  4711.                     FOR j = 0 TO tss - 2
  4712.                         IF j THEN
  4713.                             ty = ay + j * 9 + (j = 2) * 3 + 1
  4714.                             TinyFont star$(j, i), ax, ty, sc
  4715.                         ELSE
  4716.                             PrintCGA star$(j, i), ax, ay + j * 9, sc, -1, 1
  4717.                         END IF
  4718.                     NEXT j
  4719.                 END IF
  4720.             NEXT i
  4721.         END IF
  4722.     NEXT star
  4723.     IF rick THEN '                                                    show counts
  4724.         z$ = LTRIM$(STR$(starfiles)) + STR$(nstars) + STR$(starmax) + STR$(named) + STR$(th!)
  4725.         TinyFont z$, 86, 20, red
  4726.     END IF
  4727.     EXIT SUB
  4728.  
  4729.     readstar:
  4730.     tf = FREEFILE
  4731.     OPEN tf1$ FOR INPUT AS #tf
  4732.     INPUT #tf, nstars, named, isred1, isred2
  4733.     n1 = nstars
  4734.     FOR i = 1 TO named
  4735.         INPUT #tf, starn(i)
  4736.         FOR j = 0 TO 2
  4737.             INPUT #tf, star$(j, i)
  4738.         NEXT j
  4739.     NEXT i
  4740.     CLOSE #tf
  4741.     OPEN tf2$ FOR BINARY AS #tf
  4742.     GET #tf, , starx()
  4743.     CLOSE #tf
  4744.     OPEN tf3$ FOR BINARY AS #tf
  4745.     GET #tf, , stary()
  4746.     CLOSE #tf
  4747.     RETURN
  4748.     ' -----------------------------------------------------------------------------------
  4749.     writestar:
  4750.     tf = FREEFILE
  4751.     OPEN tf1$ FOR OUTPUT AS #tf
  4752.     PRINT #tf, nstars; ","; named; ","; isred1; ","; isred2
  4753.     FOR i = 1 TO named
  4754.         PRINT #tf, starn(i);
  4755.         FOR j = 0 TO 2
  4756.             PRINT #tf, ","; star$(j, i);
  4757.         NEXT j
  4758.         PRINT #tf, CHR$(13);
  4759.     NEXT i
  4760.     CLOSE #tf
  4761.  
  4762.     OPEN tf2$ FOR BINARY AS #tf
  4763.     PUT #tf, , starx()
  4764.     CLOSE #tf
  4765.  
  4766.     OPEN tf3$ FOR BINARY AS #tf
  4767.     PUT #tf, , stary()
  4768.     CLOSE #tf
  4769.     RETURN
  4770. ' -------------------------------------------------------------------------------------------------------x
  4771. SUB Borg (lbx, bmy) STATIC
  4772.     IF borginit = 0 THEN
  4773.         z$ = SPACE$(t) + "WE ARE THE BORG - RESISTANCE IS FUTILE" + SPACE$(50)
  4774.         moire = 0: moired = 1: xn = 19: yn = 8: zz = 13: p0 = &HAAAA
  4775.         DIM mat$(yn)
  4776.         FOR i = 1 TO yn
  4777.             mat$(i) = STRING$(xn, ASC("0"))
  4778.         NEXT i
  4779.         borginit = 1 '                                                      direction for guts
  4780.     END IF
  4781.     p1 = &H5555: p2 = &HAAAA
  4782.  
  4783.     'lbx = localize(bmx, 58, 46)
  4784.     'IF lbx = 999 THEN
  4785.     '   IF (demo = 1) THEN ex(1) = 3170 ELSE EXIT SUB ' keep around in demo mode
  4786.     'END IF
  4787.  
  4788.     borgt = bmy - 40 '                                                top
  4789.     borgl = lbx - 40 '                                                left side
  4790.     borgr = lbx + 52 '                                                right side
  4791.  
  4792.     x1 = lbx - 46: y1 = bmy - 34: x2 = lbx + 46: y2 = bmy + 34
  4793.  
  4794.     FOR i = 0 TO zz
  4795.         tx1 = x1 + i: tx2 = x2 + i: ty1 = y1 - i: ty2 = y2 - i
  4796.         IF (tx1 + 2) < gs THEN SWAP p1, p2
  4797.         LINE (tx1, ty1)-(tx1, ty2), black2 '                          left
  4798.         LINE (tx1, ty1)-(tx1, ty2), dred, , p0
  4799.         LINE (tx1 + 2, ty2)-(tx2, ty2), black2 '                      bottom
  4800.         LINE (tx1 + 2, ty2)-(tx2, ty2), dred, , p1
  4801.     NEXT i
  4802.     FOR i = 0 TO zz
  4803.         tx2 = x2 + i: ty1 = y1 - i + 2: ty2 = y2 - i
  4804.         LINE (tx2, ty1)-(tx2, ty2), red '                             right
  4805.         tx1 = x1 + i: tx2 = x2 + i: ty1 = y1 - i
  4806.         LINE (tx1, ty1)-(tx2, ty1), red '                             top
  4807.     NEXT i
  4808.     LINE (x2 + 1, y1)-(x2 + zz, y1 - zz + 1), black2 '                top right diag
  4809.     LINE (x1 + 1, y2)-(x1 + zz, y2 - zz + 1), black2 '                bottom left diag
  4810.  
  4811.     x1 = x1 + 8: y1 = y1 + 1: y2 = y2 - 8 '                           inside of craft
  4812.  
  4813.     LINE (x1 + 4, y1)-(x2 - 1, y2 - 4), black2, BF '                  blank interior
  4814.     SELECT CASE bstyle1
  4815.         CASE IS = 0 '                                                 ala Matrix
  4816.             '                                                         84 60
  4817.             FOR y = 0 TO yn - 1
  4818.                 mat$(y) = mat$(y + 1)
  4819.             NEXT y
  4820.             FOR x = 1 TO xn
  4821.                 MID$(mat$(yn), x, 1) = CHR$(48 + RND)
  4822.             NEXT x
  4823.             FOR y = 0 TO yn
  4824.                 ty = y1 + y * 6
  4825.                 TinyFont mat$(y), x1 + 5, ty + 1, blue
  4826.             NEXT y
  4827.         CASE IS = 1 '                                                 Moire
  4828.             moire = moire + moired
  4829.             IF ABS(moire) > t THEN moired = -moired
  4830.             FOR ty = y1 TO y2
  4831.                 FOR tx = x1 TO x2 - 1
  4832.                     z1! = tx / (moire + 40): z1! = z1! * z1!
  4833.                     z2! = ty / (moire + 40): z2! = z2! * z1!
  4834.                     IF ((z1! + z2!) MOD 4) THEN
  4835.                         IF ((z1! + z2!) MOD 2) THEN tc = blue ELSE tc = dred
  4836.                         PSET (tx, ty), tc
  4837.                     END IF
  4838.                 NEXT tx
  4839.             NEXT ty
  4840.         CASE IS = 2 '                                                 boxes
  4841.             x2 = x2 - 3: xs = x2 - x1: ys = y2 - y1
  4842.             FOR z = 1 TO h
  4843.                 bx1 = x1 + RND * xs + 2
  4844.                 by1 = y1 + RND * ys + 2
  4845.                 bx2 = bx1 + (RND - pf!) * xs / z * t + 2
  4846.                 by2 = by1 + (RND - pf!) * ys / z * t + 2
  4847.                 IF bx2 < x1 THEN bx2 = x1
  4848.                 IF bx2 > x2 THEN bx2 = x2
  4849.                 IF by2 < y1 THEN by2 = y1
  4850.                 IF by2 > y2 THEN by2 = y2
  4851.                 c = 1 + SGN(z MOD 2) * 12
  4852.                 IF RND > .95 THEN c = gunmetal
  4853.                 LINE (bx1, by1)-(bx2, by2), c, B
  4854.             NEXT z
  4855.     END SELECT
  4856.  
  4857.     IF bstyle2 = 777 THEN
  4858.         'FOR i = borgl + 5 TO borgr - t STEP 5 '                       ion drive
  4859.         '    IF RND > .6 THEN
  4860.         '        PSET (i, bmy + 27), white
  4861.         '        FOR j = 0 TO 30
  4862.         '            IF RND * h < j THEN
  4863.         '                ty = y2 - j + 39
  4864.         '                LINE (i, ty)-STEP(1, 0), blue
  4865.         '            END IF
  4866.         '        NEXT j
  4867.         '    END IF
  4868.         'NEXT i
  4869.     ELSE
  4870.         FOR k = -30 TO 30 STEP 15 '                                   exhaust, 5 flames
  4871.             ' CIRCLE (lbx + k, bmy + 27), 2, blue, , , .75
  4872.             ' PAINT (lbx + k, bmy + 27), blue, blue
  4873.             bit = bit XOR 1 '                                         alternate
  4874.             FOR i = 0 TO 20
  4875.                 ba1 = (ba1 + i) MOD tsix
  4876.                 zzz = ((20 - i) / 4) * SIN(_D2R(ba1))
  4877.                 ty0 = y2 + i + 8 + bit + 1
  4878.                 tx1 = lbx - zzz + k
  4879.                 tx2 = lbx + zzz + k
  4880.                 LINE (tx1, ty0)-(tx2, ty0), blue, , RND * &H7FFF
  4881.             NEXT i
  4882.         NEXT k
  4883.     END IF
  4884.  
  4885.     '                                                                 scroll Borg message along top and right side of craft
  4886.     ti = (ti MOD (50 * 16)) + 8 '                                     index into text, speed 1-??
  4887.     tx1 = lbx - 46 - 3
  4888.     ty1 = bmy - 31
  4889.  
  4890.     PrintLines z$, ti, ti + 90, tx1, ty1 - 1, black2, -88, 2, 2 '     top
  4891.     PrintLines z$, ti, ti + 90, tx1, ty1 - 0, white2, -88, 2, 2
  4892.  
  4893.     tx1 = lbx + 46 - 2: ty1 = bmy - 32 '                              right
  4894.     PrintLines z$, ti + 91, ti + 91 + 67, tx1, ty1, black2, -99, 2, 2
  4895.  
  4896.     'IF RND > .8 THEN '                                                side thrusters
  4897.     '    IF RND > pf! THEN
  4898.     '        tx1 = lbx - 48: txi = -1: ty1 = bmy
  4899.     '    ELSE
  4900.     '        tx1 = lbx + 60: txi = 1: ty1 = bmy - 12
  4901.     '    END IF
  4902.     '    FOR i = 34 TO 0 STEP -1
  4903.     '        z = i * SIN(_d2r((i + 90) * 2))
  4904.     '        LINE (tx1, ty1 - z)-(tx1, ty1 + z), blue
  4905.     '        tx1 = tx1 + txi * 2
  4906.     '    NEXT i
  4907.     'END IF
  4908. ' -------------------------------------------------------------------------------------------------------x
  4909. SUB Volcano STATIC
  4910.  
  4911.     IF vinit = 0 THEN
  4912.         q = q3 * 2 '                                                  640*2=1280
  4913.         DIM vox!(q), voy!(q), vxi!(q), vyi!(q)
  4914.         vinit = 1
  4915.     END IF
  4916.  
  4917.     vx = sf(4, 2)
  4918.     IF ABS((TIMER MOD t) - (RND * t)) > 5 THEN
  4919.         FOR i = 0 TO q
  4920.             IF vyi!(i) < -3 THEN k! = .6 ELSE k! = .8 '               kill some
  4921.             IF (vox!(i) = 0) OR (RND > k!) THEN '                     dead or kill
  4922.                 vox!(i) = vx + RND * t - 5 '                          initial x
  4923.                 voy!(i) = gety(INT(vox!(i) - suri)) - 1 '             initial y
  4924.                 ta = RND * 40 + 70 '                                  angle
  4925.                 r! = _D2R(ta)
  4926.                 vxi!(i) = (RND * t + 1) * COS(r!) '                   x velocity
  4927.                 vyi!(i) = (RND * t + 2) * SIN(r!) '                   y velocity
  4928.             END IF
  4929.         NEXT i
  4930.     END IF
  4931.  
  4932.     FOR i = 0 TO q
  4933.         tx = vox!(i) - suri '                                         local x
  4934.         ty = voy!(i) '                                                local y
  4935.         IF shield THEN z = 0: GOSUB protect
  4936.         IF ty > q4 THEN '                                             off screen
  4937.             vox!(i) = 0 '                                             flag for init
  4938.         ELSE
  4939.             IF (tx >= gs) AND (tx <= q3) THEN
  4940.                 IF vyi!(i) < -(RND * 4) THEN
  4941.                     c = gunmetal
  4942.                     IF (ty > gety(tx)) AND (gstyle = 0) THEN c = black ' black on white
  4943.                 ELSE
  4944.                     c = orange
  4945.                 END IF
  4946.                 PSET (tx, ty), c
  4947.                 IF i MOD 2 THEN LINE -STEP(RND * 2 - 1, RND * 2 - 1), c
  4948.             END IF
  4949.         END IF
  4950.         vyi!(i) = vyi!(i) - .25 '                                     decelerate
  4951.         vox!(i) = vox!(i) - vxi!(i) '                                 new x
  4952.         voy!(i) = voy!(i) - vyi!(i) '                                 new y
  4953.     NEXT i
  4954.     EXIT SUB
  4955.  
  4956.     protect:
  4957.     dx! = px! - tx '                                                  distance x
  4958.     dy! = (py! - ty) * aspect! '                                      distance y
  4959.     dd = SQR(dx! * dx! + dy! * dy!) '                                 distance
  4960.     IF dd < 70 THEN '                                                 at shield
  4961.         z = 1
  4962.         vyi!(i) = 0
  4963.         ty = ty - SGN(dy!)
  4964.         GOTO protect
  4965.     END IF
  4966.     IF z THEN '                                                       laser
  4967.         vxi!(i) = SGN(dx!) * (5 + RND * 5)
  4968.         LINE (sx0 + xoff, sy0 + vy!)-(tx, ty), lmsl
  4969.     END IF
  4970.     RETURN
  4971. ' -------------------------------------------------------------------------------------------------------x
  4972. SUB Mandel '                                                          appears in TMA-1 when landed on
  4973.     xd! = .044
  4974.     yd! = .036
  4975.     zz! = TIMER * 4
  4976.     LINE (x, glmax - 1)-(x + 45, glmax - 71), black2, BF
  4977.     FOR xx = 0 TO 23
  4978.         FOR yy = 0 TO 70
  4979.             MandelX! = -2 + yy * yd!
  4980.             MandelY! = -1 + xx * xd!
  4981.             Real# = 0
  4982.             Imag# = 0
  4983.             Itera = 20
  4984.             DO
  4985.                 Itera = Itera - 1
  4986.                 hold# = Imag#
  4987.                 Imag# = (Real# * Imag#) * 2 + MandelY!
  4988.                 Real# = Real# * Real# - hold# * hold# + MandelX!
  4989.                 Size# = (Real# * Real# + Imag# * Imag#) - 4
  4990.             LOOP UNTIL (Itera = 0) OR (Size# > 0)
  4991.             IF Size# > 0 THEN
  4992.                 tc = (Itera + zz!) MOD 15 + 1
  4993.                 ty = glmax - 71 + yy
  4994.                 PSET (x + xx, ty), tc '                               left half
  4995.                 PSET (x + 45 - xx, ty), tc '                          right half
  4996.             END IF
  4997.         NEXT yy
  4998.     NEXT xx
  4999.  
  5000.     'RESTORE 2010
  5001.     'FOR i = 1 TO 7
  5002.     '    READ z$
  5003.     '    tx = center - LEN(z$) * 4
  5004.     '    PrintVGA z$, tx, 50 + i * 13, white, 0
  5005.     'NEXT i
  5006. ' -------------------------------------------------------------------------------------------------------x
  5007. SUB CarWash
  5008.     DIM cwpat&(7)
  5009.     cwpat&(0) = &HFFFF
  5010.     cwpat&(1) = &H1111
  5011.     cwpat&(2) = &H2222
  5012.     cwpat&(3) = &H4444
  5013.     cwpat&(4) = &H8888
  5014.     cwpat&(5) = cwpat&(3)
  5015.     cwpat&(6) = cwpat&(2)
  5016.     cwpat&(7) = cwpat&(1)
  5017.  
  5018.     x1 = x + 1
  5019.     x2 = x1 + 99
  5020.     y0 = 305
  5021.     IF bolthitf THEN tc = white ELSE tc = gunmetal
  5022.     LINE (x, y0 - 19)-(x2, y0 - 1), tc, BF '                          sign background
  5023.     PrintCGA "MONTEZUMA", x + 14, 286, orange, black2, 0
  5024.  
  5025.     IF bbit THEN
  5026.         c1 = green
  5027.         c2 = blue
  5028.         c3 = green
  5029.     ELSE
  5030.         c1 = black2
  5031.         c2 = -1
  5032.         c3 = gunmetal
  5033.     END IF
  5034.     PrintCGA "Car Wash", x + 17, 294, c1, c2, 0
  5035.     LINE (x, y0 - 19)-(x2, y0 - 1), c3, B
  5036.  
  5037.     IF bolthitf THEN tc = white ELSE tc = blue2
  5038.     LINE (x, y0)-(x2, q4), tc, BF '                                   spray zone
  5039.     LINE (x1, y0)-(x1, q4), white, , cwpat&(1) '                      left side &H1111
  5040.     LINE (x2, y0)-(x2, q4), white, , cwpat&(1) '                      right side
  5041.  
  5042.     IF cwsi = 0 THEN cwsi = 1 '                                       spray angle increment
  5043.     cwsd = cwsd + cwsi '                                              spray direction
  5044.     IF (cwsd = 0) OR (cwsd = t) THEN cwsi = -cwsi '                   hit limits, reverse
  5045.     FOR z = 1 TO 5
  5046.         x1 = x + z * t + 24
  5047.         FOR i = -4 TO 4 STEP 2
  5048.             td = cwsd - 5 + i
  5049.             IF z MOD 2 = 0 THEN
  5050.                 td = -td
  5051.                 up = 0 '                                              use pattern
  5052.             ELSE
  5053.                 iz = (iz + 1) MOD th
  5054.                 up = iz MOD 7 + 1
  5055.             END IF
  5056.             ra = (90 + td * 3) MOD tsix
  5057.             tx = 64 * c!(ra) * 1.1
  5058.             ty = y0 + 64 * s!(ra)
  5059.             LINE (x1, y0)-(x1 + tx, ty), gunmetal, , cwpat&(up) '     along top
  5060.             LINE (x + 0, y0)-(x1 + tx \ 2, ty), gunmetal, , cwpat&(up) ' tl
  5061.             LINE (x + h, y0)-(x1 + tx \ 2, ty), gunmetal, , cwpat&(up) ' tr
  5062.             tx = x1 + 20 * c!(ra) * 1.2
  5063.             ty = q4 - 20 * s!(ra) \ 2
  5064.             LINE (x1, q4)-(tx, ty), white '                           bottom
  5065.         NEXT i
  5066.         iz = iz + 1
  5067.     NEXT z
  5068. ' -------------------------------------------------------------------------------------------------------x
  5069. SUB DeathStar (dtx, tf$) STATIC
  5070.     IF dsinit = 0 THEN
  5071.         DIM tc(1)
  5072.         xc = 320: yc = 175: dty = 170
  5073.         IF INSTR(tf$, "rs") THEN
  5074.             xs = 100: ys = 73: bs = ys + 6: rs = 4020 '               small
  5075.         ELSE
  5076.             xs = 130: ys = 110: bs = ys - t: rs = 8000 '              large
  5077.         END IF
  5078.         wx1 = xc - xs: wx2 = xc + xs
  5079.         wy1 = yc - ys: wy2 = yc + ys
  5080.         CLOSE #8
  5081.         REDIM buff&(rs)
  5082.         OPEN tf$ FOR BINARY AS #8
  5083.         dsinit = 1
  5084.     END IF
  5085.  
  5086.     IF darkstarc = 0 THEN c1 = black2: c2 = blue: c3 = blue2
  5087.     IF darkstarc = 1 THEN c1 = gunmetal: c2 = red: c3 = dred
  5088.     tc(0) = c2: tc(1) = c3
  5089.  
  5090.     CIRCLE (dtx, dty + 6), xs, black2 '                               define area
  5091.     FOR z = -1 TO 1 STEP 2 '                                          circle may be barely on screen
  5092.         PAINT (dtx + z * (xs - 1), dty), c1, black2 '                 far left & far right
  5093.     NEXT z
  5094.  
  5095.     xx = dtx - xc
  5096.     yy = dty - yc
  5097.     zz = (zz + darkstars) MOD 49 '                                   0-48 images
  5098.     rn& = zz * rs * 4 + 1
  5099.     GET #8, rn&, buff&()
  5100.     n = -1
  5101.     FOR i = wx1 TO wx2
  5102.         tx = xx + i
  5103.         IF tx > q3 THEN GOTO bork
  5104.         FOR j = wy1 TO wy2 STEP 15
  5105.             FOR k = 0 TO 1
  5106.                 n = n + 1
  5107.                 IF (buff&(n) > 0) AND (tx >= gs) THEN
  5108.                     LINE (tx, j)-(tx, j + 15), tc(k), , buff&(n)
  5109.                     IF darkstart THEN LINE (tx, j + 1)-(tx, j + 16), tc(k), , buff&(n)
  5110.                 END IF
  5111.             NEXT k
  5112.         NEXT j
  5113.     NEXT i
  5114.     bork:
  5115.     GOSUB Title
  5116.  
  5117.     boltx = q1 '                                                      handy large value
  5118.  
  5119.     IF RND > .7 THEN '                                                lightning bolt
  5120.         a! = 90 + (RND * 20) - t '                                    starting angle
  5121.         r! = bs '                                                     starting radius
  5122.         bolty = q1 '                                                  handy large value
  5123.         FOR i = -h TO h '                                             -100 to 100
  5124.             tx = dtx + i
  5125.             ty = gety(tx)
  5126.             IF ty <= bolty THEN
  5127.                 IF (bolty = q1) OR (RND > .8) THEN boltx = tx
  5128.                 bolty = ty
  5129.             END IF
  5130.         NEXT i
  5131.         DO
  5132.             xx = dtx + r! * COS(_D2R(a!)) * aspect!
  5133.             yy = dty + r! * SIN(_D2R(a!))
  5134.             IF yy > q4 THEN EXIT DO '                                 q4 = 349
  5135.             a! = a! + RND * 2 - 1 + SGN(xx - boltx) * .05
  5136.             r! = r! + RND * 2.18 - 1
  5137.             IF r! < bs THEN r! = bs
  5138.             GOSUB dot
  5139.         LOOP
  5140.     END IF
  5141.  
  5142.     nc = RND * 3 '                                                    "internal" lightning
  5143.     FOR s = 0 TO nc
  5144.         DO
  5145.             a! = RND * tsix
  5146.         LOOP UNTIL ABS(a! - 90) > 20
  5147.         td = bs \ 2 + RND * bs \ 2
  5148.         IF RND > .8 THEN td = RND * bs
  5149.         r! = td
  5150.         qq = 6
  5151.         DO
  5152.             xx = dtx + r! * COS(_D2R(a!)) * aspect!
  5153.             yy = dty + r! * SIN(_D2R(a!))
  5154.             GOSUB dot
  5155.             a! = a! + RND * 2.15 - 1
  5156.             r! = r! - RND * 2.18 + qq
  5157.             qq = qq - 1 - (qq = 1)
  5158.         LOOP UNTIL r! < td
  5159.     NEXT s
  5160.     EXIT SUB
  5161.  
  5162.     dot:
  5163.     dx! = px! - xx
  5164.     dy! = py! - yy
  5165.     dd! = SQR(dx! * dx! + dy! * dy!)
  5166.     tcc = 1 - (RND > pf!) * 14
  5167.     IF (shield = 0) AND (dd! < 15) THEN bolthit = 1
  5168.     IF shield AND (dd! <= 70) THEN
  5169.         tcc = green
  5170.         IF RND > .95 THEN LINE (sx0 + xoff, sy0 + vy!)-(xx, yy), red
  5171.     END IF
  5172.     PSET (xx, yy), tcc
  5173.     RETURN
  5174.  
  5175.     Title:
  5176.     IF atu = 0 THEN atu = t: ati = 1
  5177.     atu = atu + ati
  5178.     IF (atu = t) OR (atu = 25) THEN ati = -ati
  5179.     t$ = "EPCOR"
  5180.     FOR i = 1 TO LEN(t$)
  5181.         z$ = MID$(t$, i, 1)
  5182.         aa = -90 + (i - 3) * atu
  5183.         tx = dtx + bs * COS(_D2R(aa)) * aspect! - 5
  5184.         ty = dty + bs * SIN(_D2R(aa))
  5185.         PrintVGA z$, tx, ty, c3, white
  5186.     NEXT i
  5187.     RETURN
  5188. ' -------------------------------------------------------------------------------------------------------x
  5189. SUB Parachute STATIC
  5190.     IF contact THEN
  5191.         cy! = cy! + 5
  5192.         IF cy! > 500 THEN cy! = 500: chs = 1: paraf = 0
  5193.         chs = chs - 1
  5194.     ELSE
  5195.         cy! = py! - h
  5196.         IF (py! > 120) AND (chs < 40) THEN chs = chs + 2
  5197.     END IF
  5198.     FOR ta = 0 TO tsix
  5199.         r! = _D2R(ta) / 2
  5200.         tx = px! + chs * COS(r!) * 2
  5201.         ty = cy! - chs * SIN(r!)
  5202.         PSET (tx, ty), gray2
  5203.         IF (ta / 20) MOD 2 THEN tc = red ELSE tc = white2
  5204.         LINE -(tx, cy!), tc
  5205.         IF (ta MOD 40) = 0 THEN LINE -(px! - ASO, cy! + 82 + ASO * t), gray2
  5206.     NEXT ta
  5207. ' -------------------------------------------------------------------------------------------------------x
  5208. SUB Comet (comx, comy)
  5209.     IF crash THEN tc = white ELSE tc = green
  5210.     FOR i = 0 TO 1
  5211.         CIRCLE (comx, comy), i + 1, tc, , , .78
  5212.         c$ = MID$("HalleBerry", i * 5 + 1, 5)
  5213.         tx = comx + t
  5214.         ty = comy + i * 8
  5215.         IF (tx > gs) AND (tx < 590) AND (ty > 0) AND (ty < 330) THEN PrintCGA c$, tx, ty, white2, gunmetal, 0
  5216.     NEXT i
  5217.     FOR ta = -t TO t STEP 5 '                                         tail, -10 to 10
  5218.         zz = 50 + RND * tw '                                          vary tail length
  5219.         r! = _D2R(140 + ta * 4)
  5220.         x1 = comx + 3 * COS(r!) '                                     tail start
  5221.         y1 = comy + 3 * SIN(r!)
  5222.         r! = _D2R(140 + ta \ 2)
  5223.         x2 = comx + zz * COS(r!) '                                    tail end
  5224.         y2 = comy + zz * SIN(r!)
  5225.         LINE (x1, y1)-(x2, y2), white2, , RND * &H7FFF
  5226.     NEXT ta
  5227. ' -------------------------------------------------------------------------------------------------------x
  5228. SUB CybillPix (pfile$) STATIC
  5229.     IF cpinit = 0 THEN
  5230.         z = 1225
  5231.         DIM cbuff(z)
  5232.         s& = VARSEG(cbuff(0))
  5233.         o& = VARPTR(cbuff(0))
  5234.         DEF SEG = s&
  5235.         BLOAD pfile$, o&
  5236.         cpinit = 1
  5237.     END IF
  5238.     IF ((x + 5) >= gs) AND (x < 600) THEN PUT (x + 5, 289), cbuff(), PSET
  5239. ' -------------------------------------------------------------------------------------------------------x
  5240. SUB Quit
  5241.     SCREEN 0, 0, 0, 0
  5242.     CLS
  5243.     CLOSE
  5244.     IF iscd THEN SYSTEM
  5245.  
  5246.     OPEN settings$ FOR OUTPUT AS #1
  5247.     z = auto: d$ = "auto": GOSUB pconfig '                            1 full autopilot
  5248.     z = background: d$ = "panel": GOSUB pconfig '                     2 instrument panel
  5249.     z = cbh: d$ = "cbh": GOSUB pconfig '                              3 constant black holes
  5250.     z = demo: d$ = "skyf": GOSUB pconfig '                            4 0 off 1 all features
  5251.     z = doclock: d$ = "clock": GOSUB pconfig '                        5 clock display on DS
  5252.     z = invincible: d$ = "invincible": GOSUB pconfig '                6 invincible
  5253.     z = jitter: d$ = "thrust": GOSUB pconfig '                        7 thrust calculation
  5254.     z = LEDc: d$ = "ledc": GOSUB pconfig '                            8 LED color
  5255.     z = LEDtri: d$ = "ledtri": GOSUB pconfig '                        9 LED tri-color
  5256.     z = radarf: d$ = "radar": GOSUB pconfig '                         10 radar visible
  5257.     z = shield: d$ = "shield": GOSUB pconfig '                        11 Star Trek!
  5258.     z = showmap: d$ = "map": GOSUB pconfig '                          12 feature locations at screen top
  5259.     z = starstatus: d$ = "stari": GOSUB pconfig '                     13 0off 1names 2info 3info 4grid
  5260.     z = zoom: d$ = "starz": GOSUB pconfig '                           14 starfield
  5261.     z = skyoff: d$ = "skys": GOSUB pconfig '                          15 sky objects
  5262.     z = gstyle: d$ = "gstyle": GOSUB pconfig '                        16 ground type
  5263.     z = mouseswap: d$ = "mouse": GOSUB pconfig '                      17 mouse buttons
  5264.     z = porb: d$ = "porb": GOSUB pconfig '                            18 pointers or bars for instruments
  5265.     z = starfiles: d$ = "stars": GOSUB pconfig '                      19 star quantity
  5266.     z = mdelay: d$ = "speed": GOSUB pconfig '                         20 system speed
  5267.     z = SGN(_FULLSCREEN): d$ = "fullscreen": GOSUB pconfig '          21 fullscreen
  5268.  
  5269.     CLOSE
  5270.     SYSTEM
  5271.  
  5272.     pconfig:
  5273.     PRINT #1, d$; ","; z
  5274.     RETURN
  5275. ' -------------------------------------------------------------------------------------------------------x
  5276. SUB Henonp (f) STATIC
  5277.  
  5278.     IF henoni = 0 THEN
  5279.         z = 20000
  5280.         DIM tb(z)
  5281.         henoni = 1
  5282.     END IF
  5283.  
  5284.     s& = VARSEG(tb(0)) '                                              for BLOADING images
  5285.     o& = VARPTR(tb(0))
  5286.     DEF SEG = s&
  5287.  
  5288.     IF crash THEN GOTO nosp
  5289.     wts = (wts + 1) MOD 3 '                                           what to show
  5290.     FOR pass = 1 TO 2
  5291.         FOR i = 0 TO 2
  5292.             IF ((i = wts) OR (pass = 2)) AND (TIMER < rtl!(i)) THEN
  5293.                 SELECT CASE i
  5294.                     CASE IS = 0 '                                     radiation
  5295.                         BLOAD f$(19), o& '                            rad.dat
  5296.                         PUT (0, 0), tb(0), PSET
  5297.                         gotblank = 0
  5298.                     CASE IS = 1 '                                     thermometer
  5299.                         GOSUB loadblank
  5300.                         LINE (20, 28)-(26, 56), 0, BF '               shadow
  5301.                         LINE (20, 26)-(24, 56), 0, BF '               erase old
  5302.                         LINE (20, 26)-(24, 56), red, B '              outline
  5303.                         CIRCLE (23, 60), 5, 0 '                       bulb shadow
  5304.                         CIRCLE (24, 60), 5, 0 '                       bulb shadow
  5305.                         CIRCLE (22, 59), 5, red '                     bulb
  5306.                         PAINT (22, 59), red, red '                    bulb fill
  5307.                         ty = 56 - rtlc(1) / 100 * 30 '                reading
  5308.                         LINE (20, ty)-(24, 56), red, BF
  5309.                     CASE IS = 2 '                                     lightning
  5310.                         GOSUB loadblank
  5311.                         uc = uc XOR 1
  5312.                         IF uc THEN tc = yellow ELSE tc = gold
  5313.                         PSET (17, 27)
  5314.                         LINE -(33, 27), tc
  5315.                         LINE -(24, 43), tc
  5316.                         LINE -(29, 43), tc
  5317.                         LINE -(16, 63), tc
  5318.                         LINE -(21, 47), tc
  5319.                         LINE -(13, 47), tc
  5320.                         LINE -(17, 27), tc
  5321.                         PAINT (22, 47), tc, tc
  5322.                 END SELECT
  5323.                 z = rtlc(i) '                                         0rads 1temperature 2bolts
  5324.                 lf = -1
  5325.                 PrepAndShowLED CSNG(z), 4, 10
  5326.                 EXIT SUB
  5327.             END IF
  5328.         NEXT i
  5329.     NEXT pass
  5330.  
  5331.     nosp: '                                                           no special = Henon plots
  5332.     IF f <> lf THEN
  5333.         tf$ = f$(f)
  5334.         BLOAD tf$, o&
  5335.         gotblank = 0
  5336.         lf = f
  5337.     END IF
  5338.     hc = (hc + 1) MOD 13 '                                            h1-h5 contain 13 images each
  5339.     IF crash THEN hc = 0 '                                            h6.dat only has one page
  5340.     PUT (0, 0), tb(hc * 1500), PSET '                                 includes
  5341.     PrepAndShowLED 0, 4, 0
  5342.     EXIT SUB
  5343.  
  5344.     loadblank: '                                                      not really blank - has program name
  5345.     IF gotblank = 0 THEN '                                               and clock/McD/speed/count box
  5346.         BLOAD f$(39), o& '                                            is lanblank.dat
  5347.         gotblank = 1
  5348.     END IF
  5349.     PUT (0, 0), tb(0), PSET
  5350.     RETURN
  5351. ' -------------------------------------------------------------------------------------------------------x
  5352. SUB Grave (x, fb$) STATIC
  5353.     tx1 = x: IF tx1 < gs THEN tx1 = gs
  5354.     tx2 = x + 68: IF tx2 > q3 THEN tx2 = q3
  5355.     IF tx1 >= tx2 THEN EXIT SUB
  5356.     VIEW SCREEN(tx1, 300)-(tx2, q4)
  5357.     IF bolthitf THEN
  5358.         tc = white: tc2 = white
  5359.     ELSE
  5360.         tc = gray: tc2 = gasoline
  5361.     END IF
  5362.     LINE (x, 300)-(x + 68, q4), tc, BF
  5363.     LINE (x + 2, 302)-(x + 66, 347), black2, B
  5364.     FOR x1 = 0 TO 1
  5365.         FOR y1 = 0 TO 1
  5366.             x2 = x + x1 * 68 - 4
  5367.             y2 = 300 + y1 * 42 - 1
  5368.             LINE (x2, y2)-(x2 + 9, y2 + 9), tc2, BF
  5369.             LINE (x2, y2)-(x2 + 9, y2 + 9), black2, B
  5370.         NEXT y1
  5371.     NEXT x1
  5372.  
  5373.     FOR z = 0 TO 1
  5374.         LINE (x + z, 300 + z)-(x + 68 - z, q4 - z), tc2, B
  5375.     NEXT z
  5376.  
  5377.     IF INSTR(fb$, "g on a ") = 0 THEN
  5378.         z$ = "  JFK      R.I.P. 1917 1963"
  5379.     ELSE
  5380.         IF (TIMER MOD 10) < 5 THEN
  5381.             z$ = "B FROST    R.I.P. 1952 2006"
  5382.         ELSE
  5383.             z$ = "R FROST    R.I.P. 1957 2019"
  5384.         END IF
  5385.     END IF
  5386.  
  5387.     PrintVGA LEFT$(z$, 7), x + 5, 317, black2, white2
  5388.  
  5389.     FOR i = 0 TO 1
  5390.         d$ = MID$(z$, i * 9 + 10, 9)
  5391.         c1 = black2: c2 = gasoline
  5392.         FOR j = 1 TO 9
  5393.             c$ = MID$(d$, j, 1)
  5394.             ta = (ta + 23) MOD tsix
  5395.             zz = (3 + 3 * SIN(ta * ATN(1) / 45)) * i
  5396.             tx = x + (j - 2) * 6 + 12
  5397.             ty = 304 + i * 24 + zz
  5398.             PrintCGA c$, tx, ty, c1, c2, 0
  5399.         NEXT j
  5400.     NEXT i
  5401.     VIEW SCREEN(gs, 0)-(q3, q4)
  5402. ' -------------------------------------------------------------------------------------------------------x
  5403. SUB FlagandFireworks STATIC
  5404.     IF fmax = 0 THEN
  5405.         fs = 60: fq = 600: fmax = fs
  5406.         DIM flagb(fq)
  5407.         DIM ve!(fs), ho!(fs), pe(fs), x!(fs), y!(fs), c(fs)
  5408.     END IF
  5409.  
  5410.     IF flx = 0 THEN '                                                 initialize
  5411.         z = SGN(sf(sf, 2) - (px! + suri)) '                           to plant flag opposite feature
  5412.         IF z = 0 THEN z = -1 '                                        optional, prevent middle
  5413.         FOR i = -1 TO 1 STEP 2 '                                      check sides
  5414.             tx = px! + i * z * 22
  5415.             ty = gety(-tx)
  5416.             '                                                         prevent PUT beyond 580 for grave in demo mode
  5417.             IF (tx < 580) AND (ABS(ty - sy1) < t) THEN
  5418.                 flx = tx
  5419.                 fly = ty
  5420.                 rev = 0
  5421.                 IF nation = 1 THEN nation = 2 ELSE nation = 1
  5422.                 initfw = 0
  5423.                 EXIT SUB
  5424.             END IF
  5425.         NEXT i
  5426.         EXIT SUB
  5427.     END IF
  5428.  
  5429.     IF liftoff THEN GOTO pflag
  5430.  
  5431.     IF initfw = 0 THEN '                                              fireworks launch & init
  5432.         ve! = RND * 5 + 16 - lob * 8 '                                vertical velocity
  5433.         ho! = RND * 5 + 2 '                                           horizontal velocity
  5434.         x!(0) = px! '                                                 initial x, middle of craft
  5435.         y!(0) = py! - 15 + ASO * 7 '                                  initial y, top of craft
  5436.         ea = -(RND * t) '                                             explode at 0-10
  5437.         IF lho! > 0 THEN ho! = -ho! '                                 reverse direction half the time
  5438.         lho! = ho!
  5439.         DO '                                                          launch
  5440.             x!(0) = x!(0) + ho! / t '                                 t = 10
  5441.             y!(0) = y!(0) - ve! / t
  5442.             ve! = ve! - .1 '                                          slow down
  5443.             PSET (x!(0), y!(0)), yellow '                             launch track
  5444.         LOOP UNTIL ve! < ea '                                         explode
  5445.         FOR i = 1 TO fmax
  5446.             z = nation - 1
  5447.             z = z * 6 + (i MOD (3 - z)) * 2 + 1 '                     color index
  5448.             '                rewhblreye
  5449.             c(i) = VAL(MID$("0415010414", z, 2)) '                    color
  5450.             z! = RND * 5 + 1 '                                        velocity
  5451.             ta = (i * 6) MOD tsix '                                    angle
  5452.             ve!(i) = z! * c!(ta) '                                    vertical velocity
  5453.             ho!(i) = z! * s!(ta) * 1.8 '                              horizontal velocity
  5454.             x!(i) = x!(0) + ho!(i) * 2 + xe! '                        start of arm
  5455.             y!(i) = y!(0) + ve!(i) * 2 + ye!
  5456.             pe(i) = RND * 5 + t '                                     persistance of arm
  5457.         NEXT i
  5458.         initfw = 1 '                                                  mark initialized
  5459.     END IF
  5460.  
  5461.     f = 1 '                                                           assume done
  5462.     FOR q = 0 TO 1 '                                                  show shell exploding
  5463.         FOR i = 1 TO fmax '                                           arms
  5464.             IF pe(i) THEN '                                           persistance of arm
  5465.                 f = 0 '                                               not done
  5466.                 pe(i) = pe(i) - 1 '                                   persistance
  5467.                 x!(i) = x!(i) + ho!(i)
  5468.                 y!(i) = y!(i) + ve!(i)
  5469.                 ve!(i) = ve!(i) + .4 '                                gravity modifies vertical
  5470.                 IF RND > .1 THEN
  5471.                     LINE (x!(i), y!(i))-(x!(i) + RND, y!(i) + RND), c(i), B
  5472.                 END IF
  5473.             END IF
  5474.         NEXT i
  5475.     NEXT q
  5476.     IF f THEN initfw = 0 '                                            end of this one, start another
  5477.  
  5478.     pflag:
  5479.     IF sn <> nation THEN '                                            new, or user changed it
  5480.         sn = nation '                                                 save current nation
  5481.         s& = VARSEG(flagb(0)) '                                       segment
  5482.         o& = VARPTR(flagb(0)) '                                       offset
  5483.         DEF SEG = s& '                                                set segment
  5484.         BLOAD f$(19 + nation), o& '                                   load array 20=USA 21=USSR
  5485.         sx = 0
  5486.         rev = 0
  5487.     END IF
  5488.  
  5489.     REDIM f2(600) '                                                   FLAG
  5490.     ty = fly - 80
  5491.     LINE (flx - 1, fly)-(flx - 1, ty), white '                        pole
  5492.     zx = flx - rev * 71
  5493.     GET (zx, ty)-(zx + 70, ty + 32), f2() '                           was flx
  5494.     PUT (zx, ty), flagb(), PSET '                                     flag
  5495.  
  5496.     '                                                                 optional move flag to left of pole
  5497.     IF (flx < px!) AND (rev = 0) AND (liftoff = 0) THEN
  5498.         FOR rx = 0 TO 69
  5499.             FOR ry = 0 TO 32
  5500.                 p = POINT(flx + rx, ty + ry)
  5501.                 PSET (flx - rx - 2, ty + ry), p
  5502.             NEXT ry
  5503.         NEXT rx
  5504.         PUT (flx, ty), f2(), PSET '                                   restore original area
  5505.         GET (flx - 71, ty)-(flx - 2, ty + 32), flagb() '              get new
  5506.         rev = 1
  5507.         zx = flx - 71
  5508.     END IF
  5509.     REDIM f2(0)
  5510.  
  5511.     sx = sx + t '                                                     optional unfurl flag
  5512.     IF sx > 70 THEN sx = 70
  5513.     IF sx < 70 THEN
  5514.         IF rev THEN
  5515.             LINE (zx, ty)-(zx + 71 - sx, ty + 32), 0, BF
  5516.         ELSE
  5517.             LINE (zx + sx, ty)-(zx + 71, ty + 32), 0, BF
  5518.         END IF
  5519.     END IF
  5520. ' -------------------------------------------------------------------------------------------------------x
  5521. SUB MakeSur
  5522.     IF iscd THEN EXIT SUB
  5523.     DIM z!(t), a1(t), v1(t), lz(t)
  5524.     msflag = 1
  5525.     VIEW
  5526.     CLS
  5527.     FOR gh = -2 TO 9 '                                                -2 demo, -1 flat, 0-9 rocks
  5528.         z$ = "Creating surfaces" + STR$(gh + 3) + " of 12"
  5529.         LINE (s, 0)-(q3, 20), 0, BF
  5530.         PrintVGA z$, 320 - LEN(z$) * 4, 2, white, black
  5531.         timemachine
  5532.  
  5533.         IF INKEY$ = CHR$(27) THEN Quit
  5534.         f$ = "S" + LTRIM$(STR$(gh))
  5535.         IF gh = -2 THEN f$ = "sd"
  5536.         IF gh = -1 THEN f$ = "sl"
  5537.         f$ = f$ + ".DAT"
  5538.         CLOSE #6
  5539.         OPEN f$ FOR RANDOM AS #6 LEN = 2
  5540.         FOR i = 1 TO q1 '                                             6400, 10 pages
  5541.             PUT #6, i, glmax
  5542.         NEXT i
  5543.         IF gh < 0 THEN GOTO keepflat
  5544.         FOR i = 1 TO 4 '                                              make sine waves
  5545.             z!(i) = RND * 36 / 550
  5546.             a1(i) = RND * tsix
  5547.             v1(i) = RND * gh * 2
  5548.         NEXT i
  5549.         FOR i = 0 TO q1
  5550.             z! = 0
  5551.             FOR j = 1 TO 4
  5552.                 y! = v1(j) * SIN((i - a1(j)) * z!(j))
  5553.                 z! = z! + y! * 4
  5554.             NEXT j
  5555.             IF (i > 5320) AND (i < 5560) THEN z! = z! / 4 - 40 '      make Hollywood higher
  5556.             z = glmax - ABS(z!)
  5557.             IF z < glmin THEN z = glmin
  5558.             PUT #6, i + 1, z
  5559.         NEXT i
  5560.         Smooth 5319
  5561.         Smooth 5559
  5562.         keepflat:
  5563.         IF gh = -2 THEN tz = 3130 ELSE tz = 2240
  5564.         FOR i = -51 TO 51 '                                           volcano
  5565.             z = glmax - (51 - ABS(i))
  5566.             PUT #6, tz + i, z
  5567.         NEXT i
  5568.         Smooth 2240 - 50
  5569.         Smooth 2240 + 50
  5570.         z = 302
  5571.         FOR i = -5 TO 5 '                                             volcano top
  5572.             PUT #6, tz + i, z
  5573.         NEXT i
  5574.         IF gh > -1 THEN '                                             ground height not flat, add rocks/small craters
  5575.             FOR i = -1 TO 1 STEP 2 '                                  up or down
  5576.                 rocks = RND * h + h '                                 rocks & indentations
  5577.                 FOR j = 1 TO rocks
  5578.                     rx = RND * 6380 + t
  5579.                     zz = RND * 4 + 1
  5580.                     FOR k = -zz TO zz
  5581.                         GET #6, rx + k, z
  5582.                         z = z - zz * i + ABS(k) * i
  5583.                         IF z < glmin THEN z = glmin
  5584.                         IF z > glmax THEN z = glmax
  5585.                         PUT #6, rx + k, z
  5586.                     NEXT k
  5587.                 NEXT j
  5588.             NEXT i
  5589.         END IF
  5590.         Smooth q1 - 1 '                                               6399 - 0 transition
  5591.  
  5592.         FOR i = 1 TO t '                                              create landing zones
  5593.             IF gh = -2 THEN '                                         compress onto 1 page
  5594.                 lz(i) = 3050 + (i - 1) * 80
  5595.             ELSE
  5596.                 lz(i) = 320 + (i - 1) * (q3 + 1) '                    1 per page
  5597.             END IF
  5598.         NEXT i
  5599.         IF gh = -2 THEN '                                             demo terrain
  5600.             SWAP lz(9), lz(t) '                                       move grave 1 page left
  5601.             SWAP lz(2), lz(4) '                                       move car wash 2 pages right
  5602.         END IF
  5603.         'hs = (RND * 20 + 1) * -(gh <> -2) ' height of Surveyor ground
  5604.  
  5605.         hs = 0
  5606.         RESTORE features
  5607.         FOR i = 1 TO t '                                              10 features, create landing zones beside each
  5608.             READ z$, x, y, lz
  5609.             sf(i, 0) = lz(i) - x \ 2 '                                start
  5610.             sf(i, 1) = sf(i, 0) + x '                                 end
  5611.             sf(i, 2) = (sf(i, 0) + sf(i, 1)) \ 2 '                    middle
  5612.             IF i = 4 THEN GOTO isvolcano
  5613.             FOR x2 = -lz TO lz
  5614.                 z = hs * (y = 0) * (i <> 5)
  5615.                 IF i = 3 THEN z = 40 '                                LGM
  5616.                 IF i = 4 THEN z = 50 - ABS(x2) / 2
  5617.                 IF gh <> -2 THEN
  5618.                     z = glmax - z
  5619.                     PUT #6, sf(i, 2) + x2, z
  5620.                 END IF
  5621.             NEXT x2
  5622.             FOR x2 = sf(i, 0) TO sf(i, 1) '                           target
  5623.                 GET #6, x2 + 1, z
  5624.                 z = z + y * (y <> 0)
  5625.                 PUT #6, x2 + 1, z
  5626.             NEXT x2
  5627.             IF gh <> -2 THEN
  5628.                 Smooth sf(i, 2) - lz
  5629.                 Smooth sf(i, 2) + lz
  5630.             END IF
  5631.             isvolcano:
  5632.         NEXT i
  5633.  
  5634.         Smooth sf(1, 0) '                                             Area 51
  5635.         Smooth sf(1, 1)
  5636.  
  5637.         RESTORE BigM '                                                McDonalds
  5638.         y = 0
  5639.         DO
  5640.             READ z$
  5641.             IF z$ = "x" THEN EXIT DO
  5642.             y = y + 1
  5643.             FOR x = 1 TO LEN(z$)
  5644.                 IF MID$(z$, x, 1) = "X" THEN
  5645.                     z = glmax + y - 38
  5646.                     PUT #6, sf(5, 0) + x + 1, z
  5647.                 END IF
  5648.             NEXT x
  5649.         LOOP
  5650.  
  5651.         suri = 0
  5652.         FOR i = 1 TO q1 '                                             optional, show progress
  5653.             GET #6, i + 1, y
  5654.             y = gh * 25 + y / 6 + 20
  5655.             PSET (i \ t, y), 1
  5656.         NEXT i
  5657.     NEXT gh
  5658.     msflag = 0
  5659. ' -------------------------------------------------------------------------------------------------------x
  5660. SUB Area51 (tf$) STATIC
  5661.     IF a51i = 0 THEN
  5662.         pi! = _D2R(180)
  5663.         zz! = ATN(1) / 45 * 3
  5664.         ac1 = red
  5665.         ac2 = white2
  5666.         fc$ = "0105030709101412"
  5667.         a51i = 1
  5668.     END IF
  5669.  
  5670.     IF bolthitf THEN GOTO aother
  5671.  
  5672.     tx = x + 33
  5673.     FOR i = 20 TO h STEP 5
  5674.         z = (z + 2) MOD 45
  5675.         FOR j = 0 TO 1
  5676.             SWAP ac1, ac2
  5677.             FOR k = 0 TO 3
  5678.                 aa = k * 45 + z
  5679.                 a1! = _D2R(aa) - zz!
  5680.                 a2! = _D2R(aa) + zz!
  5681.                 IF j THEN
  5682.                     a1! = pi! - a1!
  5683.                     a2! = pi! - a2!
  5684.                 END IF
  5685.                 IF a1! < 0 THEN a1! = 0
  5686.                 IF a2! < 0 THEN a2! = 0
  5687.                 IF a2! < a1! THEN SWAP a1!, a2!
  5688.                 CIRCLE (tx, 308), i, ac1, a1!, a2!
  5689.             NEXT k
  5690.         NEXT j
  5691.     NEXT i
  5692.  
  5693.     IF invincible THEN GOTO aother
  5694.     dx! = px! - tx
  5695.     dy! = 280 - py!
  5696.     IF (ABS(dx!) < 81) AND (ABS(dy!) < 61) AND (liftoff = 0) THEN
  5697.         IF contact = 0 THEN mes$(1) = "AREA 51 ELEVATOR ACTIVATED"
  5698.         _DELAY .1
  5699.         FOR tx2 = sx1 TO sx2 STEP 1
  5700.             LINE (tx2, sy1 + 2)-(tx, 309), gray
  5701.         NEXT tx2
  5702.         IF sy1 > 310 THEN
  5703.             LINE (sx1 - 1, sy1 + 2)-(tx, 309), black
  5704.             LINE (sx2 + 1, sy1 + 2)-(tx, 309), black
  5705.         END IF
  5706.         px! = px! - SGN(dx!)
  5707.         IF ABS(dx!) < 2 THEN
  5708.             IF py! > 280 THEN j = 0 ELSE j = 2
  5709.         ELSE
  5710.             IF py! > 280 THEN j = -2 ELSE j = 1
  5711.         END IF
  5712.         py! = py! + j
  5713.         a = 0
  5714.         thrust! = 0
  5715.         vx! = 0
  5716.         vy! = 0
  5717.         b2b = 1
  5718.         '  LINE (gs, 280)-(q3, 280), red
  5719.         GOTO bingo
  5720.     END IF
  5721.  
  5722.     aother:
  5723.     IF bb2! = 0 THEN bb2! = TIMER + 2
  5724.     IF TIMER > bb2! THEN
  5725.         bb2! = TIMER + 2
  5726.         b2b = 1 - b2b
  5727.     END IF
  5728.  
  5729.     bingo:
  5730.     IF contact THEN b2b = 1
  5731.     IF b2b THEN
  5732.         IF bolthitf THEN tc = white ELSE tc = dred
  5733.         FOR i = 1 TO 4
  5734.             tx = x + i * t + 3
  5735.             PrintVGA MID$("AREA", i, 1), tx, 313, white2, tc
  5736.         NEXT i
  5737.         FOR nu = 0 TO 1
  5738.             FOR ty = 0 TO 4
  5739.                 bp = VAL("&H" + MID$("26227E8E2E", nu * 5 + ty + 1, 1))
  5740.                 sp = 1
  5741.                 FOR tx = 1 TO 4
  5742.                     IF bp AND 1 THEN
  5743.                         tx2 = x + 52 - tx * 4 - nu * 16
  5744.                         ty2 = 309 + ty * 5 + 15
  5745.                         LINE (tx2, ty2)-STEP(3, 4), tc, BF
  5746.                         IF sp THEN sp = 0: LINE (tx2 + 4, ty2)-STEP(0, 4), white2
  5747.                     END IF
  5748.                     bp = bp \ 2
  5749.                 NEXT tx
  5750.             NEXT ty
  5751.         NEXT nu
  5752.     ELSE
  5753.         OPEN tf$ FOR INPUT AS #5 '                                    alien.dat (head)
  5754.         zc = (zc + 1) MOD 8 '                                         color
  5755.         FOR i = 1 TO 32
  5756.             LINE INPUT #5, z$
  5757.             FOR j = 1 TO LEN(z$)
  5758.                 c$ = MID$(z$, j, 1)
  5759.                 IF c$ <> "." THEN '                                   . = transparent
  5760.                     IF c$ = " " THEN
  5761.                         tc = VAL(MID$(fc$, zc * 2 + 1, 2))
  5762.                         IF bolthitf THEN tc = white
  5763.                     ELSEIF c$ = "r" THEN '                            spooky eyes
  5764.                         tc = red
  5765.                     ELSE
  5766.                         tc = black2 '                                 eyes/nose/mouth
  5767.                     END IF
  5768.                     x2 = x + j + t
  5769.                     y2 = 312 + i
  5770.                     PSET (x2, y2), tc
  5771.                 END IF
  5772.             NEXT j
  5773.         NEXT i
  5774.         CLOSE #5
  5775.     END IF
  5776. ' -------------------------------------------------------------------------------------------------------x
  5777. SUB UFO (tx0, ty0, txi) STATIC '                                      so pathetic a graphic that it's funny, maybe
  5778.     aa = (aa + 5) MOD tsix
  5779.     tx = tx0 + t * COS(_D2R(aa))
  5780.     ty = ty0 + t * SIN(_D2R(aa))
  5781.     FOR i = 0 TO 55
  5782.         CIRCLE (tx, ty), i, gunmetal, , , .15
  5783.     NEXT i
  5784.     FOR i = 8 TO 15
  5785.         IF i MOD 2 THEN tc = orange ELSE tc = black2
  5786.         CIRCLE (tx, ty - 12), i, tc, , , .35
  5787.     NEXT i
  5788.     tc = VAL(MID$("020414", (ty MOD 3) * 2 + 1, 2))
  5789.     p = (p + 1) MOD 5
  5790.     IF txi < 0 THEN tp = 4 - p ELSE tp = p
  5791.     FOR z = -2 TO 2
  5792.         tx2 = tx + z * 16
  5793.         CIRCLE (tx2, ty), 5 - ABS(z), black2, , , .7
  5794.         IF tp = (z + 2) THEN tc2 = tc ELSE tc2 = black2
  5795.         PAINT (tx2, ty), tc2, black2
  5796.         CIRCLE (tx2, ty), 5 - ABS(z), tc2, , , .7
  5797.     NEXT z
  5798.     LINE (tx - 30, ty + 8)-(tx - 35, ty + 20), orange '               legs
  5799.     LINE (tx - 37, ty + 20)-(tx - 31, ty + 20), orange
  5800.     LINE (tx + 30, ty + 8)-(tx + 35, ty + 20), orange '               pads
  5801.     LINE (tx + 32, ty + 20)-(tx + 38, ty + 20), orange
  5802. ' -------------------------------------------------------------------------------------------------------x
  5803. SUB TinyFont (d$, tx, ty, tc) STATIC '                                3*5
  5804.     IF fontinit = 0 THEN '                                            initialize
  5805.         DIM sp(13, 4)
  5806.         RESTORE tinyfontd
  5807.         FOR n = 0 TO 13
  5808.             READ g$
  5809.             FOR i = 0 TO 4
  5810.                 READ z
  5811.                 sp(n, i) = z * 4096
  5812.             NEXT i
  5813.         NEXT n
  5814.         fontinit = 1
  5815.     END IF
  5816.  
  5817.     FOR z = 1 TO LEN(d$)
  5818.         z$ = MID$(d$, z, 1)
  5819.         zz = INSTR(".-: ", z$)
  5820.         IF zz THEN d = zz + 9 ELSE d = VAL(z$)
  5821.         IF (tc = 1) AND (RND > .9) THEN ttc = 3 ELSE ttc = tc '       Borg effect (some bright)
  5822.         FOR i = 0 TO 4
  5823.             x2 = tx + z * 4 + j - 4
  5824.             LINE (x2, ty + i)-(x2 + 4, ty + i), ABS(ttc), , sp(d, i)
  5825.         NEXT i
  5826.     NEXT z
  5827. ' -------------------------------------------------------------------------------------------------------x
  5828. SUB GraphSpeed STATIC
  5829.     IF speedi = 0 THEN
  5830.         spq = t: psp = 500
  5831.         DIM spt!(spq)
  5832.         DIM pspeed(psp)
  5833.         DIM m(3) AS _MEM
  5834.         m(0) = _MEM(spt!(0))
  5835.         m(1) = _MEM(spt!(1))
  5836.         m(2) = _MEM(pspeed(0))
  5837.         m(3) = _MEM(pspeed(1))
  5838.         speedi = 1
  5839.     END IF
  5840.  
  5841.     IF spt! = 0 THEN
  5842.         spt! = TIMER
  5843.         zmin! = h
  5844.         zran! = 2
  5845.         sphac = psp + 1
  5846.     ELSE
  5847.         _MEMCOPY m(1), m(1).OFFSET, 4 * spq TO m(0), m(0).OFFSET
  5848.         _MEMCOPY m(3), m(3).OFFSET, 2 * psp TO m(2), m(2).OFFSET
  5849.  
  5850.         IF spt! > TIMER THEN spt! = TIMER
  5851.         spt!(spq) = (TIMER - spt!) * h * t
  5852.         spt! = TIMER
  5853.         z! = 0
  5854.         FOR i = 1 TO spq
  5855.             z! = z! + spt!(i)
  5856.         NEXT i
  5857.         pspeed(psp) = z! / spq
  5858.         spmin = q1: spmax = -spmin
  5859.         sphac = sphac - 1 - (sphac = 0)
  5860.  
  5861.         IF rick = 0 THEN EXIT SUB
  5862.  
  5863.         FOR i = sphac TO psp
  5864.             spx = 113 + i
  5865.             spy = zmin! + (pspeed(i) - zmin!) / zran!
  5866.             IF i = sphac THEN
  5867.                 PSET (spx, spy), orange
  5868.             ELSE
  5869.                 LINE -(spx, spy), orange
  5870.             END IF
  5871.             IF pspeed(i) <= spmin THEN spmin = pspeed(i): spminx = spx: spminy = spy
  5872.             IF pspeed(i) >= spmax THEN spmax = pspeed(i): spmaxx = spx: spmaxy = spy
  5873.         NEXT i
  5874.  
  5875.         spsta = FIX(spmin / h) * h
  5876.         spend = INT(spmax / h + pf!) * h
  5877.         spend = spend - (spend = spsta) * h
  5878.         FOR i = spsta TO spend STEP h
  5879.             spy = zmin! + (i - zmin!) / zran!
  5880.             LINE (110, spy)-(614, spy), green, , &H1111
  5881.             z$ = RIGHT$("  " + STR$(i), 4)
  5882.             TinyFont z$, 87, spy - 2, orange
  5883.             TinyFont z$, 620, spy - 2, orange
  5884.         NEXT i
  5885.  
  5886.         z$ = LTRIM$(STR$(spmin))
  5887.         ty = spminy - 15
  5888.         TinyFont z$, spminx + 5, ty, orange
  5889.         LINE (spminx, ty + 5)-(spminx, ty - 5), orange
  5890.  
  5891.         z$ = LTRIM$(STR$(spmax))
  5892.         ty = spmaxy + 15
  5893.         IF ty > q4 THEN ty = q4 - 20
  5894.         TinyFont z$, spmaxx + 5, ty, orange
  5895.         LINE (spmaxx, ty)-(spmaxx, ty + t), orange
  5896.     END IF
  5897. ' -------------------------------------------------------------------------------------------------------x
  5898. SUB Smooth (p1)
  5899.     p2 = p1 + 1
  5900.     zz = t
  5901.     i1 = (p1 - zz + q1) MOD q1
  5902.     i2 = (p2 + zz + q1) MOD q1
  5903.     IF msflag THEN '                                                  making surfaces, array not valid
  5904.         GET #6, i1 + 1, y1
  5905.         GET #6, i2 + 1, y2
  5906.     ELSE
  5907.         y1 = gh(i1)
  5908.         y2 = gh(i2)
  5909.     END IF
  5910.     m! = (y1 + y2) / 2
  5911.     d! = (y1 - y2) / zz / 2
  5912.     FOR x = 1 TO zz
  5913.         s! = d! * (zz - x)
  5914.         i1 = (p2 + zz - x + q1) MOD q1
  5915.         i2 = (p1 - zz + x + q1) MOD q1
  5916.         gh(i1) = m! - s!
  5917.         gh(i2) = m! + s!
  5918.         IF iscd = 0 THEN
  5919.             PUT #6, i1 + 1, gh(i1)
  5920.             PUT #6, i2 + 1, gh(i2)
  5921.         END IF
  5922.         'IF msflag = 0 THEN
  5923.         '    IF gc(i1) = gray THEN gc(i1) = red
  5924.         '    IF gc(i2) = gray THEN gc(i2) = yellow
  5925.         'END IF
  5926.     NEXT x
  5927. ' -------------------------------------------------------------------------------------------------------x
  5928. SUB SaveImage (f$) '                                                  this sub from qb64.org website (modified)
  5929.     IF iscd THEN EXIT SUB
  5930.     VIEW SCREEN(0, 0)-(q3, q4)
  5931.     bpp& = 8
  5932.     tx& = 640
  5933.     ty& = 350
  5934.     '       XXXX   1XXXX
  5935.     '     12345678901234
  5936.     b$ = "BM????_RGF????" + MKL$(40) + MKL$(tx&) + MKL$(ty&) + MKI$(1) + MKI$(bpp&) + MKL$(0) + "????" + STRING$(16, 0) 'partial BMP header info(???? to be filled later)
  5937.     FOR c& = 0 TO 255 '                                               read BGR color settings from JPG image + 1 byte spacer(CHR$(0))
  5938.         cv& = _PALETTECOLOR(c&, 0) '                                  color attribute to read
  5939.         b$ = b$ + CHR$(_BLUE32(cv&)) + CHR$(_GREEN32(cv&)) + CHR$(_RED32(cv&)) + CHR$(0) 'spacer byte
  5940.     NEXT
  5941.     MID$(b$, 11, 4) = MKL$(LEN(b$)) '                                 image pixel data offset (BMP header)
  5942.     IF ((x& * 3) MOD 4) THEN padder$ = STRING$(4 - ((x& * 3) MOD 4), 0)
  5943.     FOR py& = ty& - 1 TO 0 STEP -1
  5944.         z$ = ""
  5945.         FOR px& = 0 TO tx& - 1
  5946.             c& = POINT(px&, py&) '                                    2 bit values are large LONG values
  5947.             z$ = z$ + CHR$(ABS(c&) MOD 256)
  5948.         NEXT px&
  5949.         d$ = d$ + z$ + padder$
  5950.     NEXT py&
  5951.     MID$(b$, 35, 4) = MKL$(LEN(d$)) '                                 image size (BMP header)
  5952.     b$ = b$ + d$ '                                                    total file data bytes to create file
  5953.     MID$(b$, 3, 4) = MKL$(LEN(b$)) '                                  size of data file (BMP header)
  5954.     f& = FREEFILE
  5955.     OPEN f$ FOR OUTPUT AS #f&: CLOSE #f& '                            erases an existing file
  5956.     OPEN f$ FOR BINARY AS #f&
  5957.     PUT #f&, , b$
  5958.     CLOSE #f&
  5959.     VIEW SCREEN(gs, 0)-(q3, q4)
  5960. ' -------------------------------------------------------------------------------------------------------x
  5961. SUB MakeStarFiles '                                                   takes a LONG time
  5962.     IF iscd THEN EXIT SUB
  5963.     savestarfiles = starfiles
  5964.     ts$ = TIME$
  5965.     mstar = 0
  5966.     FOR starfiles = 0 TO 2
  5967.         FOR rmin = 0 TO 23
  5968.             FOR dmin = -90 TO 90 STEP 10
  5969.                 mstar = mstar + 1 '                                   for progress bar
  5970.                 starinit = 0
  5971.                 regen = 1
  5972.                 Stars
  5973.                 IF INKEY$ = CHR$(27) THEN SYSTEM '                    Esc aborts
  5974.             NEXT dmin
  5975.         NEXT rmin
  5976.     NEXT starfiles
  5977.     mstar = 0
  5978.     sprint ts$, 200, 100, red, black
  5979.     sprint TIME$, 200, 120, red, black
  5980.     timemachine
  5981.     SLEEP '                                                           lets user see how LONG it took
  5982.     starfiles = savestarfiles: starinit = 0: rmin = 0: dmin = 0
  5983.     'Stars '                                                          is this necessary?
  5984. ' -------------------------------------------------------------------------------------------------------x
  5985. SUB dissolve STATIC '                                                 called with }
  5986.     DIM Buffer AS _MEM
  5987.     'LINE (0, 470)-(639, 479), 0, BF
  5988.     Buffer = _MEMIMAGE(0)
  5989.     np = 0
  5990.     DO
  5991.         FOR y = _HEIGHT - 8 TO 0 STEP -1
  5992.             FOR x = 0 TO _WIDTH
  5993.                 f& = y * _WIDTH + x
  5994.                 t& = f& + INT(RND * 2 + 4) * _WIDTH
  5995.                 d = _MEMGET(Buffer, Buffer.OFFSET + f&, _UNSIGNED _BYTE)
  5996.                 _MEMPUT Buffer, Buffer.OFFSET + t&, d AS _UNSIGNED _BYTE
  5997.             NEXT x
  5998.         NEXT y
  5999.         IF np = 0 THEN
  6000.             FOR x = 0 TO _WIDTH * 4
  6001.                 _MEMPUT Buffer, Buffer.OFFSET + x, 0 AS _UNSIGNED _BYTE
  6002.                 o2& = _WIDTH * _HEIGHT - 1 - x
  6003.                 _MEMPUT Buffer, Buffer.OFFSET + o2&, 0 AS _UNSIGNED _BYTE
  6004.             NEXT x
  6005.         END IF
  6006.         timemachine
  6007.         np = np + 1
  6008.         IF INKEY$ = CHR$(27) THEN SYSTEM
  6009.     LOOP UNTIL np > 120
  6010.     _MEMFREE Buffer
  6011. ' -------------------------------------------------------------------------------------------------------x
  6012. SUB timemachine '                                                     xlate to 32 bit color for green screen, warp effects
  6013.     DIM oc&(15)
  6014.     FOR i = 0 TO 15
  6015.         OUT &H3C7, i
  6016.         tred = INP(&H3C9) * 4: tgrn = INP(&H3C9) * 4: tblu = INP(&H3C9) * 4
  6017.         coav = (tred + tgrn + tblu) \ 3
  6018.         IF cpal = 0 THEN
  6019.             oc&(i) = _RGB32(tred, tgrn, tblu) '                       regular color
  6020.         ELSEIF cpal = 1 THEN
  6021.             oc&(i) = _RGB32(0, coav, 0) '                             shades of green
  6022.         ELSE
  6023.             oc&(i) = _RGB32(coav, coav, coav) '                       black and white
  6024.         END IF
  6025.     NEXT i
  6026.  
  6027.     DIM m AS _MEM
  6028.     m = _MEMIMAGE(canvas&)
  6029.     DO: _LIMIT q4 '                                                   349 (h/100 too little, slows down program!)
  6030.         tempimage& = _NEWIMAGE(640, 350, 32)
  6031.     LOOP UNTIL tempimage& < -1 '                                      try until valid (can fail to make screen)
  6032.     SCREEN tempimage&
  6033.     FOR y = 0 TO q4 '                                                 replot each pixel of old to new screen
  6034.         FOR x = 0 TO q3
  6035.             a& = y * 640 + x
  6036.             dd = _MEMGET(m, m.OFFSET + a&, _UNSIGNED _BYTE)
  6037.             PSET (x, y), oc&(dd)
  6038.         NEXT x
  6039.     NEXT y
  6040.     IF (LEN(dead$) = 0) AND (warp! >= 1) THEN
  6041.         VIEW SCREEN(gs, SGN(LEN(mes$(0))) * 20)-(q3, q4) '            protect instrument panel, top line if message active
  6042.         IF warp! >= 9 THEN contour ELSE warpx
  6043.         VIEW SCREEN(gs, 0)-(q3, q4) '                                 back to normal, only instrument panel protected
  6044.     END IF
  6045.     _DISPLAY '                                                        show new image
  6046.     SCREEN canvas& '                                                  back to old mode so the rest of the program can run
  6047.     _MEMFREE m '                                                      would run out of memory otherwise
  6048.     _FREEIMAGE tempimage&
  6049. ' -------------------------------------------------------------------------------------------------------x
  6050. DEFINT A-Z
  6051. SUB warpx STATIC
  6052.     wa1 = (wa1 + 5) MOD tsix
  6053.     wa2 = wa1
  6054.     wx! = 320 + 70 * s!(wa1)
  6055.     wy! = 175 + 70 * c!(wa1)
  6056.     wc1 = 200
  6057.     FOR wd1 = 64 TO 600 STEP 8
  6058.         wa2 = wa2 + 2
  6059.         wc1 = (wc1 + 27) MOD 512
  6060.         wc2 = ABS(wc1 - 256)
  6061.         wc& = _RGB32(wc2, 1, 1)
  6062.         wd2 = 20 * s!((ABS(wa1 - 256) * 5) MOD tsix)
  6063.         wd3 = wd1 + wd2
  6064.         FOR z = 0 TO 4
  6065.             wde = (wa2 + 90 * z) MOD tsix
  6066.             wtx = wx! + wd3 * s!(wde)
  6067.             wty = wy! + wd3 * c!(wde)
  6068.             IF z = 0 THEN PSET (wtx, wty), wc& ELSE LINE -(wtx, wty), wc&
  6069.         NEXT z
  6070.     NEXT wd1
  6071. ' -------------------------------------------------------------------------------------------------------x
  6072. DEFINT A-Z
  6073. SUB contour STATIC
  6074.     wa1 = (wa1 + 5) MOD tsix
  6075.     wx! = 320 + 70 * s!(wa1)
  6076.     wy! = 175 + 70 * c!(wa1)
  6077.     DIM distance(360), elevation(360), active(10), angle(10)
  6078.     e0 = 320
  6079.     n = 6: GOSUB genang
  6080.     FOR i = 1 TO n
  6081.         angle = angle(i)
  6082.         angle = (angle + tsix) MOD tsix
  6083.         active(i) = angle
  6084.         distance(angle) = 50 + RND * 150
  6085.         elevation(angle) = 100 + RND * 150
  6086.     NEXT i
  6087.     n = n + 1
  6088.     active(n) = active(1)
  6089.     distance(active(n)) = distance(active(1))
  6090.     elevation(active(n)) = elevation(active(1))
  6091.     FOR i = 1 TO n
  6092.         angle1 = active(i - 1)
  6093.         angle2 = active(i)
  6094.         ddif! = distance(angle2) - distance(angle1)
  6095.         edif! = elevation(angle2) - elevation(angle1)
  6096.         IF i = n THEN angle2 = angle2 + tsix
  6097.         a! = 0: ai! = 90 / (angle2 - angle1)
  6098.         FOR z = INT(angle1) TO angle2
  6099.             na = z MOD tsix
  6100.             a! = a! + ai!
  6101.             z! = s!(a!) * s!(a!)
  6102.             distance(na) = distance(angle1) + ddif! * z!
  6103.             elevation(na) = elevation(angle1) + edif! * z!
  6104.         NEXT z
  6105.     NEXT i
  6106.     FOR el = -200 TO 220
  6107.         zz = 155 * s!((ABS(el) * 3) MOD tsix) + 100
  6108.         bb = bb XOR 1
  6109.         IF bb THEN c& = _RGB32(0, 0, zz) ELSE c& = _RGB32(zz, 0, 0)
  6110.         FOR mangle = 0 TO tsix
  6111.             angle = mangle MOD tsix
  6112.             distance = distance(angle)
  6113.             elevation = elevation(angle)
  6114.             epf! = distance / (e0 - elevation)
  6115.             d! = distance - ((el - elevation) * epf!)
  6116.             tx = px! + d! * c!(angle)
  6117.             ty = py! - d! * s!(angle)
  6118.             IF mangle THEN LINE -(tx, ty), c& ELSE PSET (tx, ty), c&
  6119.         NEXT mangle
  6120.     NEXT el
  6121.     EXIT SUB
  6122.  
  6123.     genang:
  6124.     zz = 420 / n
  6125.     FOR i = 2 TO n
  6126.         ta = (i - 2) * zz + INT(RND * 10) - 5 + 30
  6127.         angle(i) = INT(ta MOD tsix)
  6128.     NEXT i
  6129.     sort:
  6130.     sorted = 1
  6131.     FOR i = 1 TO n - 1
  6132.         a1 = angle(i)
  6133.         a2 = angle(i + 1)
  6134.         IF a1 > a2 THEN sorted = 0: SWAP angle(i), angle(i + 1)
  6135.     NEXT i
  6136.     IF sorted = 0 THEN GOTO sort
  6137.     FOR i = 1 TO n - 1
  6138.         a1 = angle(i)
  6139.         a2 = angle(i + 1)
  6140.         IF (a2 - a1) < 20 THEN GOTO genang
  6141.     NEXT i
  6142.     RETURN
  6143. ' -------------------------------------------------------------------------------------------------------x
  6144. ' -------------------------------------------------------------------------------------------------------x
  6145.  
  6146.  
* l64.zip (Filesize: 1.46 MB, Downloads: 110)
« Last Edit: March 01, 2020, 09:24:45 pm by Richard Frost »
It works better if you plug it in.

Offline William33

  • Newbie
  • Posts: 5
    • View Profile
Re: Moon Lander (reprise by request)
« Reply #1 on: March 02, 2020, 12:49:51 pm »
Unfortunately this seems not to work on Linux although it compiled without any error. All I got is a black window...
Kind Regards,
William

Offline bplus

  • Global Moderator
  • Forum Resident
  • Posts: 8053
  • b = b + ...
    • View Profile
Re: Moon Lander (reprise by request)
« Reply #2 on: March 02, 2020, 02:48:05 pm »
Unfortunately this seems not to work on Linux although it compiled without any error. All I got is a black window...

@William33
If you run the code with CHECKING:OFF commented out you wont crash your computer and you can report the error you get to code author.

@Richard Frost
Why are there 2 of these posts?
« Last Edit: March 02, 2020, 02:53:44 pm by bplus »

Offline William33

  • Newbie
  • Posts: 5
    • View Profile
Re: Moon Lander (reprise by request)
« Reply #3 on: March 02, 2020, 03:21:52 pm »
Thanks bplus, this I didn't know. First few issues was because Linux is case sensitive. Some file names are not correct.
The next error I couldn't solve: Input past end of file in line 2318.

 
inputpast.png


Sorry, I used the wrong ZIP - from the other thread. Now I got a screen but I can't do anything, just showing some particle effects over and over again.

 
puncturedamage.png
« Last Edit: March 02, 2020, 03:27:44 pm by William33 »
Kind Regards,
William