'===========================================================================
' Subject: KUBIK III (WITH 2 LEVELS)          Date: 01-27-98 (15:23)       
'  Author: Andrey Berezansky                  Code: QB, QBasic, PDS        
'  Origin: brznsky@cs.bgu.ac.il             Packet: GAMES.ABC
'===========================================================================
' This is a demo of KUBIK 3 with only 2 levels and a couple of bugs .

' Programmer BEREZANSKY ANDREY  email - nikol@cs.bgu.ac.il
' If you have ANYTHING to say to me (like "The game is cool") - email me !

' Controls - arrow keys.
' The game contains 2 levels .
' COMPILE IT FOR SPEED.

DEFINT A-Z
DECLARE SUB update ()
DECLARE SUB delay ()
DECLARE SUB start ()
DECLARE SUB win ()
DECLARE SUB winwin ()
DECLARE SUB level ()
DECLARE SUB lose ()
DECLARE SUB up ()
DECLARE SUB right ()
DECLARE SUB left ()
DECLARE SUB down ()
                                             
RANDOMIZE TIMER
SCREEN 9
CALL start
                                             
DIM SHARED loss(640, 10): life = 3

1 x = 20: y = 160: dlina = 7: shirina = 10: press = 6
 
CLS
lev = lev + 1
LOCATE 25, 1: PRINT "LEVEL_"; lev
LOCATE 25, 15: PRINT "LIVES_"; life
CALL level

CALL right
10 IF press = 2 THEN CALL down
   IF press = 4 THEN CALL left
   IF press = 8 THEN CALL up
   IF press = 6 THEN CALL right
   IF press = 0 THEN 100
   IF endd = 1 THEN 110
   IF press = 9 THEN 1
GOTO 10

100 IF life <> 0 THEN
      lev = lev - 1
      GOTO 1
    END IF
 
110 LOCATE 11, 21: PRINT " DO YOU WANT TO PLAY ANOTHER GAME ? (y/n) "
aa = 0: andr = 0
DO WHILE aa = 0
  SELECT CASE INKEY$
    CASE "y"
      life = 3: lev = 0: aa = 1: xx = 0: yy = 0: count = 0: endd = 0: GOTO 1
    CASE "n"
      aa = 1
  END SELECT
LOOP

SUB delay
SHARED press, dellay
IF press = 2 OR press = 8 THEN
  FOR mm = 1 TO 4000: NEXT
END IF

END SUB

SUB down
SHARED dlina, x, y, press
DO WHILE exitt = 0
  y = y + 1
'********** border ************************************
  IF y > 329 THEN
    CALL lose: exitt = 1: press = 0: GOTO 20
  END IF
'******************************************************
CALL update
'******************************************************
  FOR m = 0 TO 9
    FOR mm = 1 TO 9 STEP 2
      IF y >= loss(x + m, mm) AND y <= loss(x + m, mm + 1) THEN
        CALL lose: exitt = 1: press = 0: GOTO 20
      END IF
    NEXT mm
  NEXT m
'******************************************************
  LINE (x, y)-(x + 9, y), 11: LINE (x, y - dlina)-(x + 9, y - dlina), 0
  CALL delay
  SELECT CASE INKEY$
    CASE CHR$(0) + CHR$(77)
      x = x + 9: y = y - 6: press = 6: exitt = 1
    CASE CHR$(0) + CHR$(75)
      y = y - 6: press = 4: exitt = 1
  END SELECT
20 LOOP

END SUB

SUB left
SHARED shirina, x, y, press
DO WHILE exitt = 0
  x = x - 1
'********** border ************************************
  IF x < 2 THEN
    CALL lose: exitt = 1: press = 0: GOTO 30
  END IF
'******************************************************
CALL update
'******************************************************
  FOR mm = 1 TO 9 STEP 2
    FOR yy = 0 TO 6
      IF y + yy >= loss(x, mm) AND y + yy <= loss(x, mm + 1) THEN
        CALL lose: exitt = 1: press = 0: GOTO 30
      END IF
    NEXT yy
  NEXT mm
  FOR m = 0 TO 9
    FOR mm = 1 TO 9 STEP 2
      FOR tt = 0 TO 6
        IF y + tt >= loss(x + m, mm) AND y + tt <= loss(x + m, mm + 1) THEN
          CALL lose: exitt = 1: press = 0: GOTO 30
        END IF
      NEXT tt
    NEXT mm
  NEXT m
