home *** CD-ROM | disk | FTP | other *** search
/ The CIA World Factbook 1992 / k3bimage.iso / sel / 01 / 0102 / lem.bas (.txt) next >
Encoding:
GW-BASIC  |  1991-12-02  |  7.3 KB  |  308 lines

  1. 10  ' *****************
  2. 20  ' **     LEM     **
  3. 30  ' *****************
  4. 40  '
  5. 50  SCREEN 1
  6. 60  CLS
  7. 70  KEY OFF
  8. 80  LOCATE 2,7
  9. 90  PRINT"* * * out on a lem * * *
  10. 100  LOCATE 5,1
  11. 110  PRINT "A challenging game of skill...
  12. 120  LOCATE 7,1
  13. 130  PRINT"Use the special function keys F1
  14. 140  PRINT"through F3 to run your left, right,
  15. 150  PRINT"and vertical thrusters. You are to
  16. 160  PRINT"land your lunar excursion module (LEM)
  17. 170  PRINT"as gently and accuratly as possible.
  18. 180  PRINT
  19. 190  PRINT"Turn a given thruster off by pressing
  20. 200  PRINT"the same key a second time.
  21. 210  PRINT
  22. 220  PRINT"Watch your fuel supply!
  23. 230  PRINT
  24. 240  PRINT"if you have fuel left, the onboard
  25. 250  PRINT"computer will -attempt- to return
  26. 260  PRINT"you to earth...
  27. 270  '
  28. 280  LOCATE 25,9
  29. 290  PRINT"Press any key to begin";
  30. 300  '
  31. 310  ' Starting point for each landing attempt
  32. 320  IF LEN(INKEY$) THEN 320
  33. 330  K$ = INKEY$
  34. 340  IF K$ = "" THEN 330
  35. 350  '
  36. 360  COLOR 0,1
  37. 370  CLS
  38. 380  '
  39. 390  'Activate engine keys
  40. 400  ON KEY(1) GOSUB 1990
  41. 410  ON KEY(2) GOSUB 2030
  42. 420  ON KEY(3) GOSUB 2070
  43. 430  KEY (1) ON
  44. 440  KEY (2) ON
  45. 450  KEY (3) ON
  46. 460  '
  47. 470  ' A differnt game each second of the hour
  48. 480  T$ = MID$(TIME$,4,2) + MID$(TIME$,7)
  49. 490  RANDOMIZE VAL(T$)
  50. 500  '
  51. 510  'Build the spase ship image
  52. 520  LINE (3,1)-(5,5),2,BF
  53. 530  LINE (2,2)-(6,4),2,BF
  54. 540  LINE (1,7)-(2,6),3
  55. 550  LINE (6,6)-(7,7),3
  56. 560  DIM SHIP(7)
  57. 570  GET (0,0)-(8,8),SHIP
  58. 580  '
  59. 590  ' build vertical exaust image
  60. 600  LINE(9,1)-(11,1)
  61. 610  DIM EXHAUSTX(1)
  62. 620  GET (9,1)-(11,1),EXHAUSTX
  63. 630  '
  64. 640  'Build horizontal exaust image
  65. 650  LINE (1,9)-(1,12)
  66. 660  DIM EXHAUSTY(1)
  67. 670  GET (1,9)-(1,12),EXHAUSTY
  68. 680  '
  69. 690  'Sprinkle a few stars around
  70. 700  CLS
  71. 710  FOR I = 1 TO 300
  72. 711  STCOL=STCOL+1:IF STCOL=4 THEN STCOL=0
  73. 720  PSET (320*RND,200*RND),STCOL
  74. 730  NEXT I
  75. 740  '
  76. 750  ' DRAW THE EARTH
  77. 760  CIRCLE (277,63),25,1
  78. 770  PAINT (277,63),1
  79. 780  DRAW "c3bm272,42r7d1r4l13d1l4r22d1l24g1r23l3d1l20"
  80. 790  DRAW"r3d1r14l4d1l8c2l3u1ld2r18e3l1g1l2f1l5d2r4"
  81. 800  DRAW"l16d1r14d1l15d1r14g1l13d1r13g1l13"
  82. 810  DRAW "d1r13f2l1h3l3g1l8d1r6g1l4f1r3f1l3f1r6u2l1d1l1"
  83. 820  DRAW"d2l3r5d1r1g1r13l2u1l7e1r3d3r7l15f1r15f1l16"
  84. 830  DRAW"g1r21d1l21f1r20g1l18f1r17g1l15"
  85. 840  DRAW"f1r13d1l13d1r11d1l11d1r9g1l7g1r6g1l4d1r2l5"
  86. 850  DRAW"bm273,54c1u1e1r1f2"
  87. 860  DRAW"c3bd2l2bl2bu1l2h1l1bd4l3h1l3h1l2h1l1"
  88. 870  DRAW"bg5r1f2r1f1r5u1l3"
  89. 880  DRAW"bm273,79r1f1d1l3h1l1h2u2e3r2e1r9l3h1l4"
  90. 890  DRAW"bh2e1r4e1r7l3e2r1"
  91. 900  '
  92. 910  'choose site for landing pad
  93. 920  XL = 140 + 50 * RND
  94. 930  YL = 180 - 10 * RND
  95. 940  '
  96. 950  'Create topographical features of moon
  97. 960  M1 = M2
  98. 970  M2 = M1 + 37 * RND
  99. 980  IF M2 > 319 THEN M2 = 319
  100. 990  H1 = H2
  101. 1000  H2 = 190 - 70 * RND
  102. 1010  IF H1 = 0 THEN 990
  103. 1020  IF M2 < XL - 39 THEN 1050
  104. 1030  IF M2 > XL + 39 THEN 1050
  105. 1040  H2 = YL
  106. 1050  LINE (M1,H1)-(M2,H2),1
  107. 1060  IF M2 < 319 THEN 960
  108. 1070  PAINT (0,199),1
  109. 1080  '
  110. 1090  ' Draw the landing pad
  111. 1100  LINE (XL-3,YL)-(XL+3,YL+2),,BF
  112. 1110  '
  113. 1120  '
  114. 1130  SHIPX = 50 * RND
  115. 1140  SHIPY = 20 * RND
  116. 1150  '
  117. 1160  'Slightly random starting velocity for ship
  118. 1170  VELX = 7 + RND * 3
  119. 1180  VELY = 1 + RND
  120. 1200  ' Starting conditions
  121. 1210  PUT (SHIPX,SHIPY),SHIP,XOR
  122. 1220  FACTOR = 0.1
  123. 1230  FUEL = 999
  124. 1240  THRUSTUP = 3
  125. 1250  '
  126. 1260  'MAIN FLIGHT LOOP STARTS HERE
  127. 1270  PULSE = PULSE MOD 7 + 1
  128. 1280  IF PULSE = 1 THEN SOUND 1200-FUEL/5,1
  129. 1290  IF THRUSTUP < 0 THEN FUEL = FUEL - 9.7
  130. 1300  IF THRUSTSIDE THEN FUEL = FUEL - 5.3
  131. 1310  IF FUEL < 0 THEN FUEL = 0
  132. 1320  IF FUEL > 99 THEN 1460
  133. 1330  SOUND 99,0
  134. 1340  IF FUEL > 0 THEN SOUND 400,1
  135. 1350  IF FUEL > 0 THEN 1460
  136. 1360  '
  137. 1370  'No more fuel left, disengage engines
  138. 1380  SOUND 2000,1
  139. 1390  KEY (1) OFF
  140. 1400  KEY (2) OFF
  141. 1410  KEY (3) OFF
  142. 1420  THRUSTUP = 3
  143. 1430  THRUSTSIDE = 0
  144. 1440  '
  145. 1450  ' Compute new velociteis and positions
  146. 1460  VELX = VELX + FACTOR * THRUSTSIDE * 3
  147. 1470  OLDX = SHIPX
  148. 1480  SHIPX = SHIPX + FACTOR * VELX * 3
  149. 1490  VELY = VELY + FACTOR * THRUSTUP
  150. 1500  OLDY = SHIPY
  151. 1510  SHIPY = SHIPY + FACTOR * VELY
  152. 1520  '
  153. 1530  ' Put exaust images in view if necessary
  154. 1540  IF THRUSTSIDE < 0 THEN PUT (SHIPX+7,SHIPY+3),EXHAUSTX,XOR : FLGL = 1
  155. 1550  IF THRUSTSIDE > 0 THEN PUT (SHIPX-2,SHIPY+3),EXHAUSTX,XOR :FLGR = 1
  156. 1560  IF THRUSTUP < 0 THEN PUT (SHIPX+4,SHIPY+7),EXHAUSTY,XOR : FLGU = 1
  157. 1570  '
  158. 1580  'Have we drifted off screen?
  159. 1590  IF SHIPY < 0 THEN 1910
  160. 1600  IF SHIPX < 2 THEN 1910
  161. 1610  IF SHIPX > 308 THEN 1910
  162. 1620  '
  163. 1630  'Erase old ship image via XOR to preserve background
  164. 1640  PUT (OLDX,OLDY),SHIP,XOR
  165. 1650  '
  166. 1660  'Draw new ship image ,XOR onto background
  167. 1670  PUT (SHIPX,SHIPY),SHIP,XOR
  168. 1680  '
  169. 1690  'Erase exhaust images if necessary
  170. 1700  IF FLGL THEN PUT (SHIPX+7,SHIPY+3),EXHAUSTX,XOR : FLGL = 0
  171. 1710  IF FLGR THEN PUT (SHIPX-2,SHIPY+3),EXHAUSTX,XOR : FLGR = 0
  172. 1720  IF FLGU THEN PUT (SHIPX+4,SHIPY+7),EXHAUSTY,XOR : FLGU = 0
  173. 1730  '
  174. 1740  'Skip landing check for awhile if returning to earth
  175. 1750  IF LAND <= 0 THEN 1800
  176. 1760  LAND = LAND - 0.07
  177. 1770  GOTO 1840
  178. 1780  '
  179. 1790  'Are landing pads touching the moon(and not the earth)?
  180. 1800  IF POINT (SHIPX,SHIPY+8) = 1 AND SHIPY > 85 THEN 2110
  181. 1810  IF POINT (SHIPX+8,SHIPY+8) = 1 AND SHIPY > 85 THEN 2110
  182. 1820  '
  183. 1830  ' Update the fuel supply
  184. 1840  LOCATE 25,4
  185. 1850  PRINT USING "FUEL ###";FUEL;
  186. 1855  LOCATE 25,18
  187. 1856  PRINT USING"Vert ###";VELY*10;
  188. 1857  LOCATE 25,30
  189. 1858  PRINT USING"Horz ###";VELX*10;
  190. 1860  '
  191. 1870  'Keep on flying
  192. 1880  GOTO 1270
  193. 1890  '
  194. 1900  ' We just drifted off screen
  195. 1910  CLS
  196. 1920  LOCATE 12,4
  197. 1930  IF LAND = 0 THEN PRINT "MISSION ABORTED, RETURN TO EARTH"
  198. 1940  IF LAND <> 0 THEN PRINT"       WELCOME HOME HERO!       "
  199. 1950  IF LAND <> 0 THEN PLAY "L4 DEEEDEF L1 E"
  200. 1951  LOCATE 22,1:INPUT "PLAY AGAIN";C$
  201. 1952  IF C$="Y" THEN RUN 320
  202. 1953  IF C$="y" THEN RUN 320
  203. 1960  CHAIN "BASMENU.BAS"
  204. 1970  '
  205. 1980  'SUBROUTINE F1 ... left engine control
  206. 1990  THRUSTSIDE = -(THRUSTSIDE <> 1)
  207. 2000  RETURN
  208. 2010  '
  209. 2020  'Subroutine F2 ... right engine control
  210. 2030  THRUSTSIDE = (THRUSTSIDE <> -1)
  211. 2040  RETURN
  212. 2050  '
  213. 2060  'SUBROUTINE F3 ... VERTICAL ENGINE CONTROL
  214. 2070  THRUSTUP = 7 * (THRUSTUP = 3) - 3 * (THRUSTUP = -7)
  215. 2080  RETURN
  216. 2090  '
  217. 2100  'WE LANDED! BUT HOW DID WE FARE?
  218. 2110  LOCATE 1,1
  219. 2120  VEL = ABS(VELX) + ABS(VELY)
  220. 2130  IF VEL < 4 THEN 2350
  221. 2140  '
  222. 2150  'DISINTAGRTATING SHIP, PARTS STREAKING OUT FROM CRATER
  223. 2160  PRESET (SHIPX+4,SHIPY+8)
  224. 2170  FOR I = 1 TO VEL * 0.7
  225. 2180  DELX = 9 * VEL * (RND-0.5)
  226. 2190  DELY = 7 * VEL * (-RND)
  227. 2200  DRAW "C2 NM+=DELX;,=DELY;"
  228. 2210  NEXT I
  229. 2220  '
  230. 2230  ' FAST ENOUGH TO DIG NEW CRATER?
  231. 2240  IF VEL < 8 THEN 2300
  232. 2250  PRT$ = "NEW CRATER IS #### METERS WIDE ...          "
  233. 2260  PRINT USING PRT$ ; VEL * VEL / 7
  234. 2270  GOTO 2780
  235. 2280  '
  236. 2290  'LANDING WAS TO ROUGH, SORRY
  237. 2300  PRINT"Damaged beyond repair ...        "
  238. 2310  PRINT"Enjoy your stay !
  239. 2320  GOTO 2780
  240. 2330  '
  241. 2340  'landed ok, just how did you do?
  242. 2350  IF VEL <3 THEN 2390
  243. 2360  PRINT"Fairly soft landing       "
  244. 2370  GOTO 2570
  245. 2380  '
  246. 2390  IF VEL < 2 THEN 2430
  247. 2400  PRINT"Nice job ! ";
  248. 2410  GOTO 2570
  249. 2420  '
  250. 2430  IF VEL < 1 THEN 2470
  251. 2440  PRINT"EXELLENT SOFT LANDING!";
  252. 2450  GOTO 2570
  253. 2460  '
  254. 2470  IF SHIPX-XL+4 < 3 THEN 2510
  255. 2480  PRINT"Superior landing job!!";
  256. 2490  GOTO 2570
  257. 2500  '
  258. 2510  PRINT"The President calls with his";
  259. 2520  LOCATE 2,1
  260. 2530  PRINT" congratulations on a superb landing!";
  261. 2540  GOTO 2740
  262. 2550  '
  263. 2560  'Ok, so how close to the landing pad are you?
  264. 2570  DIS = ABS(SHIPX-XL+4) + ABS(SHIPY-YL+8)
  265. 2580  LOCATE 2,1
  266. 2590  IF DIS < 50 THEN 2630
  267. 2600  PRINT"But you're way out in the boonies!";
  268. 2610  GOTO 2740
  269. 2620  '
  270. 2630  IF DIS < 10 THEN 2670
  271. 2640  PRINT"But you missed the landing site!";
  272. 2650  GOTO 2740
  273. 2660  '
  274. 2670  IF DIS < 3 THEN 2710
  275. 2680  PRINT USING "But you missed the spot by ## meters.";DIS
  276. 2690  GOTO 2740
  277. 2700  '
  278. 2710  PRINT"And you landed right on target!";
  279. 2720  '
  280. 2730  'music for goog landings
  281. 2740  PLAY "o4t128mll6cmsc#e-.mlc mse-c#c.mlcmsffl1f"
  282. 2750  GOTO 2810
  283. 2760  '
  284. 2770  'Music for disastrous landings
  285. 2780  PLAY "mst64l6n3n7n3n7l3n2"
  286. 2790  '
  287. 2800  'Shall we try a return to earth
  288. 2810  IF (FUEL <> 0) AND (VEL < 4 ) THEN 2820 ELSE RUN 320
  289. 2820  LOCATE 1,1
  290. 2830  PRINT "Earth calling - Return home                    ";
  291. 2840  LOCATE 2,1
  292. 2850  PRINT "                                               ";
  293. 2860  VEL  = 0
  294. 2870  VELY = -1
  295. 2880  LAND = 1
  296. 2890  THRUSTUP = - 7
  297. 2900  THRUSTDIDE = 0
  298. 2910  FOR Z = 1 TO 2000
  299. 2920  NEXT Z
  300. 2930  LOCATE 1,1
  301. 2940  PRINT"LEM computer engaged - returning home           ";
  302. 2950  KEY (1) OFF
  303. 2960  KEY (2) OFF
  304. 2970  KEY (3) OFF
  305. 2980  IF LEN(INKEY$) THEN 2980
  306. 2990  GOTO 1270
  307. 3000  CHAIN "BASMENU.BAS"
  308.