Listing of file='12P8.BAS;01' on disk='vmedia/color_graphics_1_suits-sector.ccvf'
5 REM PROGRAM 12.8 6 REM REAL TIME LUNAR LANDER 7 8 REM BY DAVID B. SUITS, 12 ANNO LUNAE 9 10 GOTO 63000:REM POKE IN THE NO-ECHO PATCH 99 100 DIM Y(127):REM HEIGHT OF LUNAR SURFACE FOR EACH OF 101 REM THE 127 HORIZONTAL PLOT POSITIONS. 110 KB= 33278:REM LOCATION OF KEYBOARD CHARACTER. 120 KF= 33247:REM LOCATION OF KEYBOARD FLAG 130 MAX= - 1.5:REM MAX SAFE LANDING VELOCITY 138 139 REM GIVE INSTRUCTIONS 140 GOSUB 8000 148 149 REM GET DEGREE OF DIFFICULTY AND SET UP LUNAR SURFACE 150 GOSUB 7000 157 158 REM DETERMINE INITIAL FUEL; PLOT THE SHIP; PRINT 159 REM AMOUNT OF FUEL REMAINING 160 GOSUB 6000 168 169 REM CALCULATE EFFECTS OF ANY RETRO-FIRE 170 GOSUB 2000 178 179 REM CALCULATE NEW CO-ORDINATES 180 GOSUB 1000 188 189 REM IF SHIP IS STILL ABOVE GROUND, CONTINUE 190 IF Y> Y(X- 1)+ V2AND Y> Y(X+ 1)+ V2THEN 170 198 199 REM SHIP HAS LANDED (OR CRASHED) 200 V1= V:Y= Y1 210 GOSUB 1050:REM ERASE IT 218 219 REM SET Y=HIGHEST POINT UNDER SHIP +4 220 Y= Y(X- 1):IF Y(X)> Y(X- 1)THEN Y= Y(X) 230 IF Y(X+ 1)> Y(X)THEN Y= Y(X+ 1) 240 Y= INT (Y+ 4):X= INT (X) 250 GOSUB 1050:PLOT 255:REM DRAW SHIP AT FINAL SPOT 259 260 PLOT 29,22:PRINT "FUEL=";:PLOT 14,19:PRINT F:PLOT 3,64,0 268 269 REM VELOCITY TOO GREAT FOR SAFE LANDING? 270 IF V1< MAX- .0001THEN TD= 0:GOSUB 3000:GOTO 410 278 279 REM NO. BUT IS SHIP STABLE ON SURFACE? 280 IF Y(X- 1)< > Y(X+ 1)THEN TD= 0:GOSUB 4000:GOTO 410 288 289 REM SAFE LANDING! 290 PLOT 3,18,1:PRINT "*** TOUCHDOWN ***":TD= - 1 298 299 REM SEE IF ANY PART OF SHIP IS ON MOON BASE 300 FLG= - 1 309 310 FOR J= - 1TO 1 319 320 FOR K= MB* 2TO MB* 2+ 3 330 IF X+ J= KTHEN FLG= 0:REM YES 340 NEXT 349 350 NEXT 359 360 IF FLGTHEN PLOT 15,3,15,3:PRINT "(BUT YOU MISSED THE MOON BASE)":GOTO 410 369 370 PLOT 6,3 380 PLOT 3,15,3:PRINT "SUCCESSFUL LANDING AT MOON BASE" 388 389 REM TURN OFF BLINK AT MOON BASE 390 PLOT 15,30,6,33,3,MB,31- INT (Y(MB* 2)/ 4),101,101,6,3,29,3,64,0 396 397 REM IF SHIP LANDS AT MOON BASE WITH VELOCITY <.85 DOWN, A 398 REM LITTLE MOON WALKER GOES TO THE HIGHEST POINT ON THE 399 REM SURFACE AND RAISES A FLAG 400 IF V1= > - .85THEN GOSUB 5000 408 409 REM GIVE STATISTICS 410 GOSUB 600 418 419 REM PLAY AGAIN? 420 INPUT "AGAIN? ";A$:A$= LEFT$ (A$,1) 430 IF A$= "Y"OR A$= "O"THEN 150 440 IF A$< > "N"THEN PLOT 28,11:GOTO 420 448 449 REM PUT TOP OF MEMORY BACK WHERE IT WAS 450 TM= 256* PEEK (32941)+ PEEK (32940)+ 7 460 POKE 32941,INT (TM/ 256):POKE 32940,TM- 256* INT (TM/ 256) 469 470 END 471 596 597 REM ********** SUBROUTINES ********** 598 599 REM ----- GIVE STATISTICS 600 PLOT 3,64,5:REM HIDE CURSOR 610 FOR J= 1TO 1000:NEXT :REM PAUSE 620 PLOT 15 629 630 PRINT "INITIAL VELOCITY:"TAB( 22)- VI* 10" FT/SEC" 640 PRINT "VELOCITY AT ";:IF TDTHEN PRINT "TOUCHDOWN";:GOTO 660 650 PRINT "IMPACT"; 660 PRINT ":"TAB( 22)- V1* 10" FT/SEC" 670 PRINT "FUEL EXPENDED:"TAB( 22)FI- F" UNITS" 678 679 REM DETERMINE RATING 680 DM= X- MB* 2:IF DM> - 2AND DM< 5THEN DM= 0:REM DM=DIST. FROM MB 690 RA= 127/ (ABS (DM)+ 1)+ V1* 10* (F/ FI)+ ABS (HI)- VI 700 RA= RA+ RA* FLG* (V1= > - .85):RA= - INT (RA* D+ .5)* TD 710 PRINT 720 PRINT "YOUR RATING IS:"TAB( 22)RA 730 TR= TR+ RA:LNDG= LNDG+ 1:AVG= INT (TR/ LNDG) 740 PRINT 750 PRINT "AVERAGE RATING" 760 PRINT "AFTER"LNDG" LANDING"; 770 IF LNDG> 1THEN PRINT "S"; 780 PRINT ":"TAB( 22)AVG 790 PRINT 800 RETURN 998 999 REM ----- CALCULATE NEW X,Y AND DRAW SHIP 1000 GOSUB 1050:REM ERASE IT AT OLD LOCATION FIRST 1010 X= X+ H:IF X> 125THEN X= 125 1020 IF X< 2THEN X= 2 1030 Y= Y+ V:IF Y> 127THEN Y= 127 1040 Y1= Y:V= V- .31:V2= ABS (V)+ 4 1049 1050 PLOT 253,X,Y,251,17,5,128,8 1059 1060 RETURN 1998 1999 REM ----- RETRO-FIRE? 2000 IF F= 0THEN RETURN :REM NO FUEL LEFT 2010 A= PEEK (KB)- 48:IF A= 39THEN A= .2:GOTO 2100 2020 IF A= 21THEN A= - .2:GOTO 2100 2030 IF A< 1OR A> 9THEN RETURN :REM NONSENSE KEY WAS STRUCK, 2031 REM OR ELSE NO KEY AT ALL. 2039 REM VERTICAL RETRO 2040 IF F- A< 0THEN A= F 2048 2049 REM DON'T PLOT RETRO IF SHIP IS TOO CLOSE TO GROUND 2050 F= F- A:V= V+ .2* A- .3:IF Y< Y(X)+ 8THEN 2070 2058 2059 REM DRAW YELLOW LINE UNDER SHIP FOR RETRO 2060 PLOT 255,6,3,2,X,Y- 5,251,17,16,34,2 2069 2070 GOTO 2120 2098 2099 REM LATERAL RETRO 2100 F= F- 1:H= H+ A 2108 2109 REM DRAW YELLOW LINE FOR FIRE 2110 PLOT 255,6,3,2,X- 5* A+ (A> 0),Y- 1,251,8,4,8 2118 2119 REM PRINT FUEL REMAINING; BLINK IF <50 2120 PLOT 255,6,6:PRINT "FUEL=";:PLOT 14,6,3- 64* (F< 50) 2130 PRINT F" ":PLOT 15,6,6,3,64,0,2 2140 POKE KB,0:REM CLEAR KEYBOARD LOCATION 2150 RETURN 2998 2999 REM ----- PLOT AN EXPLOSION AT SITE OF CRASH 3000 PLOT 29,19 3010 PLOT 2 3018 3019 REM IS CRASH SITE TOO CLOSE TO EDGE OF SCREEN? 3020 IF X< 6THEN G= 1:GOTO 3200 3030 IF X> 121THEN G= - 1:GOTO 3200 3039 3040 PLOT X,Y+ 13,X- 2,Y+ 7,X+ 2,Y+ 20,X,Y,242,X+ 5,Y+ 20,255 3050 GOSUB 3400:PLOT 16 3060 PLOT 2,X,Y,242,X- 3,Y+ 15,255 3070 PLOT 23 3080 PLOT 2,X- 1,Y+ 20,X+ 3,Y+ 25,X,Y,242,X+ 2,Y+ 11 3090 PLOT 253,X,Y,X- 1,Y+ 30,X,Y,242,X+ 1,Y+ 8,255 3100 GOSUB 3400:GOSUB 3400:PLOT 16 3110 PLOT 2,X,Y,242,X+ 2,Y+ 11,253,X,Y,242,X+ 5,Y+ 20 3120 PLOT 253,X,Y,242,X+ 1,Y+ 8,253,X,Y,242,X- 1,Y+ 30 3130 GOSUB 3400 3140 PLOT 253,X,Y+ 13,X- 2,Y+ 7,X+ 2,Y+ 20,X,Y,242,X- 2,Y+ 21 3150 PLOT 253,X,Y,242,X+ 3,Y+ 7,253,X- 1,Y+ 20,X+ 3,Y+ 25,X+ 1,Y 3160 PLOT X- 1,Y 3170 PLOT 255 3180 RETURN 3198 3199 REM EXPLOSION AT SIDE OF SCREEN 3200 PLOT X,Y,242,X,Y+ 4,253,X,Y,242,X+ 2* G,Y+ 2 3210 PLOT 253,X,Y,X+ 5* G,Y+ 6 3220 PLOT 253,X,Y,X- G,Y+ 2,255 3229 3230 FOR K= 1TO 3:GOSUB 3400:NEXT 3239 3240 PLOT 23 3250 PLOT 2,X+ G,Y+ 6,X- G,Y+ 6,X,Y,242,X+ 5* G,Y+ 13 3260 PLOT 253,X,Y,242,X,Y+ 20 3270 PLOT 253,X+ 4* G,Y+ 8,X+ 6* G,Y+ 10,X+ 10* G,Y+ 13,255 3279 3280 GOSUB 3400:PLOT 16 3289 3290 PLOT 2,X,Y,242,X+ 5* G,Y+ 6,253,X,Y,242,X+ 2* G,Y+ 2 3300 PLOT 253,X,Y,242,X,Y+ 4,253,X,Y,242,X,Y+ 20 3310 PLOT 253,X+ 10* G,Y+ 13,X+ 6* G,Y+ 10,X- G,Y+ 6 3319 3320 GOSUB 3400:GOSUB 3400 3329 3330 PLOT X+ G,Y+ 6,X,Y,242,X- G,Y+ 2 3340 PLOT 253,X+ 4* G,Y+ 8,X,Y,242,X+ 5* G,Y+ 13 3350 PLOT 253,X- G,Y 3360 PLOT 255 3370 RETURN 3398 3399 REM ----- PAUSE 3400 FOR J= 1TO INT (50* RND (1))+ 20:NEXT :RETURN 3997 3998 REM ----- VELOCITY AT TOUCHDOWN OK, BUT SHIP IS 3999 REM UNSTABLE AND FALLS 4000 PLOT 3,64,0,6,6,30,2,251 4010 Q= 1+ 2* (Y(X- 1)< Y(X+ 1)) 4020 IF D= 1THEN 4200 4028 4029 REM SHIP FALLS TO LEFT 4030 PLOT 4,32,32,32,2,16,16,81:GOSUB 4300 4110 PLOT 160,32,36:GOSUB 4300 4120 PLOT 72,24,9:GOSUB 4300 4130 PLOT 64,102,89,144,1:GOSUB 4300 4140 PLOT 32,164,70,25:GOSUB 4300 4150 PLOT 255 4159 4160 PLOT 29,18 4170 X= INT (X+ Q+ Q):Y= Y- 4 4180 GOTO 3000:REM FOR AN EXPLOSION 4198 4199 REM SHIP FALLS TO RIGHT 4200 PLOT 18,4,32,32,2:GOSUB 4300 4210 PLOT 24:GOSUB 4300 4220 PLOT 132,20,5:GOSUB 4300 4230 PLOT 128,170,149,80,1:GOSUB 4300 4240 PLOT 32,104:GOSUB 4300 4249 4250 GOTO 4150 4298 4299 REM ----- SLIGHT PAUSE 4300 FOR J= 1TO 100:NEXT :RETURN 4998 4999 REM ----- PLOT THE MOON WALKER 5000 PLOT 3,64,0 5010 PLOT 6,6 5020 PLOT 30:REM FLAG ON 5030 G= 1:IF X> HPTHEN G= - 1:REM HP IS X OF HIGHEST POINT OF SURFACE 5040 PLOT 2 5049 5050 FOR J= X+ 2* GTO HPSTEP G 5059 5060 FOR K= 1TO 2 5070 PLOT J,Y(J)+ 1,251,34,253 5080 FOR Z= 1TO 20:NEXT 5090 NEXT 5097 5098 REM IF AT BOTTOM OR TOP OF CLIF, 5099 REM GO UP OR DOWN THE SIDE OF IT 5100 IF Y(J)< > Y(J+ G)AND (J< > HP)THEN GOSUB 5300 5110 NEXT 5119 5120 FOR Z= 1TO 150:NEXT 5128 5129 REM RAISE THE FLAG 5130 PLOT 255,29 5138 5139 REM FLAG POLE 5140 PLOT 2,HP,Y(HP)+ 1,242,HP,Y(HP)+ 9,255 5148 5149 REM THE FLAG 5150 PLOT 3,127:REM BLIND CURSOR 5160 PLOT (HP+ 1)/ 2,30- INT ((Y(HP)+ 1)/ 4):REM X,Y 5170 PLOT 2:REM CCI CODE 5180 PLOT 96,96:REM 2 HATCH CHARACTERS 5190 PLOT 27,27:REM EXIT BLIND CURSOR 5200 RETURN 5298 5299 REM ----- MOON WALKER GOES UP OR DOWN THE SIDE OF A CLIFF 5300 Q= - (Y(J)> Y(J+ G)) 5309 5310 FOR S= 1TO 4 5319 5320 FOR T= 1TO 2 5330 PLOT J+ Q* G,Y(J)+ 1+ S* (1- 2* Q) 5340 FOR Z= 1TO 50:NEXT 5350 NEXT 5359 5360 FOR Z= 1TO 10:NEXT 5370 NEXT 5379 5380 RETURN 5997 5998 REM DETERMINE INITIAL FUEL, INITIAL VELOCITY, 5999 REM AND INITIAL STARTING CO-ORDINATES 6000 F= 200+ (10- (D- 1))* 20 6010 FI= F:REM REMEMBER INITIAL FUEL 6019 6020 X= INT (95* RND (1))+ 25:Y= 127:REM STARTING X,Y FOR SHIP 6029 6030 H= .5* D* RND (1)- (.3* D):REM HORIZONTAL VELOCITY 6040 HI= H:REM REMEMBER INITIAL HORIZONTAL VELOCITY 6049 6050 V= - .5* D* RND (1)- (.5* D):REM VERTICAL VELOCITY 6060 VI= V:REM REMEMBER INITIAL VERTICAL VELOCITY 6069 6070 POKE KB,0:POKE KF,31:REM TURN OFF ECHO 6078 6079 REM DRAW THE SHIP 6080 PLOT 8,10 6090 PLOT 2:GOSUB 1050 6099 6100 GOSUB 2120:REM PRINT FUEL REMAINING 6109 6110 RETURN 6998 6999 REM ----- GET DEGREE OF DIFFICULTY & SET UP LUNAR SURFACE 7000 PRINT 7010 INPUT "WHICH WOULD YOU LIKE: EASY, MEDIUM OR ADVANCED? ";D$ 7020 D$= LEFT$ (D$,1) 7030 D= 2:IF D$= "M"THEN D= 5:GOTO 7060 7040 IF D$= "A"THEN D= 10:GOTO 7060 7050 IF D$< > "E"THEN PLOT 28,11:GOTO 7010 7059 7060 PLOT 12 7070 PRINT TAB( 26)"STAND BY" 7080 PLOT 3,64,0 7089 7090 S= INT (7* RND (1)+ .5* D):REM SURFACE HEIGHT IS INFLUENCED 7091 REM BY DEGREE OF DIFFICULTY 7092 7100 HP= 1:REM HIGHEST POINT ON SURFACE SO FAR 7109 7110 FOR X= 0TO 63STEP 2:REM 2 COLUMNS AT A TIME 7120 N= S+ INT (6* RND (1))- 3:REM NEXT COLUMN UP OR DOWN 7128 7129 REM DON'T GO TOO LOW 7130 IF N< INT (.5* D)+ 1THEN N= INT (.5* D)+ 1 7138 7139 REM DON'T GO TOO HIGH 7140 IF N> INT (.5* D)+ 7THEN N= INT (.5* D)+ 7 7147 7148 REM TRANSLATE HEIGHT OF TWO COLUMNS 7149 REM INTO PLOT CO-ORDINATES 7150 FOR J= 0TO 3:Y(2* X+ J)= (N- 1)* 4+ 3:NEXT 7158 7159 REM KEEP TRACK OF HIGHEST POINT 7160 IF Y(2* X+ 3)> Y(HP)THEN HP= 2* X+ 3 7169 7170 S= N 7180 NEXT 7187 7188 REM NOW FIND A SUITABLE LOCATION FOR THE MOON BASE. 7189 REM MB IS CURSOR X OF MOON BASE. N IS A COUNTER. 7190 MB= INT ((30+ 2* D)* RND (1)+ (20- 2* D)):N= 0 7197 7198 REM LUNAR SURFACE IS CREATED TWO COLUMNS AT A TIME, 7199 REM SO MAKE SURE MB BEGINS AT AN EVEN X 7200 IF MB/ 2< > INT (MB/ 2)THEN MB= MB+ 1 7208 7209 REM DON'T GO TOO FAR RIGHT WITH MB 7210 MB= MB+ 2:IF MB> 60THEN MB= 2 7220 N= N+ 1 7228 7229 REM DON'T PUT MB TOO CLOSE TO HIGHEST POINT 7230 IF ABS (MB* 2- HP)< 4THEN 7210 7238 7239 REM IF NO SUITABLE SPOT FOR MB IS FOUND, START OVER 7240 IF N> 31THEN 7090 7249 7250 M= MB* 2:REM M IS X PLOT CO-ORDINATE OF MOON BASE 7257 7258 REM CHECK APPROPRIATE DEGREE OF DIFFICULTY FOR 7259 REM PROPER ENVIRONMENT FOR MOON BASE 7260 FLG= 0:ON INT (D/ 5)+ 1GOSUB 7500,7520,7540 7268 7269 REM IF BASE NOT IN GOOD SPOT, MOVE RIGHT & TRY AGAIN 7270 IF FLGTHEN 7210 7278 7279 REM BASE POSITIONED PROPERLY; NOW DRAW EVERYTHING 7280 PLOT 6,7,12 7290 PLOT 27,10:REM VERTICAL MODE 7299 7300 FOR X= 0TO 63 7310 N= INT (Y(X* 2)/ 4):REM HEIGHT OF SURFACE TRANSLATED FROM 7311 REM PLOT BLOCKS TO CHARACTER POSITIONS 7312 7320 PLOT 3,X,31- N:REM POSITION CURSOR N CHARACTER POSITIONS 7321 REM ABOVE BOTTOM OF SCREEN 7322 7330 FOR K= 0TO N:PLOT 96:NEXT :REM DRAW A COLUMN 7339 7340 NEXT 7348 7349 REM DRAW BLINKING MOON BASE, FLAG ON 7350 PLOT 27,11,6,97,30 7360 PLOT 3,MB,31- INT (Y(MB* 2)/ 4) 7370 PLOT 101,101 7379 7380 PLOT 6,6 7390 RETURN 7495 7496 REM ----- CHECK POSITION OF MOON BASE 7497 7498 REM EASY--BOTH EDGES OF TOP SURFACE OF BASE MUST BE 7499 REM LEVEL WITH LUNAR SURFACE 7500 FLG= (Y(M)< > Y(M- 1))OR (Y(M)< > Y(M+ 4)) 7510 RETURN 7517 7518 REM MEDIUM--TOP OF BASE MUST BE LEVEL WITH LUNAR 7519 REM SURFACE ON ONE SIDE BUT NOT THE OTHER 7520 FLG= ((Y(M)= Y(M- 1))AND (Y(M)= Y(M+ 4)))OR ((Y(M)< > Y(M- 1))AND (Y(M)< > Y(M+ 4))) 7530 RETURN 7537 7538 REM ADVANCED--BOTH EDGES OF TOP OF MOON BASE MUST BE 7539 REM UNEQUAL WITH LUNAR SURFACE 7540 FLG= (Y(M)= Y(M- 1))OR (Y(M)= Y(M+ 4)) 7550 RETURN 7998 7999 REM ----- INSTRUCTIONS 8000 PLOT 29,14,6,6,12 8010 PRINT TAB( 20)"LUNAR LANDING SIMULATION" 8020 PLOT 15 8030 PLOT 6,2 8040 PRINT 8050 PRINT "YOU ARE THE PILOT OF A SPACE SHIP LANDING ON THE MOON." 8060 PRINT 8070 PRINT "UNFORTUNATELY, YOUR LANDING COMPUTER WENT BERZERK AND YOU HAD TO" 8080 PLOT 28 8090 PRINT "SHOOT IT. NOW YOU MUST LAND THE SHIP MANUALLY. THE IDEA IS TO" 8100 PLOT 28 8110 PRINT "LAND (SAFELY!) AS CLOSE AS YOU CAN TO THE MOON BASE." 8120 PRINT 8130 PRINT "YOU MAY FIRE YOUR RETRO-ROCKETS BY PRESSING A NUMBER FROM 1 TO 9" 8140 PLOT 28 8150 PRINT "(NO NEED TO HIT RETURN). 1 GIVES YOU THE MINIMUM THRUST, WHILE" 8160 PLOT 28 8170 PRINT "9 GIVES YOU THE MAXIMUM. YOU CAN MOVE HORIZONTALLY BY PRESSING" 8180 PLOT 28 8190 PRINT "W OR E, GIVING YOU A SMALL BURST OF FIRE ON THE WEST OR THE EAST" 8200 PLOT 28 8210 PRINT "SIDE OF YOUR SHIP." 8220 PRINT 8230 PRINT "IF YOUR VELOCITY AS YOU HIT THE SURFACE IS GREATER THAN"MAX* - 10" FT/S," 8240 PLOT 28 8250 PRINT "YOU CRASH. SINCE YOUR COMPUTER IS OUT OF ORDER, YOU WON'T KNOW" 8260 PLOT 28 8270 PRINT "YOUR EXACT VELOCITY DURING DESCENT. YOU'LL HAVE TO EYE-BALL IT." 8280 PRINT "YOUR FUEL GUAGE IS, HOWEVER, STILL FUNCTIONING. THE NUMBERS YOU" 8290 PLOT 28 8300 PRINT "TYPE IN FOR RETRO-FIRES ARE THE NUMBERS OF FUEL UNITS WHICH WILL" 8310 PLOT 28 8320 PRINT "BE FIRED -- EXCEPT FOR W AND E, WHICH USE 1 UNIT EACH TO FIRE." 8330 PRINT 8340 PRINT "THE AMOUNT OF FUEL YOU BEGIN WITH, AS WELL AS YOUR INITIAL ALTI-" 8350 PLOT 28 8360 PRINT "TUDE AND VELOCITY, WILL BE DETERMINED BY HOW DIFFICULT A SIMULA-" 8370 PLOT 28 8380 PRINT "TION YOU WISH TO DO." 8390 RETURN 62999 REM ----- BEN BARLOW'S NO-ECHO PATCH 63000 RESTORE 63000:DATA 245,175,50,255,129,241,201 63010 TM= 256* PEEK (32941)+ PEEK (32940)- 7 63020 FOR X= 1TO 7:READ D:POKE TM+ X,D:NEXT 63030 BR= INT (TM/ 256):POKE 33221,195:POKE 33222,TM- BR* 256+ 1 63040 POKE 33223,BR:POKE 32941,BR:POKE 32940,TM- BR* 256 63050 CLEAR 50:GOTO 100 63052 REM FOR NO-ECHO, POKE 33247,31. 63053 REM TO RETURN TO ECHO, POKE 33247,12. 63054 REM (AN INPUT STATEMENT OR THE END 63055 REM OF THE PROGRAM WILL ALSO DO IT.)