DECLARE SUB Pause (A!)
DECLARE SUB Credits ()
DECLARE SUB Help ()
DECLARE SUB kbRepeat (rate%, delay%)
DECLARE SUB ScoreBoard ()
DECLARE SUB Menu (A)
DECLARE SUB DrawBrick (X!, Y!, C!)
DECLARE SUB Explode (X!, Y!, F!, T!)
DECLARE SUB DRAWL (X!, Y!, C!)
' $INCLUDE: 'C:\QBASIC\QB.BI'
DIM SHARED inRegs AS RegType, outRegs AS RegType, PR(800)
COMMON SHARED UNAME$
RANDOMIZE TIMER
SCREEN 13
kbRepeat 0, 0

BRIX = 20
DIM BrX(BRIX), BrY(BRIX), BrC(BRIX), BrM(BRIX), BrE(BRIX), BrAN(BRIX)
Menu 0
RESTRT:
CLS
T = 0
T1 = 0: T2 = 0: T3 = 0: SCORE = 0
tb& = 0
Br = 0
XT = 1
cx = 160
FOR N = 1 TO BRIX
BrX(N) = INT(RND * 35) * 10
BrY(N) = INT(RND * 200) - 200
BrC(N) = INT(RND * 3) + 1
BrM(N) = 1
Br = Br + 1
tb& = tb& + 1
NEXT N
CLS
COLOR 15
LOCATE 12, 16: PRINT "LOADING..."
TIMER ON
ON TIMER(1) GOSUB 1
DO
T1 = T1 + 1
LOOP
1
TIMER OFF
TIMER ON
ON TIMER(1) GOSUB 2
DO
T2 = T2 + 1
LOOP
2
TIMER OFF
TIMER ON
ON TIMER(1) GOSUB 3
DO
T3 = T3 + 1
LOOP
3
TIMER OFF
T = (T1 + T2 + T3) / 3
CLS
DO
  KEYIN$ = ""
  KEYIN$ = INKEY$
 
  inRegs.ax = &HC06
  CALL INTERRUPT(&H21, inRegs, outRegs)

 
  FOR SLW = 1 TO T / 24
  NEXT SLW
  FOR N = 1 TO BRIX
    IF BrE(N) >= 1 THEN
    Explode BrX(N) + 4, BrY(N) - 2, BrE(N), 0
    BrE(N) = BrE(N) + 1
    IF BrE(N) >= 6 AND tb& < 300 THEN
    BrE(N) = 0
    BrX(N) = INT(RND * 35) * 10
    BrY(N) = -10
    IF G2 >= 1 THEN BrC(N) = 2: G2 = G2 - 1: GOTO SKIPRANC:
    BrCr = INT(RND * 14) + 1
    IF BrCr = 1 THEN BrC(N) = 1
    IF BrCr = 2 THEN BrC(N) = 1
    IF BrCr = 3 THEN BrC(N) = 2
    IF BrCr = 4 THEN BrC(N) = 2
    IF BrCr = 5 THEN BrC(N) = 3
    IF BrCr = 6 THEN BrC(N) = 3
    IF BrCr = 7 THEN BrC(N) = 3
    IF BrCr = 8 THEN BrC(N) = 4
    IF BrCr = 9 THEN BrC(N) = 1
    IF BrCr = 10 THEN BrC(N) = 2
    IF BrCr = 11 THEN BrC(N) = 3
    IF BrCr = 12 THEN BrC(N) = 6
    IF BrCr = 13 THEN BrC(N) = 6
    IF BrCr = 14 THEN BrC(N) = 6
