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 E$=CHR$(27):' Escape Character 150 CLS$=CHR$(26):' Clear Screen 160 DC$=E$+"=":' Direct Cursor Addressing 170 GY$=E$+"g":' Graphics On 180 GN$=E$+"G":' Graphics Off 190 HO$=E$+CHR$(1):' Cursor Home 200 EP$=E$+"T":' Erase to End of Line 210 DY$=E$+")":' DIM Display On 220 DN$=E$+"(":' DIM Display Off 230 UY$=E$+"l":' Start Underlining 240 UN$=E$+"m":' End Underlining 250 'NOTE: The Osborne I uses the following scheme for direct cursor addressing: 260 ' Location= (CHR$(Line number+32));(CHR$(Column number+32)) 270 PRINT CLS$ 280 PRINT" The Wizard of OsZ - 'GOLDMINE'" 290 PRINT 300 L=W=S=0:C=10:M=4 ' reset variables 310 PRINT:PRINT:PRINT TAB(18);GY$;CHR$(13);GN$;" = Gold" 320 PRINT:PRINT TAB(18);GY$;CHR$(0);GN$;" = Miner" 330 PRINT:PRINT TAB(18);"* = Dead Miner":PRINT 340 PRINT TAB(18);CHR$(127);" = Tunnel Wall":PRINT 350 PRINT TAB(18);GY$;CHR$(12);GN$;" = Assay Office":PRINT 360 PRINT TAB(8);"Use ";UY$;"ARROW";UN$;" keys for direction control":PRINT 370 PRINT TAB(12);"Use ";UY$;"RETURN";UN$;" or ";UY$;"ENTER";UN$;" to blast" 380 PRINT DC$+CHR$(54)+CHR$(32);EP$ ' clear message line 390 FOR N=1 TO 100:NEXT N ' ring bell and flash message on screen 400 PRINT DC$+CHR$(54)+CHR$(47);DY$;"Press any key to play";DN$; 410 FOR N=1 TO 100:NEXT N ' hold message on screen for this delay time 420 IF INKEY$="" THEN RC=RC+1:GOTO 380 ' wait for response, bump random count 430 RANDOMIZE RC ' generate random number based on inkey loop count 440 PRINT CLS$:GOSUB 710 ' display cave structure and gold 450 XX=24:YY=22:T=250 460 POKE -(1152-XX+128*YY),32 ' clear display coordinate position 470 A$=INKEY$ ' get keyboard input 480 IF A$="" THEN 650 ' if no key, flash current miner position 490 A=ASC(A$) ' got a character, is it one of the arrow keys? 500 IF A=50 OR A=10 THEN YY=YY-1:GOSUB 1640:IF MC=127 THEN YY=YY+1 510 IF YY<3 THEN YY=YY+1 520 IF A=52 OR A=8 THEN XX=XX-1:GOSUB 1640:IF MC=127 OR MC=22 THEN XX=XX+1 530 IF XX<1 THEN XX=XX+1 540 IF A=56 OR A=11 THEN YY=YY+1:GOSUB 1640:IF MC=127 THEN YY=YY-1 550 IF YY>20 AND XX<>24 THEN YY=YY-1 560 IF YY>22 THEN YY=YY-1 570 IF A=54 OR A=12 THEN XX=XX+1:GOSUB 1640:IF MC=127 OR MC=22 THEN XX=XX-1 580 IF XX>48 THEN XX=XX-1 590 IF MC=13 THEN S=S+1 ' if gold found, add one to tally 600 IF MC=12 THEN GOSUB 970 ' if back at assay office, display new tally 610 IF MC=42 THEN GOSUB 960 ' if dead miner found, ring bell 620 IF A=13 AND YY>21 THEN 640 630 IF A=13 THEN GOSUB 1080:GOSUB 1400 ' if enter or return, explode a charge 640 GOSUB 860 ' display total amount of gold and charges 650 POKE -(1152-XX+128*YY),0 ' display miner 660 IF C<=0 THEN GOSUB 1550 670 GOSUB 1290 680 FOR N=1 TO 25:NEXT N 690 A$="" 700 GOTO 460 ' repeat this (humungous) loop... 710 PRINT TAB(24);GY$;CHR$(22);GN$;" ";GY$;CHR$(12);GN$;" ";GY$;CHR$(22);GN$ 720 PRINT GY$;STRING$(24,CHR$(22));" ";STRING$(25,CHR$(22));GN$ 730 FOR I=1 TO 18:PRINT GY$;CHR$(22);SPC(48);CHR$(22);GN$:NEXT 740 PRINT GY$;STRING$(50,CHR$(22));GN$ 750 X=4:Y=22:GOSUB 1630:PRINT"Please wait for the GOLDMINE to be built..." 760 FOR I=1 TO 400 770 XX=INT(RND*48)+1:YY=INT(RND*18)+3 780 IF PEEK(-(1152-INT(XX)+128*INT(YY)))=127 THEN 770 790 POKE -(1152-XX+128*YY),127 800 NEXT 810 FOR YY=20 TO 3 STEP-1 820 FOR XX=1 TO 48 830 IF PEEK(-(1152-XX+128*YY))<>127 THEN POKE -(1152-XX+128*YY),13 840 NEXT XX,YY 850 GOSUB 880 ' display new miner, ten new charges, no gold 860 X=1:Y=22:GOSUB 1630:PRINT"Gold =";S;EP$;TAB(42);"Charges =";C 870 RETURN 880 Y=22 890 IF M<0 THEN 1590 ' if all miners have died, time to quit 900 PRINT CHR$(30);" ":PRINT " " 910 FOR X=1 TO M*2-1 STEP 2 ' display miners 920 POKE -(1152-X+128*Y),0 ' and will a new miner sign-in please... 930 NEXT X 940 C=10:S=0 ' make ten new charges, set recovered gold to zero for new miner 950 RETURN 960 S=S+S1:PRINT CHR$(7);:RETURN ' found dead miner, ring the bell 970 C1=C:IF C1=0 THEN C1=1 ' tally gold 980 W=S*C1+W 990 FOR I=1 TO 3 ' ring bell with three beeps 1000 PRINT CHR$(7); 1010 FOR J=1 TO 500:NEXT 1020 NEXT I 1030 X=39:Y=1:GOSUB 1630:PRINT USING "$##,###.##";W 1040 M=M-1 ' one less miner to worry about... 1050 XX=XX-1 1060 GOSUB 880 ' display new miner, ten new charges, no gold 1070 RETURN 1080 IF C<=0 THEN 1550 ' exploding charge 1090 X=XX-1:Y=YY:GOSUB 1650:IF SC=22 THEN 1110 1100 GOSUB 1660 1110 X=XX+1:Y=YY:GOSUB 1650:IF SC=22 THEN 1130 1120 GOSUB 1660 1130 X=XX:Y=YY+1:GOSUB 1650:IF SC=22 THEN 1150 1140 GOSUB 1660 1150 X=XX:Y=YY-1:GOSUB 1650:IF SC=22 THEN 1170 1160 GOSUB 1660 1170 PRINT CHR$(7); 1180 FOR N=1 TO 500:NEXT 1190 PRINT CHR$(7); 1200 X=XX-1:Y=YY:GOSUB 1650:IF SC=22 THEN 1220 1210 GOSUB 1670 1220 X=XX+1:Y=YY:GOSUB 1650:IF SC=22 THEN 1240 1230 GOSUB 1670 1240 X=XX:Y=YY+1:GOSUB 1650:IF SC=22 THEN 1260 1250 GOSUB 1670 1260 X=XX:Y=YY-1:GOSUB 1650:IF SC=22 THEN 1280 1270 GOSUB 1670 1280 C=C-1:RETURN 1290 ' random cave-in during digging, more when going deeper! 1300 IF YY>21 THEN RETURN 1310 IF RND>.5 THEN RETURN 1320 IF YY<10 THEN F=2 ELSE F=1 1330 FOR I=1 TO F 1340 X=INT(RND*48)+1:Y=INT(RND*18)+3 1350 GOSUB 1650 1360 IF SC=32 THEN POKE -(1152-X+128*Y),127 1370 IF X=XX AND Y=YY THEN GOSUB 1500:RETURN 1380 NEXT I 1390 RETURN 1400 ' cause random cave-in 1410 K=INT(RND*10)+10 1420 FOR I=1 TO K 1430 X=INT(RND*48)+1:Y=INT(RND*18)+3 1440 GOSUB 1650 1450 IF SC=22 OR SC=13 THEN 1430 1460 IF SC=0 THEN GOSUB 1500:RETURN 1470 POKE -(1152-X+128*Y),127 1480 NEXT I 1490 RETURN 1500 PRINT CHR$(7); ' crush miner (yucch!) 1510 M=M-1 ' miner eats dirt, one less to crush (I think I will get sick...) 1520 POKE -(1152-X+128*Y),42 ' display dead miner 1530 S1=S 1540 GOSUB 880:XX=24:YY=22:RETURN ' setup new miner 1550 IF T<=0 THEN X=XX:Y=YY:GOSUB 1670:GOSUB 880:T=250: X=1:Y=22:GOSUB 1630:PRINT"Gold =";EP$;TAB(42);"Charges =";C: XX=24:YY=22:RETURN 1560 X=15:Y=22:GOSUB 1630:PRINT CHR$(7);"Time to get out!" 1570 T=T-5 1580 RETURN 1590 X=0:Y=22:GOSUB 1630:PRINT EP$;TAB(16):"Want to play again (Y or N)"; 1600 A$=INPUT$(1) 1610 IF A$="Y" OR A$="y" THEN GOTO 270 ' setup new mine display, if yes 1620 SYSTEM 1630 CP$=DC$+CHR$(Y+32)+CHR$(X+32):PRINT CP$;:RETURN ' position cursor 1640 MC=PEEK(-(1152-XX+128*YY)):RETURN 1650 SC=PEEK(-(1152-X+128*Y)):RETURN 1660 POKE -(1152-X+128*Y),43:RETURN ' display plus (+) character 1670 POKE -(1152-X+128*Y),32:RETURN ' display space character