home *** CD-ROM | disk | FTP | other *** search
/ Oakland CPM Archive / oakcpm.iso / sigm / vol142 / goldmine.bas < prev    next >
Encoding:
BASIC Source File  |  1984-04-29  |  7.1 KB  |  170 lines

  1. 10 '         *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*
  2. 20 '         *+                                             +*
  3. 30 '         *+  Graphics Games for the Osborne I Computer  +*
  4. 40 '         *+      Courtesy of Kelly Smith, CP/M-Net      +* 
  5. 50 '         *+              (805) 527-9321                 +*
  6. 60 '         *+                   and                       +*
  7. 70 '         *+       Wizard of OsZ, (213) 341-9399         +*
  8. 80 '         *+                                             +*
  9. 90 '         *+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*+*
  10. 100 '
  11. 110 ' Wizard of OsZ, P.O. Box 964, Chatsworth, CA 91311 (213) 341-9399
  12. 120 '
  13. 130 ' ---------------- Osborne I Terminal Commands -------------------
  14. 140 E$=CHR$(27):'                Escape Character
  15. 150 CLS$=CHR$(26):'              Clear Screen
  16. 160 DC$=E$+"=":'                 Direct Cursor Addressing
  17. 170 GY$=E$+"g":'                 Graphics On
  18. 180 GN$=E$+"G":'                 Graphics Off
  19. 190 HO$=E$+CHR$(1):'             Cursor Home
  20. 200 EP$=E$+"T":'                Erase to End of Line
  21. 210 DY$=E$+")":'                DIM Display On
  22. 220 DN$=E$+"(":'                DIM Display Off
  23. 230 UY$=E$+"l":'                Start Underlining
  24. 240 UN$=E$+"m":'                End Underlining
  25. 250 'NOTE: The Osborne I uses the following scheme for direct cursor addressing:
  26. 260 '      Location= (CHR$(Line number+32));(CHR$(Column number+32))
  27. 270 PRINT CLS$
  28. 280 PRINT"          The Wizard of OsZ - 'GOLDMINE'"
  29. 290 PRINT
  30. 300 L=W=S=0:C=10:M=4 ' reset variables
  31. 310 PRINT:PRINT:PRINT TAB(18);GY$;CHR$(13);GN$;" = Gold"
  32. 320 PRINT:PRINT TAB(18);GY$;CHR$(0);GN$;" = Miner"
  33. 330 PRINT:PRINT TAB(18);"* = Dead Miner":PRINT
  34. 340 PRINT TAB(18);CHR$(127);" = Tunnel Wall":PRINT
  35. 350 PRINT TAB(18);GY$;CHR$(12);GN$;" = Assay Office":PRINT
  36. 360 PRINT TAB(8);"Use ";UY$;"ARROW";UN$;" keys for direction control":PRINT
  37. 370 PRINT TAB(12);"Use ";UY$;"RETURN";UN$;" or ";UY$;"ENTER";UN$;" to blast"
  38. 380 PRINT DC$+CHR$(54)+CHR$(32);EP$ ' clear message line
  39. 390 FOR N=1 TO 100:NEXT N ' ring bell and flash message on screen
  40. 400 PRINT DC$+CHR$(54)+CHR$(47);DY$;"Press any key to play";DN$;
  41. 410 FOR N=1 TO 100:NEXT N ' hold message on screen for this delay time
  42. 420 IF INKEY$="" THEN RC=RC+1:GOTO 380 ' wait for response, bump random count
  43. 430 RANDOMIZE RC ' generate random number based on inkey loop count
  44. 440 PRINT CLS$:GOSUB 710 ' display cave structure and gold
  45. 450 XX=24:YY=22:T=250
  46. 460 POKE -(1152-XX+128*YY),32 ' clear display coordinate position
  47. 470 A$=INKEY$ ' get keyboard input
  48. 480 IF A$="" THEN 650 ' if no key, flash current miner position
  49. 490 A=ASC(A$) ' got a character, is it one of the arrow keys?
  50. 500 IF A=50 OR A=10 THEN YY=YY-1:GOSUB 1640:IF MC=127 THEN YY=YY+1
  51. 510 IF YY<3 THEN YY=YY+1
  52. 520 IF A=52 OR A=8 THEN XX=XX-1:GOSUB 1640:IF MC=127 OR MC=22 THEN XX=XX+1
  53. 530 IF XX<1 THEN XX=XX+1
  54. 540 IF A=56 OR A=11 THEN YY=YY+1:GOSUB 1640:IF MC=127 THEN YY=YY-1
  55. 550 IF YY>20 AND XX<>24 THEN YY=YY-1
  56. 560 IF YY>22 THEN YY=YY-1
  57. 570 IF A=54 OR A=12 THEN XX=XX+1:GOSUB 1640:IF MC=127 OR MC=22 THEN XX=XX-1
  58. 580 IF XX>48 THEN XX=XX-1
  59. 590 IF MC=13 THEN S=S+1 ' if gold found, add one to tally
  60. 600 IF MC=12 THEN GOSUB 970 ' if back at assay office, display new tally
  61. 610 IF MC=42 THEN GOSUB 960 ' if dead miner found, ring bell
  62. 620 IF A=13 AND YY>21 THEN 640
  63. 630 IF A=13 THEN GOSUB 1080:GOSUB 1400 ' if enter or return, explode a charge
  64. 640 GOSUB 860 ' display total amount of gold and charges
  65. 650 POKE -(1152-XX+128*YY),0 ' display miner
  66. 660 IF C<=0 THEN GOSUB 1550
  67. 670 GOSUB 1290
  68. 680 FOR N=1 TO 25:NEXT N
  69. 690 A$=""
  70. 700 GOTO 460 ' repeat this (humungous) loop...
  71. 710 PRINT TAB(24);GY$;CHR$(22);GN$;" ";GY$;CHR$(12);GN$;" ";GY$;CHR$(22);GN$
  72. 720 PRINT GY$;STRING$(24,CHR$(22));" ";STRING$(25,CHR$(22));GN$
  73. 730 FOR I=1 TO 18:PRINT GY$;CHR$(22);SPC(48);CHR$(22);GN$:NEXT
  74. 740 PRINT GY$;STRING$(50,CHR$(22));GN$
  75. 750 X=4:Y=22:GOSUB 1630:PRINT"Please wait for the GOLDMINE to be built..."
  76. 760 FOR I=1 TO 400
  77. 770 XX=INT(RND*48)+1:YY=INT(RND*18)+3
  78. 780 IF PEEK(-(1152-INT(XX)+128*INT(YY)))=127 THEN 770
  79. 790 POKE -(1152-XX+128*YY),127
  80. 800 NEXT
  81. 810 FOR YY=20 TO 3 STEP-1
  82. 820 FOR XX=1 TO 48
  83. 830 IF PEEK(-(1152-XX+128*YY))<>127 THEN POKE -(1152-XX+128*YY),13
  84. 840 NEXT XX,YY
  85. 850 GOSUB 880 ' display new miner, ten new charges, no gold
  86. 860 X=1:Y=22:GOSUB 1630:PRINT"Gold =";S;EP$;TAB(42);"Charges =";C
  87. 870 RETURN
  88. 880 Y=22 
  89. 890 IF M<0 THEN 1590 ' if all miners have died, time to quit
  90. 900 PRINT CHR$(30);"          ":PRINT "          "
  91. 910 FOR X=1 TO M*2-1 STEP 2 ' display miners
  92. 920 POKE -(1152-X+128*Y),0 ' and will a new miner sign-in please... 
  93. 930 NEXT X
  94. 940 C=10:S=0 ' make ten new charges, set recovered gold to zero for new miner
  95. 950 RETURN
  96. 960 S=S+S1:PRINT CHR$(7);:RETURN ' found dead miner, ring the bell
  97. 970 C1=C:IF C1=0 THEN C1=1 ' tally gold
  98. 980 W=S*C1+W
  99. 990 FOR I=1 TO 3 ' ring bell with three beeps
  100. 1000 PRINT CHR$(7);
  101. 1010 FOR J=1 TO 500:NEXT
  102. 1020 NEXT I
  103. 1030 X=39:Y=1:GOSUB 1630:PRINT USING "$##,###.##";W
  104. 1040 M=M-1 ' one less miner to worry about...
  105. 1050 XX=XX-1
  106. 1060 GOSUB 880 ' display new miner, ten new charges, no gold
  107. 1070 RETURN
  108. 1080 IF C<=0 THEN 1550 ' exploding charge
  109. 1090 X=XX-1:Y=YY:GOSUB 1650:IF SC=22 THEN 1110
  110. 1100 GOSUB 1660
  111. 1110 X=XX+1:Y=YY:GOSUB 1650:IF SC=22 THEN 1130
  112. 1120 GOSUB 1660
  113. 1130 X=XX:Y=YY+1:GOSUB 1650:IF SC=22 THEN 1150
  114. 1140 GOSUB 1660
  115. 1150 X=XX:Y=YY-1:GOSUB 1650:IF SC=22 THEN 1170
  116. 1160 GOSUB 1660
  117. 1170 PRINT CHR$(7);
  118. 1180 FOR N=1 TO 500:NEXT
  119. 1190 PRINT CHR$(7);
  120. 1200 X=XX-1:Y=YY:GOSUB 1650:IF SC=22 THEN 1220
  121. 1210 GOSUB 1670
  122. 1220 X=XX+1:Y=YY:GOSUB 1650:IF SC=22 THEN 1240
  123. 1230 GOSUB 1670
  124. 1240 X=XX:Y=YY+1:GOSUB 1650:IF SC=22 THEN 1260
  125. 1250 GOSUB 1670
  126. 1260 X=XX:Y=YY-1:GOSUB 1650:IF SC=22 THEN 1280
  127. 1270 GOSUB 1670
  128. 1280 C=C-1:RETURN
  129. 1290 ' random cave-in during digging, more when going deeper!
  130. 1300 IF YY>21 THEN RETURN
  131. 1310 IF RND>.5 THEN RETURN
  132. 1320 IF YY<10 THEN F=2 ELSE F=1
  133. 1330 FOR I=1 TO F
  134. 1340 X=INT(RND*48)+1:Y=INT(RND*18)+3
  135. 1350 GOSUB 1650
  136. 1360 IF SC=32 THEN POKE -(1152-X+128*Y),127
  137. 1370 IF X=XX AND Y=YY THEN GOSUB 1500:RETURN
  138. 1380 NEXT I
  139. 1390 RETURN
  140. 1400 ' cause random cave-in
  141. 1410 K=INT(RND*10)+10
  142. 1420 FOR I=1 TO K
  143. 1430 X=INT(RND*48)+1:Y=INT(RND*18)+3
  144. 1440 GOSUB 1650
  145. 1450 IF SC=22 OR SC=13 THEN 1430
  146. 1460 IF SC=0 THEN GOSUB 1500:RETURN
  147. 1470 POKE -(1152-X+128*Y),127
  148. 1480 NEXT I
  149. 1490 RETURN
  150. 1500 PRINT CHR$(7); ' crush miner (yucch!)
  151. 1510 M=M-1 ' miner eats dirt, one less to crush (I think I will get sick...)
  152. 1520 POKE -(1152-X+128*Y),42 ' display dead miner
  153. 1530 S1=S
  154. 1540 GOSUB 880:XX=24:YY=22:RETURN ' setup new miner
  155. 1550 IF T<=0 THEN X=XX:Y=YY:GOSUB 1670:GOSUB 880:T=250:
  156.                   X=1:Y=22:GOSUB 1630:PRINT"Gold =";EP$;TAB(42);"Charges =";C:
  157.                   XX=24:YY=22:RETURN
  158. 1560 X=15:Y=22:GOSUB 1630:PRINT CHR$(7);"Time to get out!"
  159. 1570 T=T-5
  160. 1580 RETURN
  161. 1590 X=0:Y=22:GOSUB 1630:PRINT EP$;TAB(16):"Want to play again (Y or N)";
  162. 1600 A$=INPUT$(1)
  163. 1610 IF A$="Y" OR A$="y" THEN GOTO 270 ' setup new mine display, if yes
  164. 1620 SYSTEM
  165. 1630 CP$=DC$+CHR$(Y+32)+CHR$(X+32):PRINT CP$;:RETURN ' position cursor
  166. 1640 MC=PEEK(-(1152-XX+128*YY)):RETURN
  167. 1650 SC=PEEK(-(1152-X+128*Y)):RETURN
  168. 1660 POKE -(1152-X+128*Y),43:RETURN ' display plus (+) character
  169. 1670 POKE -(1152-X+128*Y),32:RETURN ' display space character
  170.