10 ' *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* 20 ' *+ +* 30 ' *+ Graphics Games for the Osborne I Computer +* 40 ' *+ Courtesy of Kelly Smith, CP/M-Net +* 50 ' *+ (805) 527-9321 +* 60 ' *+ and +* 70 ' *+ Wizard of OsZ, (213) 341-9399 +* 80 ' *+ +* 90 ' *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+* 100 ' 110 ' Wizard of OsZ, P.O. Box 964, Chatsworth, CA 91311 (213) 341-9399 120 ' 130 ' ---------------- Osborne I Terminal Commands ------------------- 140 ' 150 E$=CHR$(27):' Escape Character 160 CLS$=CHR$(26):' Clear Screen 170 DC$=E$+"=":' Direct Cursor Addressing 180 GY$=E$+"g":' Graphics On 190 GN$=E$+"G":' Graphics Off 200 HO$=E$+CHR$(1):' Cursor Home 210 EP$=E$+"T":' Erase to End of Line 220 DY$=E$+")":' DIM Display On 230 DN$=E$+"(":' DIM Display Off 240 UY$=E$+"l":' Start Underlining 250 UN$=E$+"m":' End Underlining 260 'NOTE: The Osborne I uses the following scheme for direct cursor addressing: 270 ' Location= (CHR$(Line number+32));(CHR$(Column number+32)) 280 PRINT CLS$ 290 PRINT" The Wizard of OsZ - 'SPACEWAR'" 300 PRINT 310 PRINT:PRINT "Do you require instructions (Y or N) ?"; 320 A$=INKEY$:IF LEN(A$)=0 THEN GOTO 320 ' get keyboard input 330 IF A$="N" OR A$="n" THEN PRINT CLS$:GOTO 640 340 PRINT CLS$ ' clear screen 350 PRINT DY$;"You are about to go on a mission to destroy five" 360 PRINT "alien space craft that threaten the galaxy...In" 370 PRINT "order to destroy an alien space craft, you must" 380 PRINT "position it such that it appears in the exact center" 390 PRINT "of your target sight. To do that, use the numeric" 400 PRINT "keypad to position the alien craft in the following" 410 PRINT "four directions:" 420 PRINT DN$ 430 FOR I=1 TO 10:PRINT DC$+CHR$(41)+CHR$(32);EP$ 440 FOR N=1 TO 10:NEXT N ' ring bell and flash message on screen 450 PRINT CHR$(7);DC$+CHR$(41)+CHR$(32); " 8 - Up, 2 - Down, 4 - Left, 6 - Right"; 460 FOR N=1 TO 10:NEXT N 470 NEXT I 480 FOR N=1 TO 2000:NEXT N:PRINT:PRINT 490 FOR I=1 TO 10:PRINT DC$+CHR$(43)+CHR$(32);EP$ 500 FOR N=1 TO 10:NEXT N ' ring bell and flash message on screen 510 PRINT CHR$(7);DC$+CHR$(43)+CHR$(32); "Then to fire on the alien space craft, enter '5'."; 520 FOR N=1 TO 10:NEXT N 530 NEXT I 540 FOR N=1 TO 2000:NEXT N:PRINT:PRINT 550 PRINT DY$"Also, time is an important factor on your" 560 PRINT "mission...Alien return fire degrades your target" 570 PRINT "aiming ability, so don't delay! Your performance is" 580 PRINT "based on the number of alien space craft destroyed" 590 PRINT "to the number of misses...";DN$;"Enter '0' at any time to" 600 PRINT "quit";DY$;". Please enter you current rating now as" 610 PRINT "follows:" 620 PRINT DN$ 630 FOR N=1 TO 2000:NEXT N 640 FOR I=1 TO 10:PRINT DC$+CHR$(53)+CHR$(32);EP$ 650 FOR N=1 TO 10:NEXT N ' ring bell and flash message on screen 660 PRINT CHR$(7);DC$+CHR$(53)+CHR$(35); "N - Novice, H - Hotshot, E - Expert, A - Ace ?"; 670 FOR N=1 TO 10:NEXT N 680 NEXT I 690 V$=INKEY$:IF LEN(V$)=0 THEN GOTO 690 ' get keyboard input and create rating value 700 IF V$="N" OR V$="n" THEN V=100 ' novice rating 710 IF V$="H" OR V$="h" THEN V=50 ' hotshot rating 720 IF V$="E" OR V$="e" THEN V=10 ' expert rating 730 IF V$="A" OR V$="a" THEN V=5 ' ace, and you better be fast on this one! 740 PRINT CLS$ ' clear screen 750 FOR I=1 TO 10:PRINT DC$+CHR$(44)+CHR$(32);EP$ 760 FOR N=1 TO 30:NEXT N ' ring bell and flash message on screen 770 PRINT CHR$(7);DC$+CHR$(44)+CHR$(43);"Good luck on your mission !!!"; 780 FOR N=1 TO 30:NEXT N 790 NEXT I 800 D=1:D1=1:PRINT CLS$ ' clear screen 810 GOSUB 1930 ' display initial pilot rating 820 Y=6:X=0:GOSUB 1260:GOSUB 1090 ' display cross-hairs 830 Y=2:X=14:GOSUB 1260:PRINT "Target Position: " 840 Y=INT(10*RND(1)+7) ' set y axis random bounds 850 X=INT(20*RND(1)+21) ' set x axis random bounds 860 GOSUB 1260 ' position to xy coordinate 870 GOSUB 1230 ' display target 880 GOSUB 1820 ' advance alien target position 890 P=Y:Q=X:Y=2:X=31:GOSUB 1260 ' save xy position, position next message 900 PRINT "X =";Q-25;"Y =";P-12 ' display alien target coordinates 910 Y=3:X=13:GOSUB 1260:PRINT "Time =";R;:R=R+1 ' display relative run time 920 D2=SQR(((P-12)^2)+((Q-25)^2)) ' compute distance to target 930 Y=3:X=25:GOSUB 1260:PRINT "Distance =";D2;EP$ ' display distance to target 940 Y=P:X=Q ' restore original xy coordinate values 950 A$=INKEY$:IF LEN(A$)=0 THEN GOTO 880 ' check for keyboard input 960 GOSUB 1260 ' position to xy coordinate 970 IF A$="6" OR A$=CHR$(12) THEN X=X+1 ' 6 or RIGHT arrow = move right 980 IF A$="4" OR A$=CHR$(8) THEN X=X-1 ' 4 or LEFT arrow = move left 990 IF A$="2" OR A$=CHR$(10) THEN Y=Y+1 ' 2 or DOWN arrow = move down 1000 IF A$="8" OR A$=CHR$(11) THEN Y=Y-1 ' 8 or UP arrow = move up 1010 IF A$="5" OR A$=CHR$(13) THEN GOTO 1280 ' 5 or RETURN = fire on target 1020 IF A$="0" THEN PRINT CLS$:GOTO 1700 ' 0 = quit (maybe) 1030 IF A$="1" OR A$="3" OR A$="7" OR A$="9" THEN GOSUB 2000 ' re-display '+' 1040 IF A$="." THEN GOSUB 2020 ' momentarily display total score if '.' pressed 1050 GOSUB 1790 ' erase target position 1060 GOSUB 1260 ' position to xy coordinate 1070 GOSUB 1230 ' display target 1080 GOTO 880 ' repeat erase/move/position/display sequence 1090 PRINT DY$;" ";UY$;" ";UN$ ' cross-hairs 1100 PRINT " |" 1110 PRINT " |" 1120 PRINT " |" 1130 PRINT " | |" 1140 PRINT " | |" 1150 PRINT " |";UY$;" ";UN$;"| + |";UY$;" ";UN$;"|" 1160 PRINT " | | | |" 1170 PRINT " | |" 1180 PRINT " | | |" 1190 PRINT " |" 1200 PRINT " |" 1210 PRINT " ";UY$;" ";UN$;DN$ 1220 RETURN 1230 PRINT"<-";GY$;CHR$(13);GN$;"->": ' target display 1240 P=Y:Q=X ' save xy position 1250 RETURN 1260 PRINT DC$+CHR$(32+Y)+CHR$(32+X); ' position to xy coordinate 1270 RETURN 1280 IF Y=12 THEN GOTO 1300 ' proper line for hit on target? 1290 GOSUB 1590:GOTO 860 ' no, show total number missed 1300 IF X=25 THEN GOTO 1320 ' proper column for hit on target? 1310 GOSUB 1590:GOTO 860 ' no, show total number missed 1320 Y=12:X=26:GOSUB 1260:PRINT GY$;CHR$(13);"+";CHR$(13);GN$ ' explosion 1330 Y=11:X=27:GOSUB 1260:PRINT GY$;CHR$(13);GN$ 1340 Y=13:X=27:GOSUB 1260:PRINT GY$;CHR$(13);GN$ ' a quick puff of smoke... 1350 Y=12:X=25:GOSUB 1260:PRINT "+ + +" 1360 Y=11:X=26:GOSUB 1260:PRINT "+ +" 1370 Y=13:X=26:GOSUB 1260:PRINT "+ +" 1380 Y=10:X=27:GOSUB 1260:PRINT "+" 1390 Y=14:X=27:GOSUB 1260:PRINT "+" ' alien craft coming unglued... 1400 Y=12:X=25:GOSUB 1260:PRINT " " 1410 Y=11:X=28:GOSUB 1260:PRINT " " 1420 Y=10:X=27:GOSUB 1260:PRINT " " 1430 Y=13:X=26:GOSUB 1260:PRINT " " 1440 Y=12:X=29:GOSUB 1260:PRINT " " 1450 Y=13:X=28:GOSUB 1260:PRINT " " 1460 Y=14:X=27:GOSUB 1260:PRINT " " 1470 Y=12:X=27:GOSUB 1260:PRINT " " 1480 Y=11:X=26:GOSUB 1260:PRINT " " ' alien craft destroyed (totally!) 1490 FOR I=1 TO 10:PRINT DC$+CHR$(54)+CHR$(32);EP$ 1500 FOR N=1 TO 50:NEXT N ' ring bell and flash message on screen 1510 PRINT CHR$(7);DC$+CHR$(54)+CHR$(37); UY$;"M A Y";UN$;" ";UY$;"T H E";UN$;" ";UY$;"F O R C E";UN$;" "; UY$;"B E";UN$;" ";UY$;"W I T H";UN$;" ";UY$;"Y O U";UN$; 1520 FOR N=1 TO 50:NEXT N 1530 NEXT I:PRINT DC$+CHR$(54)+CHR$(32);EP$ 1540 S=S+10:GOSUB 2020 ' add 10 to total score, and display total score 1550 Y=20:X=17:GOSUB 1260 ' position cursor for next message 1560 PRINT "Aliens Destroyed =";D1 ' add 1 to alien craft hit 1570 D1=D1+1:IF D1=6 THEN 1640 ' close up shop if all 5 destroyed 1580 GOTO 840 ' continue with next target 1590 S=S-10:GOSUB 2020 ' subtract 10 from total score, and display total score 1600 P=Y:Q=X:Y=21:X=17:GOSUB 1260 ' position cursor for next message 1610 PRINT "Aliens Missed =";D:D=D+1 ' add 1 to alien craft missed 1620 Y=P:X=Q:GOSUB 1260 ' position to xy coordinate 1630 RETURN 1640 Y=20:X=0:GOSUB 1260 ' position to xy coordinate 1650 D=D-1 ' subtract -1 to number missed 1660 PRINT " Congratulations, You have saved the galaxy !!!" 1670 PRINT " Your mission record:";INT(5/(5+D)*100);"% performance" 1680 IF 5/(5+D)*100>75 THEN V=V-50 1690 IF 5/(5+D)*100<51 THEN V=V+50 1700 Y=21:X=7:GOSUB 1260 1710 PRINT DC$+CHR$(54)+CHR$(32);EP$ 1720 FOR N=1 TO 100:NEXT N ' ring bell and flash message on screen 1730 PRINT DC$+CHR$(54)+CHR$(40);"Do you want another mission (Y or N) ?" 1740 FOR N=1 TO 100:NEXT N 1750 A$=INKEY$:IF LEN(A$)=0 THEN GOTO 1710 1760 PRINT DC$+CHR$(54)+CHR$(32);EP$ 1770 IF LEFT$(A$,1)="Y" OR LEFT$(A$,1)="y" THEN PRINT CLS$:GOTO 640 1780 PRINT CLS$:SYSTEM 1790 PRINT DC$+CHR$(32+P)+CHR$(32+Q); ' position cursor to target location 1800 PRINT " " ' erase target location 1810 RETURN 1820 T=T+1.5 ' overall skill level set here (3 is super skill level!) 1830 IF T>V THEN 1850 1840 RETURN 1850 IF X>36 THEN GOTO 1890 1860 IF Y<12 THEN GOTO 1890 1870 X=X+1:Y=Y-1:GOSUB 1790:GOSUB 1260:GOSUB 1230:GOTO 1900 1880 GOTO 1900 1890 X=X+1:Y=Y-1:GOSUB 1790:GOSUB 1260:GOSUB 1230:GOTO 1900 1900 IF X>45 OR X<1 THEN Y=12:X=19:V=V+10:GOSUB 1260: PRINT CHR$(7);"You're shot down!":GOSUB 1990:GOTO 1700 1910 IF Y<7 OR Y>18 THEN Y=12:X=19:V=V+10:GOSUB 1260: PRINT CHR$(7);"You're destroyed!":GOSUB 1990:GOTO 1700 1920 T=0:RETURN 1930 IF V<=5 THEN Q$="Rating = Ace Pilot":GOTO 1970 ' determine pilot rating 1940 IF V<=10 THEN Q$="Rating = Expert Pilot":GOTO 1970 1950 IF V<=49 THEN Q$="Rating = Hotshot Pilot":GOTO 1970 1960 Q$="Rating = Novice Pilot" 1970 Y=0:X=17:GOSUB 1260 ' set cursor position for pilot rating 1980 PRINT UY$;Q$;UN$:RETURN ' print rating 1990 FOR N=1 TO 300:NEXT N:RETURN ' general purpose delay 2000 P=Y:Q=X:Y=12:X=27:GOSUB 1260:PRINT "+" ' print '+' for digits 1,3,7,9 2010 Y=P:X=Q:RETURN 2020 P=Y:Q=X:Y=12:X=19:GOSUB 1260:PRINT "Total Score =";S ' display total score 2030 GOSUB 1990:GOSUB 1990:GOSUB 1260 ' delay while score is displayed 2040 PRINT " + ":Y=P:X=Q:RETURN ' erase score display and return