home *** CD-ROM | disk | FTP | other *** search
/ Best Sellers 13: Tetris Hits / BSTETRS2.bin / bstetrs2 / dos / bmaster / bmaster.bas < prev    next >
Encoding:
BASIC Source File  |  1995-11-26  |  32.3 KB  |  1,150 lines

  1. DEFINT A-Z
  2. DIM DRIVE AS SHARED STRING
  3. DIM DIRECTORY AS SHARED STRING
  4.  
  5. DIM DELAYTIME AS SHARED INTEGER
  6. DIM MAXLEVELS AS SHARED INTEGER
  7. DIM MOVEDIST AS SHARED INTEGER
  8. DIM NUMCOLS AS SHARED INTEGER
  9. DIM NUMROWS AS SHARED INTEGER
  10. DIM NUMPICS AS SHARED INTEGER
  11. DIM REALROWS AS SHARED INTEGER
  12. DIM REALCOLS AS SHARED INTEGER
  13. DIM XDIF AS SHARED INTEGER
  14. DIM YDIF AS SHARED INTEGER
  15. DIM NEXTX AS SHARED INTEGER
  16. DIM NEXTY AS SHARED INTEGER
  17.  
  18. DRIVE = ""
  19. DIRECTORY = ""
  20. DELAYTIME = 500
  21. MAXLEVELS = 10
  22. MOVEDIST = 3
  23. NUMCOLS = 27
  24. NUMROWS = 23
  25. NUMPICS = 12
  26. REALROWS = 19
  27. REALCOLS = 10
  28. XDIF = 9
  29. YDIF = 1
  30. NEXTX = 4
  31. NEXTY = 4
  32.  
  33. DIM PUTLIST(0 TO NUMPICS) AS SHARED INTEGER
  34. DIM BLUE(1 TO 200) AS SHARED INTEGER
  35. DIM RED(1 TO 500) AS SHARED INTEGER
  36. DIM CYAN(1 TO 500) AS SHARED INTEGER
  37. DIM PURPLE(1 TO 500) AS SHARED INTEGER
  38. DIM GREEN(1 TO 500) AS SHARED INTEGER
  39. DIM BRICK(1 TO 500) AS SHARED INTEGER
  40. DIM STEEL(1 TO 500) AS SHARED INTEGER
  41. DIM DELUSION1(1 TO 490) AS SHARED INTEGER
  42. DIM DELUSION2(1 TO 590) AS SHARED INTEGER
  43. DIM DELUSION3(1 TO 590) AS SHARED INTEGER
  44. DIM DELUSION4(1 TO 590) AS SHARED INTEGER
  45. DIM BOARD(1 TO NUMCOLS, 1 TO NUMROWS) AS SHARED INTEGER
  46. DIM REALBOARD(1 TO REALCOLS, 1 TO REALROWS) AS SHARED INTEGER
  47.  
  48. 'INITIALIZE VARIABLES
  49. RANDOMIZE TIMER
  50. SCREEN 12
  51. X = 14: Y = 2
  52. piecenum = INT(RND * 7) + 1
  53. NEXTNUM = INT(RND * 7) + 1
  54. PUTLIST(0) = 1
  55. ROT = 1
  56.  
  57. 'INTRO
  58. CALL Intro
  59.  
  60. 'MAIN BLOCK
  61. CALL InitBoard(BOARD)
  62. CALL DrawBoard(BOARD)
  63. CALL DrawRealBoard
  64. CALL DrawRealBoard
  65. CALL DRAWPIECE(NEXTX, NEXTY, NEXTNUM, 1)
  66.  
  67. WHILE GAMEOVER = 0
  68.   IF Settled(X, Y, piecenum, ROT) = 1 THEN
  69.     CALL AppendBoard(X, Y, piecenum, ROT)
  70.     CALL CheckRows
  71.     CALL ERASEPIECE(NEXTX, NEXTY, NEXTNUM, 1)
  72.     Y = 2: piecenum = NEXTNUM: NEXTNUM = INT(RND * 7) + 1: ROT = 1: X = 14
  73.     CALL DRAWPIECE(NEXTX, NEXTY, NEXTNUM, 1)
  74.     IF OverLapped(X, Y, piecenum, ROT) = 1 THEN GAMEOVER = 1
  75.   ELSE
  76.     CALL DoCommand(D$)
  77.   END IF
  78.   IF GAMEOVER = 0 THEN
  79.     D$ = ""
  80.     CALL DRAWPIECE(X, Y, piecenum, ROT)
  81.     FOR STALL = 1 TO DELAYTIME * MAXLEVELS - (LEVEL * DELAYTIME) + 1
  82.       IF KeyPressed(D$) = 0 THEN D$ = INKEY$: D$ = UCASE$(D$):  ELSE EXIT FOR
  83.     NEXT STALL
  84.     FOR zz = 1 TO 10000: NEXT zz
  85.     IF Settled(X, Y, piecenum, ROT) = 0 THEN
  86.       CALL ERASEPIECE(X, Y, piecenum, ROT)
  87.     END IF
  88.     IF D$ = "Q" THEN GAMEOVER = 1
  89.   END IF
  90.   IF LINECOUNT > 10 THEN
  91.     LEVEL = LEVEL + 1
  92.     LINECOUNT = 0
  93.   END IF
  94. WEND
  95. CALL CenterText(13, "****GAME OVER****", 15)
  96.  
  97. FUNCTION AlreadyThere (PUTLIST, PICNUM)
  98.   AlreadyThere = PUTLIST(PICNUM)
  99. END FUNCTION
  100.  
  101. SUB AppendBoard (X, Y, piecenum, ROT) : SHARED BOARD, REALBOARD
  102.     SELECT CASE piecenum
  103.       CASE 1
  104.         IF ROT = 1 THEN
  105.           BOARD(X, Y) = 1
  106.           BOARD(X, Y - 1) = 1
  107.           BOARD(X, Y + 1) = 1
  108.           BOARD(X, Y + 2) = 1
  109.         ELSE
  110.           BOARD(X, Y) = 1
  111.           BOARD(X - 1, Y) = 1
  112.           BOARD(X + 1, Y) = 1
  113.           BOARD(X + 2, Y) = 1
  114.         END IF
  115.       CASE 2
  116.         BOARD(X, Y) = 2
  117.         BOARD(X + 1, Y) = 2
  118.         BOARD(X, Y + 1) = 2
  119.         BOARD(X + 1, Y + 1) = 2
  120.       CASE 3
  121.         IF ROT = 1 THEN
  122.           BOARD(X, Y) = 3
  123.           BOARD(X - 1, Y) = 3
  124.           BOARD(X, Y + 1) = 3
  125.           BOARD(X + 1, Y + 1) = 3
  126.         ELSE
  127.           BOARD(X, Y) = 3
  128.           BOARD(X, Y - 1) = 3
  129.           BOARD(X - 1, Y) = 3
  130.           BOARD(X - 1, Y + 1) = 3
  131.         END IF
  132.       CASE 4
  133.         IF ROT = 1 THEN
  134.           BOARD(X, Y) = 4
  135.           BOARD(X + 1, Y) = 4
  136.           BOARD(X - 1, Y + 1) = 4
  137.           BOARD(X, Y + 1) = 4
  138.         ELSE
  139.           BOARD(X, Y) = 4
  140.           BOARD(X - 1, Y) = 4
  141.           BOARD(X - 1, Y - 1) = 4
  142.           BOARD(X, Y + 1) = 4
  143.         END IF
  144.       CASE 5
  145.         SELECT CASE ROT
  146.           CASE 1
  147.             BOARD(X, Y) = 5
  148.             BOARD(X, Y - 1) = 5
  149.             BOARD(X, Y + 1) = 5
  150.             BOARD(X + 1, Y - 1) = 5
  151.           CASE 2
  152.             BOARD(X, Y) = 5
  153.             BOARD(X - 1, Y) = 5
  154.             BOARD(X - 1, Y - 1) = 5
  155.             BOARD(X + 1, Y) = 5
  156.           CASE 3
  157.             BOARD(X, Y) = 5
  158.             BOARD(X, Y + 1) = 5
  159.             BOARD(X, Y - 1) = 5
  160.             BOARD(X - 1, Y + 1) = 5
  161.           CASE 4
  162.             BOARD(X, Y) = 5
  163.             BOARD(X - 1, Y) = 5
  164.             BOARD(X + 1, Y) = 5
  165.             BOARD(X + 1, Y + 1) = 5
  166.         END SELECT
  167.       CASE 6
  168.         SELECT CASE ROT
  169.           CASE 1
  170.             BOARD(X, Y) = 5
  171.             BOARD(X, Y - 1) = 5
  172.             BOARD(X, Y + 1) = 5
  173.             BOARD(X - 1, Y - 1) = 5
  174.           CASE 2
  175.             BOARD(X, Y) = 5
  176.             BOARD(X + 1, Y) = 5
  177.             BOARD(X - 1, Y) = 5
  178.             BOARD(X - 1, Y + 1) = 5
  179.           CASE 3
  180.             BOARD(X, Y) = 5
  181.             BOARD(X, Y - 1) = 5
  182.             BOARD(X, Y + 1) = 5
  183.             BOARD(X + 1, Y + 1) = 5
  184.           CASE 4
  185.             BOARD(X, Y) = 5
  186.             BOARD(X - 1, Y) = 5
  187.             BOARD(X + 1, Y) = 5
  188.             BOARD(X + 1, Y - 1) = 5
  189.         END SELECT
  190.       CASE 7
  191.         SELECT CASE ROT
  192.           CASE 1
  193.             BOARD(X, Y) = 1
  194.             BOARD(X, Y - 1) = 1
  195.             BOARD(X + 1, Y) = 1
  196.             BOARD(X - 1, Y) = 1
  197.           CASE 2
  198.             BOARD(X, Y) = 1
  199.             BOARD(X, Y - 1) = 1
  200.             BOARD(X, Y + 1) = 1
  201.             BOARD(X + 1, Y) = 1
  202.           CASE 3
  203.             BOARD(X, Y) = 1
  204.             BOARD(X - 1, Y) = 1
  205.             BOARD(X + 1, Y) = 1
  206.             BOARD(X, Y + 1) = 1
  207.           CASE 4
  208.             BOARD(X, Y) = 1
  209.             BOARD(X, Y - 1) = 1
  210.             BOARD(X, Y + 1) = 1
  211.             BOARD(X - 1, Y) = 1
  212.         END SELECT
  213.     END SELECT
  214. END SUB
  215.  
  216. FUNCTION BLOCKEDTOLEFT (X, Y, piecenum, ROT) : SHARED BOARD
  217. SELECT CASE piecenum
  218. CASE 1
  219.   IF ROT = 1 THEN
  220.     IF BOARD(X - 1, Y - 1) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X - 1, Y + 1) >= 1 OR BOARD(X - 1, Y + 2) >= 1 THEN
  221.       BLOCKEDTOLEFT = 1
  222.     ELSE
  223.       BLOCKEDTOLEFT = 0
  224.     END IF
  225.   ELSE
  226.     IF BOARD(X - 2, Y) >= 1 THEN BLOCKEDTOLEFT = 1:  ELSE BLOCKEDTOLEFT = 0
  227.   END IF
  228. CASE 2
  229.   IF BOARD(X - 1, Y) >= 1 OR BOARD(X - 1, Y + 1) >= 1 THEN
  230.     BLOCKEDTOLEFT = 1
  231.   ELSE
  232.     BLOCKEDTOLEFT = 0
  233.   END IF
  234. CASE 3
  235.   IF ROT = 1 THEN
  236.     IF BOARD(X - 2, Y) >= 1 OR BOARD(X - 1, Y + 1) >= 1 THEN
  237.       BLOCKEDTOLEFT = 1
  238.     ELSE
  239.       BLOCKEDTOLEFT = 0
  240.     END IF
  241.   ELSE
  242.     IF BOARD(X - 2, Y) >= 1 OR BOARD(X - 1, Y - 1) >= 1 OR BOARD(X - 2, Y + 1) >= 1 THEN
  243.       BLOCKEDTOLEFT = 1
  244.     ELSE
  245.       BLOCKEDTOLEFT = 0
  246.     END IF
  247.   END IF
  248. CASE 4
  249.   IF ROT = 1 THEN
  250.     IF BOARD(X - 1, Y) >= 1 OR BOARD(X - 2, Y + 1) THEN
  251.       BLOCKEDTOLEFT = 1
  252.     ELSE
  253.       BLOCKEDTOLEFT = 0
  254.     END IF
  255.   ELSE
  256.     IF BOARD(X - 2, Y - 1) >= 1 OR BOARD(X - 2, Y) >= 1 OR BOARD(X - 1, Y + 1) THEN
  257.       BLOCKEDTOLEFT = 1
  258.     ELSE
  259.       BLOCKEDTOLEFT = 0
  260.     END IF
  261.   END IF
  262. CASE 5
  263.   SELECT CASE ROT
  264.   CASE 1
  265.     IF BOARD(X - 1, Y - 1) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X - 1, Y + 1) >= 1 THEN
  266.       BLOCKEDTOLEFT = 1
  267.     ELSE
  268.       BLOCKEDTOLEFT = 0
  269.     END IF
  270.   CASE 2
  271.     IF BOARD(X - 2, Y) >= 1 OR BOARD(X - 2, Y + 1) >= 1 THEN
  272.       BLOCKEDTOLEFT = 1
  273.     ELSE
  274.       BLOCKEDTOLEFT = 0
  275.     END IF
  276.   CASE 3
  277.     IF BOARD(X - 1, Y - 1) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X - 2, Y + 1) THEN
  278.       BLOCKEDTOLEFT = 1
  279.     ELSE
  280.       BLOCKEDTOLEFT = 0
  281.     END IF
  282.   CASE 4
  283.     IF BOARD(X - 2, Y) >= 1 OR BOARD(X, Y + 1) >= 1 THEN
  284.       BLOCKEDTOLEFT = 1
  285.     ELSE
  286.       BLOCKEDTOLEFT = 0
  287.     END IF
  288.   END SELECT
  289. CASE 6
  290.   SELECT CASE ROT
  291.   CASE 1
  292.     IF BOARD(X - 2, Y - 1) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X - 1, Y + 1) >= 1 THEN
  293.       BLOCKEDTOLEFT = 1
  294.     ELSE
  295.       BLOCKEDTOLEFT = 0
  296.     END IF
  297.   CASE 2
  298.     IF BOARD(X - 2, Y) >= 1 OR BOARD(X - 2, Y + 1) >= 1 THEN
  299.       BLOCKEDTOLEFT = 1
  300.     ELSE
  301.       BLOCKEDTOLEFT = 0
  302.     END IF
  303.   CASE 3
  304.     IF BOARD(X - 1, Y - 1) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X - 1, Y + 1) THEN
  305.       BLOCKEDTOLEFT = 1
  306.     ELSE
  307.       BLOCKEDTOLEFT = 0
  308.     END IF
  309.   CASE 4
  310.     IF BOARD(X - 2, Y) >= 1 OR BOARD(X, Y - 1) >= 1 THEN
  311.       BLOCKEDTOLEFT = 1
  312.     ELSE
  313.       BLOCKEDTOLEFT = 0
  314.     END IF
  315.   END SELECT
  316. CASE 7
  317.   SELECT CASE ROT
  318.   CASE 1
  319.     IF BOARD(X - 2, Y) >= 1 OR BOARD(X - 1, Y - 1) >= 1 THEN
  320.       BLOCKEDTOLEFT = 1
  321.     ELSE
  322.       BLOCKEDTOLEFT = 0
  323.     END IF
  324.   CASE 2
  325.     IF BOARD(X - 1, Y) >= 1 OR BOARD(X - 1, Y + 1) >= 1 OR BOARD(X - 1, Y - 1) >= 1 THEN
  326.       BLOCKEDTOLEFT = 1
  327.     ELSE
  328.       BLOCKEDTOLEFT = 0
  329.     END IF
  330.   CASE 3
  331.     IF BOARD(X - 2, Y) >= 1 OR BOARD(X - 1, Y + 1) >= 1 THEN
  332.       BLOCKEDTOLEFT = 1
  333.     ELSE
  334.       BLOCKEDTOLEFT = 0
  335.     END IF
  336.   CASE 4
  337.     IF BOARD(X - 2, Y) >= 1 OR BOARD(X - 1, Y - 1) >= 1 OR BOARD(X - 1, Y + 1) >= 1 THEN
  338.       BLOCKEDTOLEFT = 1
  339.     ELSE
  340.       BLOCKEDTOLEFT = 0
  341.     END IF
  342.   END SELECT
  343. END SELECT
  344. END FUNCTION
  345.  
  346. FUNCTION BLOCKEDTORIGHT (X, Y, piecenum, ROT) : SHARED BOARD
  347. SELECT CASE piecenum
  348. CASE 1
  349.   IF ROT = 1 THEN
  350.     IF BOARD(X + 1, Y - 1) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X + 1, Y + 1) >= 1 OR BOARD(X + 1, Y + 2) >= 1 THEN
  351.       BLOCKEDTORIGHT = 1
  352.     ELSE
  353.       BLOCKEDTORIGHT = 0
  354.     END IF
  355.   ELSE
  356.     IF BOARD(X + 3, Y) >= 1 THEN BLOCKEDTORIGHT = 1:  ELSE BLOCKEDTORIGHT = 0
  357.   END IF
  358. CASE 2
  359.   IF BOARD(X + 2, Y) >= 1 OR BOARD(X + 2, Y + 1) >= 1 THEN
  360.     BLOCKEDTORIGHT = 1
  361.   ELSE
  362.     BLOCKEDTORIGHT = 0
  363.   END IF
  364. CASE 3
  365.   IF ROT = 1 THEN
  366.     IF BOARD(X + 1, Y) >= 1 OR BOARD(X + 2, Y + 1) >= 1 THEN
  367.       BLOCKEDTORIGHT = 1
  368.     ELSE
  369.       BLOCKEDTORIGHT = 0
  370.     END IF
  371.   ELSE
  372.     IF BOARD(X + 1, Y) >= 1 OR BOARD(X + 1, Y - 1) >= 1 OR BOARD(X, Y + 1) >= 1 THEN
  373.       BLOCKEDTORIGHT = 1
  374.     ELSE
  375.       BLOCKEDTORIGHT = 0
  376.     END IF
  377.   END IF
  378. CASE 4
  379.   IF ROT = 1 THEN
  380.     IF BOARD(X + 2, Y) >= 1 OR BOARD(X + 1, Y + 1) THEN
  381.       BLOCKEDTORIGHT = 1
  382.     ELSE
  383.       BLOCKEDTORIGHT = 0
  384.     END IF
  385.   ELSE
  386.     IF BOARD(X, Y - 1) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X + 1, Y + 1) THEN
  387.       BLOCKEDTORIGHT = 1
  388.     ELSE
  389.       BLOCKEDTORIGHT = 0
  390.     END IF
  391.   END IF
  392. CASE 5
  393.   SELECT CASE ROT
  394.   CASE 1
  395.     IF BOARD(X + 2, Y - 1) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X + 1, Y + 1) >= 1 THEN
  396.       BLOCKEDTORIGHT = 1
  397.     ELSE
  398.       BLOCKEDTORIGHT = 0
  399.     END IF
  400.   CASE 2
  401.     IF BOARD(X + 2, Y) >= 1 OR BOARD(X, Y + 1) >= 1 THEN
  402.       BLOCKEDTORIGHT = 1
  403.     ELSE
  404.       BLOCKEDTORIGHT = 0
  405.     END IF
  406.   CASE 3
  407.     IF BOARD(X + 1, Y - 1) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X + 1, Y + 1) THEN
  408.       BLOCKEDTORIGHT = 1
  409.     ELSE
  410.       BLOCKEDTORIGHT = 0
  411.     END IF
  412.   CASE 4
  413.     IF BOARD(X + 2, Y) >= 1 OR BOARD(X + 2, Y + 1) >= 1 THEN
  414.       BLOCKEDTORIGHT = 1
  415.     ELSE
  416.       BLOCKEDTORIGHT = 0
  417.     END IF
  418.   END SELECT
  419. CASE 6
  420.   SELECT CASE ROT
  421.   CASE 1
  422.     IF BOARD(X + 1, Y - 1) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X + 1, Y + 1) >= 1 THEN
  423.       BLOCKEDTORIGHT = 1
  424.     ELSE
  425.       BLOCKEDTORIGHT = 0
  426.     END IF
  427.   CASE 2
  428.     IF BOARD(X + 2, Y) >= 1 OR BOARD(X, Y + 1) >= 1 THEN
  429.       BLOCKEDTORIGHT = 1
  430.     ELSE
  431.       BLOCKEDTORIGHT = 0
  432.     END IF
  433.   CASE 3
  434.     IF BOARD(X + 1, Y - 1) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X + 2, Y + 1) THEN
  435.       BLOCKEDTORIGHT = 1
  436.     ELSE
  437.       BLOCKEDTORIGHT = 0
  438.     END IF
  439.   CASE 4
  440.     IF BOARD(X + 2, Y) >= 1 OR BOARD(X + 2, Y - 1) >= 1 THEN
  441.       BLOCKEDTORIGHT = 1
  442.     ELSE
  443.       BLOCKEDTORIGHT = 0
  444.     END IF
  445.   END SELECT
  446. CASE 7
  447.   SELECT CASE ROT
  448.   CASE 1
  449.     IF BOARD(X + 2, Y) >= 1 OR BOARD(X + 1, Y - 1) >= 1 THEN
  450.       BLOCKEDTORIGHT = 1
  451.     ELSE
  452.       BLOCKEDTORIGHT = 0
  453.     END IF
  454.   CASE 2
  455.     IF BOARD(X + 2, Y) >= 1 OR BOARD(X + 1, Y + 1) >= 1 OR BOARD(X + 1, Y - 1) >= 1 THEN
  456.       BLOCKEDTORIGHT = 1
  457.     ELSE
  458.       BLOCKEDTORIGHT = 0
  459.     END IF
  460.   CASE 3
  461.     IF BOARD(X + 2, Y) >= 1 OR BOARD(X + 1, Y + 1) >= 1 THEN
  462.       BLOCKEDTORIGHT = 1
  463.     ELSE
  464.       BLOCKEDTORIGHT = 0
  465.     END IF
  466.   CASE 4
  467.     IF BOARD(X + 1, Y) >= 1 OR BOARD(X + 1, Y - 1) >= 1 OR BOARD(X + 1, Y + 1) >= 1 THEN
  468.       BLOCKEDTORIGHT = 1
  469.     ELSE
  470.       BLOCKEDTORIGHT = 0
  471.     END IF
  472.   END SELECT
  473. END SELECT
  474. END FUNCTION
  475.  
  476. SUB CenterText (YLINE, TEXT$, CLR)
  477. LOCATE YLINE, 40 - (LEN(TEXT$) / 2)
  478. COLOR CLR
  479. PRINT TEXT$
  480. END SUB
  481.  
  482. SUB CheckRows : SHARED BOARD, REALBOARD, LINECOUNT, TOTALLINES
  483. CALL InitRealBoard
  484. FOR R = 1 TO REALROWS
  485.   BLANKFOUND = 0
  486.   FOR C = 1 TO REALCOLS
  487.     IF REALBOARD(C, R) = 0 THEN BLANKFOUND = 1
  488.   NEXT C
  489.   IF BLANKFOUND = 0 THEN
  490.     LINECOUNT = LINECOUNT + 1
  491.     LOCATE 17, 12: COLOR 10: PRINT "Lines"
  492.     LOCATE 18, 10: PRINT "Completed"
  493.     TOTALLINES = TOTALLINES + 1
  494.     LOCATE 20, 10: COLOR 15: PRINT TOTALLINES; "    "
  495.     FOR R2 = R TO 2 STEP -1
  496.       FOR C2 = 1 TO REALCOLS
  497.         REALBOARD(C2, R2) = REALBOARD(C2, R2 - 1)
  498.         BOARD(C2 + XDIF, R2 + YDIF) = REALBOARD(C2, R2 - 1)
  499.       NEXT C2
  500.     NEXT R2
  501.     CALL DrawRealBoard
  502.   END IF
  503.   BLANKFOUND = 0
  504. NEXT R
  505. END SUB
  506.  
  507. SUB DoCommand (D$) : SHARED piecenum, ROT, X, Y, MOVETIME, BOARD
  508. SELECT CASE D$
  509.   CASE "4"
  510.     IF BLOCKEDTOLEFT(X, Y, piecenum, ROT) = 0 THEN X = X - 1
  511.     SELECT CASE MOVETIME
  512.       CASE 0: MOVETIME = 3
  513.       CASE 1: IF Settled(X, Y, piecenum, ROT) = 0 THEN Y = Y + 1: MOVETIME = 0
  514.       CASE IS > 1: MOVETIME = MOVETIME - 1
  515.     END SELECT
  516.   CASE "6"
  517.     IF BLOCKEDTORIGHT(X, Y, piecenum, ROT) = 0 THEN X = X + 1
  518.     SELECT CASE MOVETIME
  519.       CASE 0: MOVETIME = 3
  520.       CASE 1: IF Settled(X, Y, piecenum, ROT) = 0 THEN Y = Y + 1: MOVETIME = 0
  521.       CASE IS > 1: MOVETIME = MOVETIME - 1
  522.     END SELECT
  523.   CASE "2"
  524.     Y = Y + 1
  525.   CASE "5"
  526.     SELECT CASE piecenum
  527.       CASE 1, 3, 4
  528.         IF ROT = 1 THEN TEMPROT = 2:  ELSE TEMPROT = 1
  529.       CASE 5, 6, 7
  530.         IF ROT > 0 THEN TEMPROT = ROT + 1: IF TEMPROT > 4 THEN TEMPROT = 1
  531.     END SELECT
  532.     IF OverLapped(X, Y, piecenum, TEMPROT) = 0 THEN ROT = TEMPROT
  533.     SELECT CASE MOVETIME
  534.       CASE 0: MOVETIME = 3
  535.       CASE 1: Y = Y + 1: MOVETIME = 0
  536.       CASE IS > 1: MOVETIME = MOVETIME - 1
  537.     END SELECT
  538.   CASE "": IF Settled(X, Y, piecenum, ROT) = 0 THEN Y = Y + 1
  539. END SELECT
  540. END SUB
  541.  
  542. SUB DrawBoard (BOARD)
  543. FOR ROW = 1 TO NUMROWS STEP 3.2
  544.   FOR COL = 1 TO NUMCOLS STEP 3.5
  545.     CALL PSETPIC(COL, ROW, 8)
  546.     CALL PSETPIC(COL, ROW + 1.6, 9)
  547.     CALL PSETPIC(COL + 1.8, ROW + 1.6, 10)
  548.     CALL PSETPIC(COL + 1.8, ROW, 11)
  549.   NEXT COL
  550. NEXT ROW
  551. FOR ROW = 1 TO NUMROWS
  552.   FOR COL = 1 TO NUMCOLS
  553.     SELECT CASE BOARD(COL, ROW)
  554.       CASE 1: CALL PSETPIC(COL, ROW, 1)
  555.       CASE 2: CALL PSETPIC(COL, ROW, 2)
  556.       CASE 3: CALL PSETPIC(COL, ROW, 3)
  557.       CASE 4: CALL PSETPIC(COL, ROW, 4)
  558.       CASE 5: CALL PSETPIC(COL, ROW, 5)
  559.       CASE 6: CALL PSETPIC(COL, ROW, 6)
  560.       CASE 7: CALL PSETPIC(COL, ROW, 7)
  561.     END SELECT
  562.   NEXT COL
  563. NEXT ROW
  564.  
  565. FOR ROW = 3 TO 6
  566.   FOR COL = 3 TO 6
  567.     CALL PSETPIC(ROW, COL, 0)
  568.   NEXT COL
  569. NEXT ROW
  570. FOR ROW = 3 TO 6
  571.   FOR COL = 13 TO 16
  572.     CALL PSETPIC(ROW, COL, 0)
  573.   NEXT COL
  574. NEXT ROW
  575. LOCATE 17, 12: COLOR 10: PRINT "Lines"
  576. LOCATE 18, 10: PRINT "Completed"
  577. LOCATE 20, 10: COLOR 15: PRINT " 0"
  578. END SUB
  579.  
  580. SUB DrawPicture (X, Y)
  581. STARTPOINT = 0: CURLINE = 0: ENDPOINT = 0
  582. WHILE NOT EOF(1)
  583.   INPUT #1, CLR, LINELEN
  584.   IF CLR >= 0 THEN
  585.     ENDPOINT = STARTPOINT + LINELEN
  586.     LINE (X + STARTPOINT, Y + CURLINE)-(X + ENDPOINT, Y + CURLINE), CLR
  587.     STARTPOINT = ENDPOINT + 1
  588.   ELSE
  589.     CURLINE = CURLINE + 1: STARTPOINT = 0: ENDPOINT = 0
  590.   END IF
  591. WEND
  592. END SUB
  593.  
  594. SUB DRAWPIECE (X, Y, piecenum, ROT)
  595.     SELECT CASE piecenum
  596.       CASE 1
  597.         IF ROT = 1 THEN
  598.           CALL PUTPIC(X, Y, 1)
  599.           CALL PUTPIC(X, Y - 1, 1)
  600.           CALL PUTPIC(X, Y + 1, 1)
  601.           CALL PUTPIC(X, Y + 2, 1)
  602.         ELSE
  603.           CALL PUTPIC(X, Y, 1)
  604.           CALL PUTPIC(X - 1, Y, 1)
  605.           CALL PUTPIC(X + 1, Y, 1)
  606.           CALL PUTPIC(X + 2, Y, 1)
  607.         END IF
  608.       CASE 2
  609.         CALL PUTPIC(X, Y, 2)
  610.         CALL PUTPIC(X + 1, Y, 2)
  611.         CALL PUTPIC(X, Y + 1, 2)
  612.         CALL PUTPIC(X + 1, Y + 1, 2)
  613.       CASE 3
  614.         IF ROT = 1 THEN
  615.           CALL PUTPIC(X, Y, 3)
  616.           CALL PUTPIC(X - 1, Y, 3)
  617.           CALL PUTPIC(X, Y + 1, 3)
  618.           CALL PUTPIC(X + 1, Y + 1, 3)
  619.         ELSE
  620.           CALL PUTPIC(X, Y, 3)
  621.           CALL PUTPIC(X, Y - 1, 3)
  622.           CALL PUTPIC(X - 1, Y, 3)
  623.           CALL PUTPIC(X - 1, Y + 1, 3)
  624.         END IF
  625.       CASE 4
  626.         IF ROT = 1 THEN
  627.           CALL PUTPIC(X, Y, 4)
  628.           CALL PUTPIC(X + 1, Y, 4)
  629.           CALL PUTPIC(X - 1, Y + 1, 4)
  630.           CALL PUTPIC(X, Y + 1, 4)
  631.         ELSE
  632.           CALL PUTPIC(X, Y, 4)
  633.           CALL PUTPIC(X - 1, Y, 4)
  634.           CALL PUTPIC(X - 1, Y - 1, 4)
  635.           CALL PUTPIC(X, Y + 1, 4)
  636.         END IF
  637.       CASE 5
  638.         SELECT CASE ROT
  639.           CASE 1
  640.             CALL PUTPIC(X, Y, 5)
  641.             CALL PUTPIC(X, Y - 1, 5)
  642.             CALL PUTPIC(X, Y + 1, 5)
  643.             CALL PUTPIC(X + 1, Y - 1, 5)
  644.           CASE 2
  645.             CALL PUTPIC(X, Y, 5)
  646.             CALL PUTPIC(X - 1, Y, 5)
  647.             CALL PUTPIC(X - 1, Y - 1, 5)
  648.             CALL PUTPIC(X + 1, Y, 5)
  649.           CASE 3
  650.             CALL PUTPIC(X, Y, 5)
  651.             CALL PUTPIC(X, Y + 1, 5)
  652.             CALL PUTPIC(X, Y - 1, 5)
  653.             CALL PUTPIC(X - 1, Y + 1, 5)
  654.           CASE 4
  655.             CALL PUTPIC(X, Y, 5)
  656.             CALL PUTPIC(X - 1, Y, 5)
  657.             CALL PUTPIC(X + 1, Y, 5)
  658.             CALL PUTPIC(X + 1, Y + 1, 5)
  659.         END SELECT
  660.       CASE 6
  661.         SELECT CASE ROT
  662.           CASE 1
  663.             CALL PUTPIC(X, Y, 5)
  664.             CALL PUTPIC(X, Y - 1, 5)
  665.             CALL PUTPIC(X, Y + 1, 5)
  666.             CALL PUTPIC(X - 1, Y - 1, 5)
  667.           CASE 2
  668.             CALL PUTPIC(X, Y, 5)
  669.             CALL PUTPIC(X + 1, Y, 5)
  670.             CALL PUTPIC(X - 1, Y, 5)
  671.             CALL PUTPIC(X - 1, Y + 1, 5)
  672.           CASE 3
  673.             CALL PUTPIC(X, Y, 5)
  674.             CALL PUTPIC(X, Y - 1, 5)
  675.             CALL PUTPIC(X, Y + 1, 5)
  676.             CALL PUTPIC(X + 1, Y + 1, 5)
  677.           CASE 4
  678.             CALL PUTPIC(X, Y, 5)
  679.             CALL PUTPIC(X - 1, Y, 5)
  680.             CALL PUTPIC(X + 1, Y, 5)
  681.             CALL PUTPIC(X + 1, Y - 1, 5)
  682.         END SELECT
  683.       CASE 7
  684.         SELECT CASE ROT
  685.           CASE 1
  686.             CALL PUTPIC(X, Y, 5)
  687.             CALL PUTPIC(X, Y - 1, 5)
  688.             CALL PUTPIC(X + 1, Y, 5)
  689.             CALL PUTPIC(X - 1, Y, 5)
  690.           CASE 2
  691.             CALL PUTPIC(X, Y, 5)
  692.             CALL PUTPIC(X, Y - 1, 5)
  693.             CALL PUTPIC(X, Y + 1, 5)
  694.             CALL PUTPIC(X + 1, Y, 5)
  695.           CASE 3
  696.             CALL PUTPIC(X, Y, 5)
  697.             CALL PUTPIC(X - 1, Y, 5)
  698.             CALL PUTPIC(X + 1, Y, 5)
  699.             CALL PUTPIC(X, Y + 1, 5)
  700.           CASE 4
  701.             CALL PUTPIC(X, Y, 5)
  702.             CALL PUTPIC(X, Y - 1, 5)
  703.             CALL PUTPIC(X, Y + 1, 5)
  704.             CALL PUTPIC(X - 1, Y, 5)
  705.         END SELECT
  706.     END SELECT
  707. END SUB
  708.  
  709. SUB DrawRealBoard
  710. FOR ROW = 1 TO REALROWS
  711.   FOR COL = 1 TO REALCOLS
  712.     RC = COL + XDIF: RR = ROW + YDIF
  713.     SELECT CASE REALBOARD(RC - XDIF, RR - YDIF)
  714.       CASE 0: CALL PSETPIC(RC, RR, 0)
  715.       CASE 1: CALL PSETPIC(RC, RR, 1)
  716.       CASE 2: CALL PSETPIC(RC, RR, 2)
  717.       CASE 3: CALL PSETPIC(RC, RR, 3)
  718.       CASE 4: CALL PSETPIC(RC, RR, 4)
  719.       CASE 5: CALL PSETPIC(RC, RR, 5)
  720.       CASE 6: CALL PSETPIC(RC, RR, 6)
  721.       CASE 7: CALL PSETPIC(RC, RR, 7)
  722.     END SELECT
  723.   NEXT COL
  724. NEXT ROW
  725. END SUB
  726.  
  727. SUB ERASEPIECE (X, Y, piecenum, ROT)
  728.     SELECT CASE piecenum
  729.       CASE 1
  730.         IF ROT = 1 THEN
  731.           CALL XORPIC(X, Y, 1)
  732.           CALL XORPIC(X, Y - 1, 1)
  733.           CALL XORPIC(X, Y + 1, 1)
  734.           CALL XORPIC(X, Y + 2, 1)
  735.         ELSE
  736.           CALL XORPIC(X, Y, 1)
  737.           CALL XORPIC(X - 1, Y, 1)
  738.           CALL XORPIC(X + 1, Y, 1)
  739.           CALL XORPIC(X + 2, Y, 1)
  740.         END IF
  741.       CASE 2
  742.         CALL XORPIC(X, Y, 2)
  743.         CALL XORPIC(X + 1, Y, 2)
  744.         CALL XORPIC(X, Y + 1, 2)
  745.         CALL XORPIC(X + 1, Y + 1, 2)
  746.       CASE 3
  747.         IF ROT = 1 THEN
  748.           CALL XORPIC(X, Y, 3)
  749.           CALL XORPIC(X - 1, Y, 3)
  750.           CALL XORPIC(X, Y + 1, 3)
  751.           CALL XORPIC(X + 1, Y + 1, 3)
  752.         ELSE
  753.           CALL XORPIC(X, Y, 3)
  754.           CALL XORPIC(X, Y - 1, 3)
  755.           CALL XORPIC(X - 1, Y, 3)
  756.           CALL XORPIC(X - 1, Y + 1, 3)
  757.         END IF
  758.       CASE 4
  759.         IF ROT = 1 THEN
  760.           CALL XORPIC(X, Y, 4)
  761.           CALL XORPIC(X + 1, Y, 4)
  762.           CALL XORPIC(X - 1, Y + 1, 4)
  763.           CALL XORPIC(X, Y + 1, 4)
  764.         ELSE
  765.           CALL XORPIC(X, Y, 4)
  766.           CALL XORPIC(X - 1, Y, 4)
  767.           CALL XORPIC(X - 1, Y - 1, 4)
  768.           CALL XORPIC(X, Y + 1, 4)
  769.         END IF
  770.       CASE 5
  771.         SELECT CASE ROT
  772.           CASE 1
  773.             CALL XORPIC(X, Y, 5)
  774.             CALL XORPIC(X, Y - 1, 5)
  775.             CALL XORPIC(X, Y + 1, 5)
  776.             CALL XORPIC(X + 1, Y - 1, 5)
  777.           CASE 2
  778.             CALL XORPIC(X, Y, 5)
  779.             CALL XORPIC(X - 1, Y, 5)
  780.             CALL XORPIC(X - 1, Y - 1, 5)
  781.             CALL XORPIC(X + 1, Y, 5)
  782.           CASE 3
  783.             CALL XORPIC(X, Y, 5)
  784.             CALL XORPIC(X, Y + 1, 5)
  785.             CALL XORPIC(X, Y - 1, 5)
  786.             CALL XORPIC(X - 1, Y + 1, 5)
  787.           CASE 4
  788.             CALL XORPIC(X, Y, 5)
  789.             CALL XORPIC(X - 1, Y, 5)
  790.             CALL XORPIC(X + 1, Y, 5)
  791.             CALL XORPIC(X + 1, Y + 1, 5)
  792.         END SELECT
  793.       CASE 6
  794.         SELECT CASE ROT
  795.           CASE 1
  796.             CALL XORPIC(X, Y, 5)
  797.             CALL XORPIC(X, Y - 1, 5)
  798.             CALL XORPIC(X, Y + 1, 5)
  799.             CALL XORPIC(X - 1, Y - 1, 5)
  800.           CASE 2
  801.             CALL XORPIC(X, Y, 5)
  802.             CALL XORPIC(X + 1, Y, 5)
  803.             CALL XORPIC(X - 1, Y, 5)
  804.             CALL XORPIC(X - 1, Y + 1, 5)
  805.           CASE 3
  806.             CALL XORPIC(X, Y, 5)
  807.             CALL XORPIC(X, Y - 1, 5)
  808.             CALL XORPIC(X, Y + 1, 5)
  809.             CALL XORPIC(X + 1, Y + 1, 5)
  810.           CASE 4
  811.             CALL XORPIC(X, Y, 5)
  812.             CALL XORPIC(X - 1, Y, 5)
  813.             CALL XORPIC(X + 1, Y, 5)
  814.             CALL XORPIC(X + 1, Y - 1, 5)
  815.         END SELECT
  816.       CASE 7
  817.         SELECT CASE ROT
  818.           CASE 1
  819.             CALL XORPIC(X, Y, 5)
  820.             CALL XORPIC(X, Y - 1, 5)
  821.             CALL XORPIC(X + 1, Y, 5)
  822.             CALL XORPIC(X - 1, Y, 5)
  823.           CASE 2
  824.             CALL XORPIC(X, Y, 5)
  825.             CALL XORPIC(X, Y - 1, 5)
  826.             CALL XORPIC(X, Y + 1, 5)
  827.             CALL XORPIC(X + 1, Y, 5)
  828.           CASE 3
  829.             CALL XORPIC(X, Y, 5)
  830.             CALL XORPIC(X - 1, Y, 5)
  831.             CALL XORPIC(X + 1, Y, 5)
  832.             CALL XORPIC(X, Y + 1, 5)
  833.           CASE 4
  834.             CALL XORPIC(X, Y, 5)
  835.             CALL XORPIC(X, Y - 1, 5)
  836.             CALL XORPIC(X, Y + 1, 5)
  837.             CALL XORPIC(X - 1, Y, 5)
  838.         END SELECT
  839.     END SELECT
  840. END SUB
  841.  
  842. SUB GetPicture (X, Y, PICNUM)
  843.  
  844. SELECT CASE PICNUM
  845.  
  846. CASE 1
  847. OPEN "I", #1, DRIVE + DIRECTORY + "BLUEbloc.SGA"
  848. INPUT #1, HSIZE, VSIZE
  849. CALL DrawPicture(X, Y)
  850. GET (X, Y)-(X + HSIZE, Y + VSIZE), BLUE%
  851. CLOSE
  852.  
  853. CASE 2
  854. OPEN "I", #1, DRIVE + DIRECTORY + "REDbloc.SGA"
  855. INPUT #1, HSIZE, VSIZE
  856. CALL DrawPicture(X, Y)
  857. GET (X, Y)-(X + HSIZE, Y + VSIZE), RED%
  858. CLOSE
  859.  
  860. CASE 3
  861. OPEN "I", #1, DRIVE + DIRECTORY + "CYANBLOC.SGA"
  862. INPUT #1, HSIZE, VSIZE
  863. CALL DrawPicture(X, Y)
  864. GET (X, Y)-(X + HSIZE, Y + VSIZE), CYAN%
  865. CLOSE
  866.  
  867. CASE 4
  868. OPEN "I", #1, DRIVE + DIRECTORY + "PURPLEBL.SGA"
  869. INPUT #1, HSIZE, VSIZE
  870. CALL DrawPicture(X, Y)
  871. GET (X, Y)-(X + HSIZE, Y + VSIZE), PURPLE%
  872. CLOSE
  873.  
  874. CASE 5
  875. OPEN "I", #1, DRIVE + DIRECTORY + "GREENblo.SGA"
  876. INPUT #1, HSIZE, VSIZE
  877. CALL DrawPicture(X, Y)
  878. GET (X, Y)-(X + HSIZE, Y + VSIZE), GREEN%
  879. CLOSE
  880.  
  881. CASE 6
  882. OPEN "I", #1, DRIVE + DIRECTORY + "BG_BRICK.SGA"
  883. INPUT #1, HSIZE, VSIZE
  884. CALL DrawPicture(X, Y)
  885. GET (X, Y)-(X + HSIZE, Y + VSIZE), BRICK%
  886. CLOSE
  887.  
  888. CASE 7
  889. OPEN "I", #1, DRIVE + DIRECTORY + "BG_STEEL.SGA"
  890. INPUT #1, HSIZE, VSIZE
  891. CALL DrawPicture(X, Y)
  892. GET (X, Y)-(X + HSIZE, Y + VSIZE), STEEL%
  893. CLOSE
  894.  
  895. CASE 8
  896. OPEN "I", #1, DRIVE + DIRECTORY + "DELDES.SGA"
  897. INPUT #1, HSIZE, VSIZE
  898. CALL DrawPicture(X, Y)
  899. GET (X, Y)-(X + HSIZE, Y + VSIZE), DELUSION1%
  900. CLOSE
  901. CASE 9
  902. OPEN "I", #1, DRIVE + DIRECTORY + "DELDES2.SGA"
  903. INPUT #1, HSIZE, VSIZE
  904. CALL DrawPicture(X, Y)
  905. GET (X, Y)-(X + HSIZE, Y + VSIZE), DELUSION2%
  906. CLOSE
  907. CASE 10
  908. OPEN "I", #1, DRIVE + DIRECTORY + "DELDES3.SGA"
  909. INPUT #1, HSIZE, VSIZE
  910. CALL DrawPicture(X, Y)
  911. GET (X, Y)-(X + HSIZE, Y + VSIZE), DELUSION3%
  912. CLOSE
  913. CASE 11
  914. OPEN "I", #1, DRIVE + DIRECTORY + "DELDES4.SGA"
  915. INPUT #1, HSIZE, VSIZE
  916. CALL DrawPicture(X, Y)
  917. GET (X, Y)-(X + HSIZE, Y + VSIZE), DELUSION4%
  918. CLOSE
  919. END SELECT
  920. END SUB
  921.  
  922. SUB InitBoard (BOARD)
  923. FOR ROW = 2 TO NUMROWS - 2
  924.   BOARD(9, ROW) = 7
  925.   BOARD(NUMCOLS - 7, ROW) = 7
  926. NEXT ROW
  927. FOR COL = 9 TO NUMCOLS - 7
  928.   BOARD(COL, NUMROWS - 2) = 7
  929. NEXT COL
  930. FOR COL = 2 TO 7
  931.   FOR ROW = 2 TO 7
  932.     BOARD(COL, ROW) = 7
  933.   NEXT ROW
  934. NEXT COL
  935. FOR COL = 2 TO 7
  936.   FOR ROW = 12 TO 17
  937.     BOARD(COL, ROW) = 7
  938.   NEXT ROW
  939. NEXT COL
  940. END SUB
  941.  
  942. SUB InitRealBoard : SHARED REALBOARD, BOARD
  943. FOR RR = 1 TO REALROWS
  944.   FOR RC = 1 TO REALCOLS
  945.     REALBOARD(RC, RR) = BOARD(RC + XDIF, RR + YDIF)
  946.   NEXT RC
  947. NEXT RR
  948. END SUB
  949.  
  950. SUB Intro
  951. COLOR 15
  952. PRINT "                            Q-BASIC BLOCKMASTER"
  953. COLOR 3
  954. PRINT
  955. PRINT "Here it is, Q-BASIC BLOCKMASTER by Mike Merchant! "
  956. PRINT "If you like this program, REGISTER IT!"
  957. PRINT
  958. PRINT "For those who do register there is a great big bag of goodies:"
  959. COLOR 14
  960. PRINT "         1.  The Hawiian Style version of Q-BASIC BLOCKMASTER"
  961. PRINT
  962. PRINT "         2.  Gorgeous delusion design wallpapers for Windows"
  963. PRINT "             (like the one in the background of this program)"
  964. PRINT
  965. PRINT "         3.  Customize your own blocks and backgrounds with the"
  966. PRINT "             Graphic Artist, a SGA(stacked graphic array) graphic"
  967. PRINT "             designer used to make the blocks and backgrounds of"
  968. PRINT "             Q-BASIC BLOCKMASTER."
  969. PRINT
  970. PRINT "         4.  Updates on new programs by Mike Merchant (like The"
  971. PRINT "             Invisible Man and Starbase Exaliber)"
  972. PRINT
  973. COLOR 3
  974. PRINT "There is no form to fill out. "
  975. PRINT "Simply send your name, CompuServe address, and $5.00 to:"
  976. COLOR 15
  977. PRINT ""
  978. PRINT "                         Mike Merchant"
  979. PRINT "                         BLOCKMASTER"
  980. PRINT "                         2333 Glenstone Ave."
  981. PRINT "                         Hacienda Heights, CA  91745"
  982. PRINT
  983. COLOR 3
  984. PRINT "                         Press any key to continue...."
  985. PRINT
  986. PRINT "Converted to PowerBASIC by Dave Navarro, Jr."
  987. dummy$ = INPUT$(1)
  988. CLS
  989. COLOR 15
  990. PRINT "                            Q-BASIC BLOCKMASTER"
  991. COLOR 3
  992. PRINT
  993. PRINT "    To play BLOCKMASTER use the keyboard number pad.  NUMLOCK MUST BE ON!"
  994. PRINT
  995. PRINT "To flip a piece use the 5 key.  The speed will slowly increase as you complete "
  996. PRINT
  997. PRINT "more lines.  To end the game prematurely press Q.  Have fun!"
  998. COLOR 3
  999. PRINT : PRINT : PRINT : PRINT : PRINT
  1000. PRINT "                         Press any key to continue...."
  1001. dummy$ = INPUT$(1)
  1002. CLS
  1003. END SUB
  1004.  
  1005. FUNCTION KeyPressed (D$)
  1006. SELECT CASE D$
  1007. CASE "2", "4", "6", "5", "Q"
  1008.   KeyPressed = 1
  1009. CASE ELSE
  1010.   KeyPressed = 0: D$ = ""
  1011. END SELECT
  1012. END FUNCTION
  1013.  
  1014. FUNCTION OverLapped (X, Y, piecenum, ROT) : SHARED BOARD
  1015.     SELECT CASE piecenum
  1016.       CASE 1
  1017.         IF ROT = 1 THEN
  1018.           IF BOARD(X, Y) = 1 OR BOARD(X, Y - 1) = 1 OR BOARD(X, Y + 1) = 1 OR BOARD(X, Y + 2) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1019.         ELSE
  1020.           IF BOARD(X, Y) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X + 2, Y) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1021.         END IF
  1022.       CASE 2
  1023.         IF BOARD(X, Y) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X, Y + 1) >= 1 OR BOARD(X + 1, Y + 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1024.       CASE 3
  1025.         IF ROT = 1 THEN
  1026.           IF BOARD(X, Y) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X, Y + 1) >= 1 OR BOARD(X + 1, Y + 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1027.         ELSE
  1028.           IF BOARD(X, Y) >= 1 OR BOARD(X, Y - 1) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X - 1, Y + 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1029.         END IF
  1030.       CASE 4
  1031.         IF ROT = 1 THEN
  1032.           IF BOARD(X, Y) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X - 1, Y + 1) >= 1 OR BOARD(X, Y + 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1033.         ELSE
  1034.           IF BOARD(X, Y) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X - 1, Y - 1) >= 1 OR BOARD(X, Y + 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1035.         END IF
  1036.       CASE 5
  1037.         SELECT CASE ROT
  1038.           CASE 1
  1039.             IF BOARD(X, Y) >= 1 OR BOARD(X, Y - 1) >= 1 OR BOARD(X, Y + 1) >= 1 OR BOARD(X + 1, Y - 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1040.           CASE 2
  1041.             IF BOARD(X, Y) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X - 1, Y - 1) >= 1 OR BOARD(X + 1, Y) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1042.           CASE 3
  1043.             IF BOARD(X, Y) >= 1 OR BOARD(X, Y + 1) >= 1 OR BOARD(X, Y - 1) >= 1 OR BOARD(X - 1, Y + 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1044.           CASE 4
  1045.             IF BOARD(X, Y) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X + 1, Y + 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1046.         END SELECT
  1047.       CASE 6
  1048.         SELECT CASE ROT
  1049.           CASE 1
  1050.             IF BOARD(X, Y) >= 1 OR BOARD(X, Y - 1) >= 1 OR BOARD(X, Y + 1) >= 1 OR BOARD(X - 1, Y - 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1051.           CASE 2
  1052.             IF BOARD(X, Y) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X - 1, Y + 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1053.           CASE 3
  1054.             IF BOARD(X, Y) >= 1 OR BOARD(X, Y - 1) >= 1 OR BOARD(X, Y + 1) >= 1 OR BOARD(X + 1, Y + 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1055.           CASE 4
  1056.             IF BOARD(X, Y) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X + 1, Y - 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1057.         END SELECT
  1058.       CASE 7
  1059.         SELECT CASE ROT
  1060.           CASE 1
  1061.             IF BOARD(X, Y) >= 1 OR BOARD(X, Y - 1) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X - 1, Y) >= 1 THEN OverLapped = 1:   ELSE OverLapped = 0
  1062.           CASE 2
  1063.             IF BOARD(X, Y) >= 1 OR BOARD(X, Y - 1) >= 1 OR BOARD(X, Y + 1) >= 1 OR BOARD(X + 1, Y) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1064.           CASE 3
  1065.             IF BOARD(X, Y) >= 1 OR BOARD(X - 1, Y) >= 1 OR BOARD(X + 1, Y) >= 1 OR BOARD(X, Y + 1) >= 1 THEN OverLapped = 1:  ELSE OverLapped = 0
  1066.           CASE 4
  1067.             IF BOARD(X, Y) >= 1 OR BOARD(X, Y - 1) >= 1 OR BOARD(X, Y + 1) >= 1 OR BOARD(X - 1, Y) >= 1 THEN OverLapped = 1:   ELSE OverLapped = 0
  1068.         END SELECT
  1069.     END SELECT
  1070. END FUNCTION
  1071.  
  1072. SUB PSETPIC (COL, ROW, PICNUM)
  1073. SHARED PICLIST
  1074. X = TOPLEFTX(COL)
  1075. Y = TOPLEFTY(ROW)
  1076. IF AlreadyThere(PUTLIST, PICNUM) = 1 THEN
  1077. IF X < 0 OR X > 639 THEN EXIT SUB
  1078. IF Y < 0 OR Y > 479 THEN EXIT SUB
  1079. SELECT CASE PICNUM
  1080.   CASE 0: LINE (X, Y)-(X + 20, Y + 20), 0, BF
  1081.   CASE 1: PUT (X, Y), BLUE, PSET
  1082.   CASE 2: PUT (X, Y), RED, PSET
  1083.   CASE 3: PUT (X, Y), CYAN, PSET
  1084.   CASE 4: PUT (X, Y), PURPLE, PSET
  1085.   CASE 5: PUT (X, Y), GREEN, PSET
  1086.   CASE 6: PUT (X, Y), BRICK, PSET
  1087.   CASE 7: PUT (X, Y), STEEL, PSET
  1088.   CASE 8: PUT (X, Y), DELUSION1, PSET
  1089.   CASE 9: PUT (X, Y), DELUSION2, PSET
  1090.   CASE 10: PUT (X, Y), DELUSION3, PSET
  1091.   CASE 11: PUT (X, Y), DELUSION4, PSET
  1092. END SELECT
  1093. ELSE
  1094.   CALL GetPicture(X, Y, PICNUM)
  1095.   PUTLIST(PICNUM) = 1
  1096. END IF
  1097. END SUB
  1098.  
  1099. SUB PUTPIC (COL, ROW, PICNUM) : SHARED PICLIST
  1100. X = TOPLEFTX(COL)
  1101. Y = TOPLEFTY(ROW)
  1102. IF AlreadyThere(PUTLIST, PICNUM) = 1 THEN
  1103. SELECT CASE PICNUM
  1104.   CASE 1: PUT (X, Y), BLUE%
  1105.   CASE 2: PUT (X, Y), RED%
  1106.   CASE 3: PUT (X, Y), CYAN%
  1107.   CASE 4: PUT (X, Y), PURPLE%
  1108.   CASE 5: PUT (X, Y), GREEN%
  1109.   CASE 6: PUT (X, Y), BRICK%
  1110.   CASE 7: PUT (X, Y), STEEL%
  1111.   CASE 8: PUT (X, Y), DELUSION1%
  1112.   CASE 9: PUT (X, Y), DELUSION2%
  1113.   CASE 10: PUT (X, Y), DELUSION3%
  1114.   CASE 11: PUT (X, Y), DELUSION4%
  1115. END SELECT
  1116. ELSE
  1117.   CALL GetPicture(X, Y, PICNUM)
  1118.   PUTLIST(PICNUM) = 1
  1119. END IF
  1120. END SUB
  1121.  
  1122. FUNCTION Settled (X, Y, piecenum, ROT) : SHARED BOARD, MOVETIME
  1123. IF OverLapped(X, Y + 1, piecenum, ROT) = 1 THEN
  1124.   Settled = 1
  1125. ELSE
  1126.   Settled = 0
  1127. END IF
  1128. END FUNCTION
  1129.  
  1130. FUNCTION TOPLEFTX (COL)
  1131.   TOPLEFTX = COL * 21
  1132. END FUNCTION
  1133.  
  1134. FUNCTION TOPLEFTY (ROW)
  1135. TOPLEFTY = (ROW - 1) * 21
  1136. END FUNCTION
  1137.  
  1138. SUB XORPIC (COL, ROW, PICNUM)
  1139.   X = TOPLEFTX(COL)
  1140.   Y = TOPLEFTY(ROW)
  1141.   SELECT CASE PICNUM
  1142.     CASE 1: PUT (X, Y), BLUE%, XOR
  1143.     CASE 2: PUT (X, Y), RED%, XOR
  1144.     CASE 3: PUT (X, Y), CYAN%, XOR
  1145.     CASE 4: PUT (X, Y), PURPLE%, XOR
  1146.     CASE 5: PUT (X, Y), GREEN%, XOR
  1147.   END SELECT
  1148. END SUB
  1149.  
  1150.