'******************************************************
  LINE (x, y)-(x, y + 6), 11: LINE (x + shirina, y)-(x + shirina, y + 6), 0
  CALL delay
  SELECT CASE INKEY$
    CASE CHR$(0) + CHR$(72)
      press = 8: exitt = 1
    CASE CHR$(0) + CHR$(80)
      y = y + 6: press = 2: exitt = 1
  END SELECT
30 LOOP

END SUB

SUB level
SHARED lev
'-------- preparing --------
LINE (1, 1)-(630, 330), 4, B
FOR ii = 1 TO 630
  FOR m = 1 TO 10
    loss(ii, m) = 0
  NEXT m
NEXT
'---------------------------
IF lev = 1 THEN 1001
IF lev = 2 THEN 1002
IF lev = 3 THEN 1003

1001
loss(300, 1) = 1: loss(300, 2) = 159: loss(300, 3) = 175: loss(300, 4) = 330
LINE (300, 1)-(300, 330), 4: LINE (300, 160)-(300, 174), 14
loss(630, 1) = 1: loss(630, 2) = 159: loss(630, 3) = 175: loss(630, 4) = 330
LINE (630, 1)-(630, 330), 4: LINE (630, 160)-(630, 174), 14

GOTO 10000

1002
loss(200, 1) = 1: loss(200, 2) = 100: loss(200, 3) = 150: loss(200, 4) = 330
loss(400, 1) = 1: loss(400, 2) = 100: loss(400, 3) = 150: loss(400, 4) = 330
FOR i = 201 TO 399
  loss(i, 1) = 100: loss(i, 2) = 100: loss(i, 3) = 150: loss(i, 4) = 150
NEXT
LINE (200, 1)-(400, 100), 4, B: LINE (200, 150)-(400, 330), 4, B
PAINT (210, 2), 1, 4: PAINT (210, 300), 1, 4
LINE (630, 2)-(630, 329), 14
GOTO 10000

1003
LINE (630, 2)-(630, 329), 14

LOCATE 3, 22: PRINT "THIS IS A DEMO OF MY NEXT KUBIK GAME !"
LOCATE 5, 20: PRINT "feel free to email (nikol@cs.bgu.ac.il) me "

10000
END SUB

SUB lose
SHARED life
SOUND 100, 2
life = life - 1
LOCATE 11, 22: PRINT " YOU LOSE !!! YOU HAVE "; life; "LIVES LEFT ! "
DO WHILE INKEY$ = "": LOOP
END SUB

SUB right
SHARED shirina, x, y, press
DO WHILE exitt = 0
  x = x + 1
'********** border ************************************
  IF x > 639 THEN
    CALL win: exitt = 1: press = 9: GOTO 40
  END IF
'******************************************************
CALL update
'******************************************************
  FOR mm = 1 TO 9 STEP 2
    FOR yy = 0 TO 6
      IF y + yy >= loss(x, mm) AND y + yy <= loss(x, mm + 1) THEN
        CALL lose: exitt = 1: press = 0: GOTO 40
      END IF
    NEXT yy
  NEXT mm
  FOR m = 0 TO 9
    FOR mm = 1 TO 9 STEP 2
        FOR tt = 0 TO 6
          IF y + tt >= loss(x - m, mm) AND y + tt <= loss(x - m, mm + 1) THEN
            CALL lose: exitt = 1: press = 0: GOTO 40
          END IF
        NEXT tt
    NEXT mm
  NEXT m
'******************************************************
  LINE (x, y)-(x, y + 6), 11: LINE (x - shirina, y)-(x - shirina, y + 6), 0
  CALL delay
  SELECT CASE INKEY$
    CASE CHR$(0) + CHR$(72)
      x = x - 9: press = 8: exitt = 1
    CASE CHR$(0) + CHR$(80)
      press = 2: x = x - 9: y = y + 6: exitt = 1
  END SELECT
40 LOOP

END SUB

SUB start
COLOR 8, 8
LOCATE 4, 33: PRINT "KUBIK   III"
LOCATE 8, 24: PRINT "Programmed by                  "
LOCATE 9, 24: PRINT "              Berezansky Andrey"
LOCATE 12, 27: PRINT "email(nikol@cs.bgu.ac.il)"
LOCATE 24, 27: PRINT "PRESS ANY KEY TO CONTINUE";


DO WHILE INKEY$ = ""
ii = mm
FOR i = 21 TO 57
  ii = ii + 1: COLOR ii: IF ii = 7 THEN ii = 1
  LOCATE 2, i: PRINT CHR$(205)
NEXT
ii = ii + 1: IF ii = 7 THEN ii = 1
COLOR ii: LOCATE 2, 58: PRINT CHR$(187)
FOR i = 3 TO 14
  ii = ii + 1: COLOR ii: IF ii = 7 THEN ii = 1
  LOCATE i, 58: PRINT CHR$(186)