SKIPRANC:
    BrM(N) = 1
    Br = Br + 1
    tb& = tb& + 1
    END IF
    END IF
    IF BrM(N) = 0 THEN GOTO SKIPBRIX1:
    DrawBrick BrX(N), BrY(N), 0
    IF BrC(N) = 4 THEN BrY(N) = BrY(N) + 4
    IF BrC(N) = 1 THEN BrY(N) = BrY(N) + 3
    IF BrC(N) = 2 THEN BrY(N) = BrY(N) + 2
    IF BrC(N) = 3 THEN BrY(N) = BrY(N) + 1
    IF BrC(N) = 6 THEN BrY(N) = BrY(N) + 2
    'IF POINT(BrX(N) + 5, BrY(N) + 2) = 25 OR POINT(BrX(N) + 5, BrY(N) + 3) = 25 OR POINT(BrX(N) + 1, BrY(N) + 3) = 25 OR POINT(BrX(N) + 9, BrY(N) + 3) = 25 THEN
	IF BrX(N) >= (cx - 10) AND BrX(N) <= (cx + 19) AND BrY(N) >= 174 AND BrY(N) <= 185 THEN
      IF XT > 0 THEN XT = XT - 1
      IF XT = 0 THEN Xx = 1
      IF BrC(N) = 1 THEN BrM(N) = 0: BRXO = BRXO - 1: SCORE = SCORE + (200 * Xx):     DrawBrick BrX(N), BrY(N), 0: BrE(N) = 1: Br = Br - 1
      IF BrC(N) = 2 THEN BrM(N) = 0: BRXO = BRXO - 1: SCORE = SCORE + (75 * Xx):      DrawBrick BrX(N), BrY(N), 0: BrE(N) = 1: Br = Br - 1
      IF BrC(N) = 3 THEN BrM(N) = 0: BRXO = BRXO - 1: SCORE = SCORE + (25 * Xx):      DrawBrick BrX(N), BrY(N), 0: BrE(N) = 1: Br = Br - 1
      IF BrC(N) = 6 THEN BrM(N) = 0: BRXO = BRXO - 1: SCORE = SCORE - (100 * Xx):      DrawBrick BrX(N), BrY(N), 0: BrE(N) = 1: Br = Br - 1
      IF BrC(N) = 4 THEN
	IF Xx = 0 THEN Xx = 1
	XT = 5: Xx = Xx + 1
	Br = Br - 1
      END IF
      BrM(N) = 0: DrawBrick BrX(N), BrY(N), 0: BrE(N) = 1
    END IF
    DrawBrick BrX(N), BrY(N), BrC(N)
    IF BrY(N) >= 210 THEN BrM(N) = 0: BRXO = BRXO - 1: DrawBrick BrX(N), BrY(N), 0: SCORE = SCORE - 10: BrE(N) = 1: Br = Br - 1
GOTO SKIPSKIPBRIX:
SKIPBRIX1:
    DrawBrick 1, 1, 0
    DrawBrick 1, 1, 0
SKIPSKIPBRIX:
  LINE (0, 0)-(320, 0), 0
  NEXT N
  LINE (0, 0)-(320, 0), 0
  DrawBrick cx, 180, 5
  IF KEYIN$ = CHR$(0) + "K" AND cx > 5 THEN cx = cx - 6
  IF KEYIN$ = CHR$(0) + "M" AND cx < 290 THEN cx = cx + 6
  LOCATE 1, 28: PRINT "Score"; SCORE
  IF Br = 0 AND tb& >= 299 THEN GOTO DONEGAME:
  IF Xx >= 1 AND XT >= 1 THEN LOCATE 2, 1: PRINT "x"; Xx
  IF XT = 0 THEN LOCATE 2, 1: PRINT "     "
  IF KEYIN$ = "p" OR KEYIN$ = "P" THEN Pause 1
LOOP UNTIL KEYIN$ = "q" OR KEYIN$ = "Q"

DONEGAME:
CLS
SHIFT = INT(RND * 10)
INCR$ = INCR$ + CHR$(SHIFT + 65)
FOR I = 2 TO LEN(STR$(SCORE))
num = ASC(MID$(STR$(SCORE), I, 1))
INCR$ = INCR$ + CHR$(num + 17 + SHIFT)
NEXT I
IF UNAME$ = "" THEN UNAME$ = "PLAYER 1"
OPEN "BFSCORE.TXT" FOR APPEND AS #1
PRINT #1, UNAME$, SCORE, INCR$
CLOSE
LOCATE 12, 12: PRINT "Your Score is"; SCORE
LOCATE 15, 12: PRINT "Your Score Code is "
LOCATE 17, 19: PRINT INCR$
LOCATE 23, 11: PRINT "   - Press ENTER - "
WHILE INKEY$ <> CHR$(13)
WEND
CLS : COLOR 15: PRINT "Thanks for playing BrickFall!": PRINT : PRINT "-Lenny": END