NEXT
ii = ii + 1: IF ii = 7 THEN ii = 1
COLOR ii: LOCATE 15, 58: PRINT CHR$(188)
FOR i = 57 TO 21 STEP -1
  ii = ii + 1: COLOR ii: IF ii = 7 THEN ii = 1
  LOCATE 15, i: PRINT CHR$(205)
NEXT
ii = ii + 1: IF ii = 7 THEN ii = 1
COLOR ii: LOCATE 15, 20: PRINT CHR$(200)
FOR i = 14 TO 3 STEP -1
  ii = ii + 1: COLOR ii: IF ii = 7 THEN ii = 1
  LOCATE i, 20: PRINT CHR$(186)
NEXT
ii = ii + 1: IF ii = 7 THEN ii = 1
COLOR ii: LOCATE 2, 20: PRINT CHR$(201)
FOR iii = 1 TO 20000: NEXT
mm = mm + 1: IF mm = 7 THEN mm = 1
LOOP
COLOR 15, 0

END SUB

SUB up
SHARED dlina, x, y, press
DO WHILE exitt = 0
  y = y - 1
'********* border *************************************
  IF y < 2 THEN
    CALL lose: exitt = 1: press = 0: GOTO 60
  END IF
'******************************************************
CALL update
'******************************************************
  FOR m = 0 TO 9
    FOR mm = 1 TO 9 STEP 2
      IF y >= loss(x + m, mm) AND y <= loss(x + m, mm + 1) THEN
        CALL lose: exitt = 1: press = 0: GOTO 60
      END IF
    NEXT mm
  NEXT m
'******************************************************
  LINE (x, y)-(x + 9, y), 11: LINE (x, y + dlina)-(x + 9, y + dlina), 0
  CALL delay
  SELECT CASE INKEY$
    CASE CHR$(0) + CHR$(77)
      x = x + 9: press = 6: exitt = 1
    CASE CHR$(0) + CHR$(75)
      press = 4: exitt = 1
  END SELECT
60 LOOP
END SUB

SUB update
SHARED lev, xx, count, yy
IF lev = 1 THEN 10010
IF lev = 2 THEN 10020
IF lev = 3 THEN 20000

10010
'---------------------------------------------
IF count = 1 THEN yy = yy + 5 ELSE yy = yy - 5
IF (yy + 1600) / 10 < 3 THEN count = 1
IF (yy + 1600) / 10 > 313 THEN count = 0
loss(300, 1) = 1: loss(300, 2) = (yy + 1590) / 10
loss(300, 3) = (yy + 1750) / 10: loss(300, 4) = 330
LINE (300, 1)-(300, 330), 4: LINE (300, (yy + 1600) / 10)-(300, (yy + 1740) / 10), 14
'---------------------------------------------
GOTO 20000

10020
'---------------------------------------------
IF count = 0 THEN yy = yy + 1 ELSE yy = yy - 1
IF yy > 49 THEN count = 1
IF yy < 1 THEN count = 0
loss(200, 1) = 1: loss(200, 2) = yy + 100
loss(240, 1) = 100: loss(240, 2) = yy + 100
loss(360, 1) = 100: loss(360, 2) = yy + 100
loss(400, 1) = 1: loss(400, 2) = yy + 100
FOR i = 201 TO 239
  loss(i, 1) = yy + 100: loss(i, 2) = yy + 100
  loss(i + 160, 1) = yy + 100: loss(i + 160, 2) = yy + 100
NEXT
LINE (200, 100)-(200, 100 + yy), 4: LINE (200, 100 + yy)-(240, 100 + yy), 4
LINE (240, 100)-(240, 100 + yy), 4
LINE (360, 100)-(360, 100 + yy), 4: LINE (360, 100 + yy)-(400, 100 + yy), 4
LINE (400, 100)-(400, 100 + yy), 4
IF count = 1 AND yy < 49 THEN
  LINE (200, yy + 101)-(240, yy + 101), 0: LINE (360, yy + 101)-(400, yy + 101), 0
END IF
'---------------------------------------------

20000
END SUB

SUB win
SHARED lev, life, xx, yy, count
LOCATE 10, 15: PRINT " YOU COMPLITED LEVEL "; lev; " GOOD LUCK ON THE NEXT ONE !  "
IF lev = 3 THEN CALL winwin

DO WHILE INKEY$ = "": LOOP
xx = 0: yy = 0: count = 0
END SUB

SUB winwin
SHARED endd
endd = 1
END SUB