SUB Credits
CLS
COLOR 15
PRINT "Credits:               (iB3K usernames)"
PRINT : PRINT : PRINT
PRINT "Game designer/Lead programmer     Lenny"
PRINT : PRINT
PRINT "Secondary programmer          Castellan"
PRINT : PRINT
PRINT "Marketing distrubitor/Compiler     Hawk"
LOCATE 23, 10: PRINT "    - Press ENTER - "
WHILE INKEY$ <> CHR$(13)
WEND
Menu 1
END SUB

SUB DrawBrick (X, Y, C)
IF C = 0 THEN : LINE (X, Y - 3)-(X + 9, Y + 4), 0, BF
IF C = 1 THEN
LINE (X, Y + 1)-(X + 9, Y + 4), 112, BF
LINE (X + 1, Y)-(X + 3, Y), 112, BF
LINE (X + 6, Y)-(X + 8, Y), 112, BF
PSET (X + 1, Y), 40: PSET (X + 6, Y), 40: PSET (X + 3, Y), 184: PSET (X + 8, Y), 184
LINE (X, Y + 4)-(X + 9, Y + 4), 184, BF
LINE (X + 9, Y + 1)-(X + 9, Y + 4), 184, BF
END IF
IF C = 2 THEN
LINE (X, Y + 1)-(X + 9, Y + 4), 120, BF
LINE (X + 1, Y)-(X + 3, Y), 120, BF
LINE (X + 6, Y)-(X + 8, Y), 120, BF
PSET (X + 1, Y), 48: PSET (X + 6, Y), 48: PSET (X + 3, Y), 192: PSET (X + 8, Y), 192
LINE (X, Y + 4)-(X + 9, Y + 4), 192, BF
LINE (X + 9, Y + 1)-(X + 9, Y + 4), 192, BF

END IF
IF C = 3 THEN
LINE (X, Y + 1)-(X + 9, Y + 4), 104, BF
LINE (X + 1, Y)-(X + 3, Y), 104, BF
LINE (X + 6, Y)-(X + 8, Y), 104, BF
PSET (X + 1, Y), 55: PSET (X + 6, Y), 55: PSET (X + 3, Y), 176: PSET (X + 8, Y), 176
LINE (X, Y + 4)-(X + 9, Y + 4), 176, BF
LINE (X + 9, Y + 1)-(X + 9, Y + 4), 176, BF

END IF
IF C = 4 THEN
LINE (X, Y + 1)-(X + 9, Y + 4), 114, BF
LINE (X + 1, Y)-(X + 3, Y), 114, BF
LINE (X + 6, Y)-(X + 8, Y), 114, BF
PSET (X + 1, Y), 44: PSET (X + 6, Y), 44: PSET (X + 3, Y), 186: PSET (X + 8, Y), 186
LINE (X, Y + 4)-(X + 9, Y + 4), 186, BF
LINE (X + 9, Y + 1)-(X + 9, Y + 4), 186, BF

END IF
IF C = 5 THEN
LINE (X - 6, Y)-(X + 19 + 6, Y + 2), 0, BF
LINE (X, Y + 1)-(X + 19, Y + 2), 25, BF
LINE (X + 1, Y)-(X + 3, Y), 25, BF
LINE (X + 6, Y)-(X + 8, Y), 25, BF
LINE (X + 11, Y)-(X + 13, Y), 25, BF
LINE (X + 16, Y)-(X + 18, Y), 25, BF

END IF

IF C = 6 THEN
LINE (X, Y + 1)-(X + 9, Y + 4), 18, BF
LINE (X + 1, Y)-(X + 3, Y), 18, BF
LINE (X + 6, Y)-(X + 8, Y), 18, BF
PSET (X + 1, Y), 20: PSET (X + 6, Y), 20: PSET (X + 3, Y), 17: PSET (X + 8, Y), 17
LINE (X, Y + 4)-(X + 9, Y + 4), 17, BF
LINE (X + 9, Y + 1)-(X + 9, Y + 4), 17, BF

END IF

END SUB

SUB Explode (X, Y, F, T)
LINE (X - 5, Y - 3 - 5)-(X + 9 + 5, Y + 4 + 5), 0, BF
IF F = 1 THEN CIRCLE (X, Y), 1, 44
IF F = 2 THEN CIRCLE (X, Y), 1, 0:  CIRCLE (X, Y), 3, 115
IF F = 3 THEN CIRCLE (X, Y), 3, 0: CIRCLE (X, Y), 5, 187
IF F = 4 THEN CIRCLE (X, Y), 5, 0: CIRCLE (X, Y), 9, 17
IF F = 5 THEN CIRCLE (X, Y), 9, 0
END SUB

SUB Help
CLS
COLOR 15
PRINT "How to Play;"
PRINT "The object of the game is to collect as"
PRINT "many falling bricks as possible."
PRINT "To collect a falling brick, you must"
PRINT "move your paddle (using the arrow keys)"
PRINT "directly beneath the brick."
PRINT "Different colored bricks give different"
PRINT "Amounts of score, ie. 20  75  200 -100"
PRINT "There is only one"
PRINT "special gold brick"
PRINT "that will multiply the score of the"
PRINT "other bricks you collect."
PRINT "Watch out for the black bricks, they"
PRINT "will decrease your score by 100."
PRINT "You may press `P' to pause or `Q' to"
PRINT "quit to menu anytime during the game."

DrawBrick 180, 70, 3
DrawBrick 212, 70, 2
DrawBrick 246, 70, 1
DrawBrick 246, 42, 5
DrawBrick 286, 70, 6
LOCATE 23, 10: PRINT "    - Press ENTER - "
WHILE INKEY$ <> CHR$(13)
WEND
Menu 1
END SUB

SUB kbRepeat (rate%, delay%)

  inRegs.ax = &H305
  IF delay% >= 0 AND delay% <= 2 THEN
    inRegs.bx = (delay% * &H100)
  ELSE
    inRegs.bx = &H300
  END IF

  IF rate% >= 0 AND rate <= &H1F THEN
    inRegs.bx = inRegs.bx + rate%
  ELSE
    inRegs.bx = inRegs.bx + &HC
  END IF

  CALL INTERRUPT(&H16, inRegs, outRegs)
END SUB

SUB Menu (A)
CLS
LOCATE 1: PRINT "Version .97"
DrawBrick 60, 80, 1: DrawBrick 50, 80, 1: DrawBrick 50, 75, 1:
DrawBrick 50, 70, 1: DrawBrick 50, 65, 1: DrawBrick 50, 60, 1:
DrawBrick 60, 70, 1: DrawBrick 60, 60, 1: DrawBrick 70, 65, 1:
DrawBrick 70, 75, 1:
DrawBrick 80, 80, 2: DrawBrick 80, 75, 2: DrawBrick 80, 70, 2
DrawBrick 80, 65, 2: DrawBrick 90, 65, 2: : DrawBrick 80, 60, 2: DrawBrick 100, 80, 3: DrawBrick 100, 75, 3: DrawBrick 100, 70, 3
DrawBrick 100, 60, 3: DrawBrick 110, 75, 1: DrawBrick 110, 70, 1: DrawBrick 120, 60, 1
DrawBrick 120, 80, 1: DrawBrick 110, 65, 1: DrawBrick 130, 80, 2: DrawBrick 130, 75, 2: DrawBrick 130, 70, 2
DrawBrick 130, 65, 2: DrawBrick 130, 60, 2: DrawBrick 140, 70, 2: DrawBrick 150, 65, 2: DrawBrick 150, 75, 2: DrawBrick 150, 80, 2
DrawBrick 150, 60, 2: DrawBrick 260, 80, 1: DrawBrick 250, 80, 1
DrawBrick 250, 70, 1: DrawBrick 250, 65, 1: DrawBrick 250, 60, 1: DrawBrick 250, 75, 1
DrawBrick 230, 80, 3: DrawBrick 230, 75, 3: DrawBrick 230, 70, 3: DrawBrick 230, 65, 3: DrawBrick 230, 60, 3: DrawBrick 240, 80, 3
DrawBrick 220, 80, 2: DrawBrick 220, 75, 2: DrawBrick 220, 70, 2: DrawBrick 220, 65, 2: DrawBrick 210, 60, 2: DrawBrick 200, 75, 2
DrawBrick 200, 70, 2: DrawBrick 200, 65, 2: DrawBrick 200, 80, 2: DrawBrick 180, 70, 1: DrawBrick 190, 60, 1: DrawBrick 180, 60, 1
DrawBrick 170, 80, 1: DrawBrick 170, 75, 1: DrawBrick 170, 70, 1: DrawBrick 170, 65, 1: DrawBrick 170, 60, 1: DrawBrick 210, 70, 2
IF A = 1 THEN GOTO SKIPANYKEY:
LOCATE 23, 10: PRINT "    - Press ENTER - "
DO
KEYIN$ = INKEY$


LOOP UNTIL KEYIN$ = CHR$(13)
LOCATE 23, 11: PRINT "                   "
LOCATE 23, 11: INPUT "Username: ", UNAME$:
SKIPANYKEY:
LOCATE 23, 11: PRINT "                   "
S = 1
DO
KEYIN$ = INKEY$
IF S = 1 THEN : LOCATE 15, 11: COLOR 31: PRINT " -     Play      - ":  LOCATE 17, 11: COLOR 18: PRINT "       Help        ":   LOCATE 19, 11: COLOR 18: PRINT "      Credits      ":   LOCATE 21, 11: COLOR 18: PRINT "       Exit        ":   LOCATE 23 _
, 11: COLOR 18: PRINT "    Scoreboards    "
IF S = 2 THEN : LOCATE 15, 11: COLOR 18: PRINT "       Play        ":  LOCATE 17, 11: COLOR 31: PRINT " -     Help      - ":   LOCATE 19, 11: COLOR 18: PRINT "      Credits      ":   LOCATE 21, 11: COLOR 18: PRINT "       Exit        ":   LOCATE 23 _
, 11: COLOR 18: PRINT "    Scoreboards    "
IF S = 3 THEN : LOCATE 15, 11: COLOR 18: PRINT "       Play        ":  LOCATE 17, 11: COLOR 18: PRINT "       Help        ":   LOCATE 19, 11: COLOR 31: PRINT " -    Credits    - ":   LOCATE 21, 11: COLOR 18: PRINT "       Exit        ":   LOCATE 23 _
, 11: COLOR 18: PRINT "    Scoreboards    "
IF S = 4 THEN : LOCATE 15, 11: COLOR 18: PRINT "       Play        ":  LOCATE 17, 11: COLOR 18: PRINT "       Help        ":   LOCATE 19, 11: COLOR 18: PRINT "      Credits      ":   LOCATE 21, 11: COLOR 31: PRINT " -     Exit      - ":   LOCATE 23 _
, 11: COLOR 18: PRINT "    Scoreboards    "
IF S = 5 THEN : LOCATE 15, 11: COLOR 18: PRINT "       Play        ":  LOCATE 17, 11: COLOR 18: PRINT "       Help        ":   LOCATE 19, 11: COLOR 18: PRINT "      Credits      ":   LOCATE 21, 11: COLOR 18: PRINT "       Exit        ":   LOCATE 23 _
, 11: COLOR 31: PRINT " -  Scoreboards  - "
IF KEYIN$ = CHR$(0) + "H" THEN S = S - 1
IF KEYIN$ = CHR$(0) + "P" THEN S = S + 1
IF KEYIN$ = CHR$(13) AND S = 1 THEN GOTO PLAYT
IF KEYIN$ = CHR$(13) AND S = 2 THEN Help:
IF KEYIN$ = CHR$(13) AND S = 3 THEN Credits:
IF KEYIN$ = CHR$(13) AND S = 5 THEN ScoreBoard:
IF KEYIN$ = CHR$(13) AND S = 4 THEN CLS : COLOR 15: PRINT "Thanks for playing BrickFall!": PRINT : PRINT "-Lenny": END
IF S = 6 THEN S = 1
IF S = 0 THEN S = 5
LOOP
PLAYT:
END SUB

SUB Pause (A)
IF A = 1 THEN
GET (110, 80)-(220, 100), PR
LOCATE 12, 16: PRINT "GAME PAUSED"
DO
KEYIN$ = INKEY$
LOOP UNTIL KEYIN$ <> ""
PUT (110, 80), PR, PSET
END IF
END SUB

SUB ScoreBoard
CLS
PRINT "Lenny          19745        ------    "
OPEN "BFSCORE.TXT" FOR INPUT AS #1
DO UNTIL EOF(1)

INPUT #1, OLSCORE$
PRINT OLSCORE$
LOOP
CLOSESCORE:
CLOSE
LOCATE 1
PRINT "NAME:          SCORE:       SCORE CODE:"
PRINT
LOCATE 23, 10: PRINT "    - Press ENTER - "
WHILE INKEY$ <> CHR$(13)
WEND

Menu 1
END SUB

