'-------------------------------------------------'
' THIS PROGRAM WAS MADE BY COLIN MORGAN           '
' If you choose to use any part of this please    '
' just give me credit.                            '
'-------------------------------------------------'
' To Run, press F5, to exit Press Esc, to choose a'
' different screen saver press any key.           '
'-------------------------------------------------'
'- WARNING: THOSE WITH EPILEPSY SHOULD NOT USE   -'
'-  THIS PROGRAM.  (Some parts flash brightly.)  -'
'-------------------------------------------------'

DEFINT A-Z
TYPE Pointer
  x AS INTEGER
  y AS INTEGER
END TYPE
DECLARE FUNCTION GetSpeed& ()
DECLARE SUB LINES (x1, y1, x2, y2, col, Spd&)
DECLARE SUB LINES2 (Array() AS Pointer, x1, y1, x2, y2)
DECLARE SUB TRIANGLE (x1, y1, x2, y2, x3, y3, col, fill)
DECLARE SUB Suspend (delay!, speed&)
DECLARE SUB ScreenSaver1 (Spd&)
DECLARE SUB ScreenSaver2 (Spd&)
DECLARE SUB ScreenSaver3 (Spd&)
DECLARE SUB ScreenSaver4 (Spd&)
DECLARE SUB ScreenSaver5 (Spd&)
DECLARE SUB ScreenSaver6 (Spd&)
DECLARE SUB ScreenSaver7 (Spd&)
DECLARE SUB ScreenSaver8 (Spd&)
DECLARE SUB ScreenSaver9 (Spd&)
DECLARE SUB ScreenSaver10 (Spd&)
DECLARE SUB ScreenSaver11 (Spd&)
DECLARE SUB ScreenSaver12 (Spd&)
DECLARE SUB ScreenSaver13 (Spd&)
DECLARE SUB Calc (Array(), Array2(), numsplits, firstlen, ltime, htime, numc, lastc)
DECLARE SUB Display (Array(), Array2(), numsplits, firstlen, ltime, htime, numc, lastc, Spd&)
DECLARE SUB GetColor (numc)
RANDOMIZE TIMER

CONST SPEEDSUPERSLOW = -5
CONST SPEEDSLOW = -2
CONST SPEEDNORMAL = 0
CONST SPEEDFAST = 2
CONST SPEEDSUPERFAST = 5
DIM CompSpeed AS LONG
DIM UseSpeed  AS LONG
''''' CHANGE THIS VARIABLE TO CHANGE THE SPEED OF THE SCREEN SAVERS '''''
  UseSpeed& = SPEEDNORMAL
''''' CHANGE THIS VARIABLE TO CHANGE THE SPEED OF THE SCREEN SAVERS '''''


  CompSpeed& = GetSpeed&
  IF UseSpeed& > 0 THEN
    CompSpeed& = CompSpeed& * UseSpeed&
    IF CompSpeed& < 1 THEN
      CompSpeed& = 1
    END IF
  ELSEIF UseSpeed& < 0 THEN
    CompSpeed& = CompSpeed& / ABS(UseSpeed&)
    IF CompSpeed& < 1 THEN
      CompSpeed& = 1
    END IF
  END IF

'GOTO 100
'  SCREEN 13
'  x1 = 10: y1 = 180
'  x2 = 210: y2 = 180
'  x3 = 110: y3 = 10
'DO
'  x1 = INT(RND * 320 + 1): y1 = INT(RND * 200 + 1)
'  x2 = INT(RND * 320 + 1): y2 = INT(RND * 200 + 1)
'  x3 = INT(RND * 320 + 1): y3 = INT(RND * 200 + 1)
'  c = INT(RND * 15 + 2)
'  LINE (0, 0)-(320, 200), 0, BF
'  TRIANGLE x1, y1, x2, y2, x3, y3, c, 1
'  a$ = ""
'  WHILE a$ = "": a$ = INKEY$: WEND
'LOOP UNTIL a$ = CHR$(27)
'  SYSTEM
'100 :
  DO
    ScreenSaver1 CompSpeed&
    ScreenSaver2 CompSpeed&
    ScreenSaver3 CompSpeed&
    ScreenSaver4 CompSpeed&
    ScreenSaver5 CompSpeed&
    ScreenSaver6 CompSpeed&
    ScreenSaver7 CompSpeed&
    ScreenSaver8 CompSpeed&
    ScreenSaver9 CompSpeed&
    ScreenSaver10 CompSpeed&
    ScreenSaver11 CompSpeed&
    ScreenSaver12 CompSpeed&
    ScreenSaver13 CompSpeed&
  LOOP

SUB Calc (Array(), Array2(), numsplits, firstlen, ltime, htime, numc, lastc)
  FOR i = 1 TO 200
    Array(i) = -1
  NEXT i

  Array(1) = (INT(RND * 319 + 1))
  firstlen = INT((RND * 60) + 140)

  FOR i = 2 TO firstlen
    direction = INT((RND * 3))
    D = direction

    IF direction = 0 THEN  'Straight
      Array(i) = Array(i - 1)
    END IF
    IF direction = 1 THEN  'Left
      Array(i) = Array(i - 1) - 1
    END IF
    IF direction = 2 THEN  'Right
      Array(i) = Array(i - 1) + 1
    END IF
  NEXT i

  numsplits = INT(RND * 170)
  a = numsplits
  IF a < 50 AND a > -1 THEN numsplits = 0
  IF a < 75 AND a > 49 THEN numsplits = 1
  IF a < 90 AND a > 74 THEN numsplits = 2
  IF a < 100 AND a > 89 THEN numsplits = 3
  IF a < 110 AND a > 99 THEN numsplits = 4
  IF a < 120 AND a > 109 THEN numsplits = 5
  IF a < 130 AND a > 119 THEN numsplits = 6
  IF a < 140 AND a > 129 THEN numsplits = 7
  IF a < 150 AND a > 139 THEN numsplits = 8
  IF a < 160 AND a > 149 THEN numsplits = 9
  IF a < 170 AND a > 159 THEN numsplits = 10
  numsplits = numsplits + 3
  IF numsplits > 10 THEN numsplits = 10

  FOR i = 1 TO 200
    Array2(1, i) = -1
    Array2(2, i) = -1
    Array2(3, i) = -1
    Array2(4, i) = -1
    Array2(5, i) = -1
    Array2(6, i) = -1
    Array2(7, i) = -1
    Array2(8, i) = -1
    Array2(9, i) = -1
    Array2(10, i) = -1
  NEXT i

  IF numsplits > 0 THEN
    FOR num = 1 TO numsplits
      'Get a random part of the lightning that it starts from.
      rand = INT(RND * firstlen) + 2
      Array2(num, 0) = rand
      'Get a random length of this branch of lightning.
      rand2 = INT(RND * (199 - rand))

      Array2(num, rand) = Array(rand)
 
      IF debugging = 1 THEN
        PRINT Array2(num, rand)
      END IF

      firstd = 0
      FOR i = (rand + 1) TO (rand + rand2 + 1)
        direction = INT((RND * 3))
        IF firstd > 0 THEN direction = INT((RND * 4))
        D = direction
        IF D = 3 THEN D = firstd

        IF D = 0 THEN  'Straight
          Array2(num, i) = Array2(num, i - 1)
        END IF
        IF D = 1 THEN  'Left
          Array2(num, i) = Array2(num, i - 1) - 1
          IF firstd = 0 THEN firstd = 1
        END IF
        IF D = 2 THEN  'Right
          Array2(num, i) = Array2(num, i - 1) + 1
          IF firstd = 0 THEN firstd = 2
        END IF
        IF debugging = 1 THEN
          PRINT Array2(num, i)
        END IF
        'If the split comes back and hit the lightning then end the split, maybe.
        IF Array2(num, i) = Array(i) THEN
          rand4 = INT((RND * 2) + 1)
          IF rand4 = 2 THEN i = 200
        END IF
      NEXT i
    NEXT num
  END IF
END SUB

SUB Display (Array(), Array2(), numsplits, firstlen, ltime, htime, numc, lastc, Spd&)
  IF NoLightning = 1 THEN
    LINE (0, 0)-(320, 139), 8, BF
    EXIT SUB
  END IF

  GetColor numc
  LINE (0, 0)-(320, 139), , BF
  LINE (0, 140)-(320, 200), 2, BF

'Display Lightning
  FOR i = 1 TO 4
    CIRCLE (Array(1), 1), i, 15
  NEXT i

  FOR i = 1 TO 199
    FOR i2 = 1 TO ltime
      IF Array(i) > -1 THEN
        PSET (Array(i), i), 8
      END IF
      FOR i3 = 1 TO 10
        IF Array2(i3, i) > -1 THEN
          PSET (Array2(i3, i), i), 8
        END IF
      NEXT i3
    NEXT i2
  NEXT i

  Suspend 10, Spd&

  FOR i = 1 TO 199
    FOR i2 = 1 TO ltime
      IF Array(i) > -1 THEN
        PSET (Array(i) - 1, i), 8
        PSET (Array(i) + 0, i), 7
        PSET (Array(i) + 1, i), 8
      END IF
      FOR i3 = 1 TO 10
        IF Array2(i3, i) > -1 THEN
          PSET (Array2(i3, i) - 1, i), 8
          PSET (Array2(i3, i) + 0, i), 7
          PSET (Array2(i3, i) + 1, i), 8
        END IF
      NEXT i3
    NEXT i2
  NEXT i
 
  Suspend 10, Spd&

  FOR i = 1 TO 199
    FOR i2 = 1 TO ltime
      IF Array(i) > -1 THEN
        PSET (Array(i) - 2, i), 8
        PSET (Array(i) - 1, i), 7
        PSET (Array(i) + 0, i), 15
        PSET (Array(i) + 1, i), 7
        PSET (Array(i) + 2, i), 8
      END IF
      FOR i3 = 1 TO 10
        IF Array2(i3, i) > -1 THEN
          PSET (Array2(i3, i) - 2, i), 8
          PSET (Array2(i3, i) - 1, i), 7
          PSET (Array2(i3, i) + 0, i), 15
          PSET (Array2(i3, i) + 1, i), 7
          PSET (Array2(i3, i) + 2, i), 8
        END IF
      NEXT i3
    NEXT i2
  NEXT i

  Suspend 10, Spd&

  IF firstlen > 148 THEN
    FOR i = 1 TO 8
      CIRCLE (Array(firstlen), firstlen), i, 15
    NEXT i
  END IF

  FOR i = 1 TO numsplits
    FOR i2 = Array2(i, 0) TO 200
      IF Array2(i, i2) = -1 THEN
        IF i2 > 148 THEN
          FOR i3 = 1 TO 8
            CIRCLE (Array2(i, i2 - 1), i2 - 1), i3, 15
          NEXT i3
        END IF
        EXIT FOR
      END IF
    NEXT i2
  NEXT i


  Suspend 150, Spd&


'Delete Lightning
  FOR i = 1 TO 4
    CIRCLE (Array(1), 1), i, 15
  NEXT i

  FOR i = 1 TO 199
    FOR i2 = 1 TO ltime
      IF Array(i) > -1 THEN
        IF i > 139 THEN
          PSET (Array(i) - 2, i), 2
          PSET (Array(i) - 1, i), 8
          PSET (Array(i) + 0, i), 7
          PSET (Array(i) + 1, i), 8
          PSET (Array(i) + 2, i), 2
        END IF
        IF i < 140 THEN
          PSET (Array(i) - 2, i), 15
          PSET (Array(i) - 1, i), 8
          PSET (Array(i) + 0, i), 7
          PSET (Array(i) + 1, i), 8
          PSET (Array(i) + 2, i), 15
        END IF
      END IF
      FOR i3 = 1 TO 10
        IF Array2(i3, i) > -1 THEN
          IF i > 139 THEN
            PSET (Array2(i3, i) - 2, i), 2
            PSET (Array2(i3, i) - 1, i), 8
            PSET (Array2(i3, i) + 0, i), 7
            PSET (Array2(i3, i) + 1, i), 8
            PSET (Array2(i3, i) + 2, i), 2
          END IF
          IF i < 140 THEN
            PSET (Array2(i3, i) - 2, i), 15
            PSET (Array2(i3, i) - 1, i), 8
            PSET (Array2(i3, i) + 0, i), 7
            PSET (Array2(i3, i) + 1, i), 8
            PSET (Array2(i3, i) + 2, i), 15
          END IF
        END IF
      NEXT i3
    NEXT i2
  NEXT i

  Suspend 10, Spd&

  FOR i = 1 TO 199
    FOR i2 = 1 TO ltime
      IF Array(i) > -1 THEN
        IF i > 139 THEN
          PSET (Array(i) - 1, i), 2
          PSET (Array(i) + 0, i), 8
          PSET (Array(i) + 1, i), 2
        END IF
        IF i < 140 THEN
          PSET (Array(i) - 1, i), 15
          PSET (Array(i) + 0, i), 8
          PSET (Array(i) + 1, i), 15
        END IF
      END IF
      FOR i3 = 1 TO 10
        IF Array2(i3, i) > -1 THEN
          IF i > 139 THEN
            PSET (Array2(i3, i) - 1, i), 2
            PSET (Array2(i3, i) + 0, i), 7
            PSET (Array2(i3, i) + 1, i), 2
          END IF
          IF i < 140 THEN
            PSET (Array2(i3, i) - 1, i), 15
            PSET (Array2(i3, i) + 0, i), 8
            PSET (Array2(i3, i) + 1, i), 15
          END IF
        END IF
      NEXT i3
    NEXT i2
  NEXT i

  Suspend 10, Spd&

  FOR i = 1 TO 199
    FOR i2 = 1 TO ltime
      IF Array(i) > -1 THEN
        IF i > 139 THEN
          PSET (Array(i), i), 2
        END IF
        IF i < 140 THEN
          PSET (Array(i), i), 15
        END IF
      END IF
      FOR i3 = 1 TO 10
        IF Array2(i3, i) > -1 THEN
          IF i > 139 THEN
            PSET (Array2(i3, i), i), 2
          END IF
          IF i < 140 THEN
            PSET (Array2(i3, i), i), 15
          END IF
        END IF
      NEXT i3
    NEXT i2
  NEXT i

  Suspend 10, Spd&

  IF firstlen > 148 THEN
    FOR i = 1 TO 8
      CIRCLE (Array(firstlen), firstlen), i, 2
    NEXT i
  END IF

  FOR i = 1 TO numsplits
    FOR i2 = Array2(i, 0) TO 200
      IF Array2(i, i2) = -1 THEN
        IF i2 > 148 THEN
          FOR i3 = 1 TO 8
            CIRCLE (Array2(i, i2 - 1), i2 - 1), i3, 2
          NEXT i3
        END IF
        EXIT FOR
      END IF
    NEXT i2
  NEXT i
END SUB

SUB GetColor (numc)
  'Choose Color of Lightning
  c = INT((RND * numc) + 1)
  DO WHILE c = lastc
    c = INT((RND * numc) + 1)
  LOOP
  lastc = c
  IF c = 1 THEN 'White
    OUT &H3C8, 8: OUT &H3C9, 20: OUT &H3C9, 20: OUT &H3C9, 20
    OUT &H3C8, 7: OUT &H3C9, 40: OUT &H3C9, 40: OUT &H3C9, 40
    OUT &H3C8, 15: OUT &H3C9, 60: OUT &H3C9, 60: OUT &H3C9, 60
  END IF
  IF c = 2 THEN 'Blue
    OUT &H3C8, 8: OUT &H3C9, 0: OUT &H3C9, 0: OUT &H3C9, 20
    OUT &H3C8, 7: OUT &H3C9, 0: OUT &H3C9, 0: OUT &H3C9, 40
    OUT &H3C8, 15: OUT &H3C9, 0: OUT &H3C9, 0: OUT &H3C9, 60
  END IF
  IF c = 3 THEN 'Green
    OUT &H3C8, 8: OUT &H3C9, 0: OUT &H3C9, 20: OUT &H3C9, 0
    OUT &H3C8, 7: OUT &H3C9, 0: OUT &H3C9, 40: OUT &H3C9, 0
    OUT &H3C8, 15: OUT &H3C9, 0: OUT &H3C9, 60: OUT &H3C9, 0
  END IF
  IF c = 4 THEN 'Red
    OUT &H3C8, 8: OUT &H3C9, 20: OUT &H3C9, 0: OUT &H3C9, 0
    OUT &H3C8, 7: OUT &H3C9, 40: OUT &H3C9, 0: OUT &H3C9, 0
    OUT &H3C8, 15: OUT &H3C9, 60: OUT &H3C9, 0: OUT &H3C9, 0
  END IF
  IF c = 5 THEN 'Orange
    OUT &H3C8, 8: OUT &H3C9, 20: OUT &H3C9, 10: OUT &H3C9, 0
    OUT &H3C8, 7: OUT &H3C9, 40: OUT &H3C9, 20: OUT &H3C9, 0
    OUT &H3C8, 15: OUT &H3C9, 60: OUT &H3C9, 30: OUT &H3C9, 0
  END IF
  IF c = 6 THEN 'Yellow
    OUT &H3C8, 8: OUT &H3C9, 20: OUT &H3C9, 20: OUT &H3C9, 0
    OUT &H3C8, 7: OUT &H3C9, 40: OUT &H3C9, 40: OUT &H3C9, 0
    OUT &H3C8, 15: OUT &H3C9, 60: OUT &H3C9, 60: OUT &H3C9, 0
  END IF
  IF c = 7 THEN 'Purple
    OUT &H3C8, 8: OUT &H3C9, 20: OUT &H3C9, 0: OUT &H3C9, 20
    OUT &H3C8, 7: OUT &H3C9, 40: OUT &H3C9, 0: OUT &H3C9, 40
    OUT &H3C8, 15: OUT &H3C9, 60: OUT &H3C9, 0: OUT &H3C9, 60
  END IF
  IF c = 8 THEN 'Pink
    OUT &H3C8, 8: OUT &H3C9, 20: OUT &H3C9, 0: OUT &H3C9, 10
    OUT &H3C8, 7: OUT &H3C9, 40: OUT &H3C9, 0: OUT &H3C9, 20
    OUT &H3C8, 15: OUT &H3C9, 60: OUT &H3C9, 0: OUT &H3C9, 30
  END IF
  IF c = 9 THEN 'Teal
    OUT &H3C8, 8: OUT &H3C9, 10: OUT &H3C9, 20: OUT &H3C9, 10
    OUT &H3C8, 7: OUT &H3C9, 20: OUT &H3C9, 40: OUT &H3C9, 20
    OUT &H3C8, 15: OUT &H3C9, 30: OUT &H3C9, 60: OUT &H3C9, 30
  END IF
  IF c = 10 THEN 'Light Blue
    OUT &H3C8, 8: OUT &H3C9, 0: OUT &H3C9, 20: OUT &H3C9, 20
    OUT &H3C8, 7: OUT &H3C9, 0: OUT &H3C9, 40: OUT &H3C9, 40
    OUT &H3C8, 15: OUT &H3C9, 0: OUT &H3C9, 60: OUT &H3C9, 60
  END IF
  IF c = 11 THEN 'Bright Pink
    OUT &H3C8, 8: OUT &H3C9, 20: OUT &H3C9, 10: OUT &H3C9, 20
    OUT &H3C8, 7: OUT &H3C9, 40: OUT &H3C9, 20: OUT &H3C9, 40
    OUT &H3C8, 15: OUT &H3C9, 60: OUT &H3C9, 30: OUT &H3C9, 60
  END IF

  LINE (0, 0)-(320, 200), 8, BF

END SUB

FUNCTION GetSpeed&
'-------------------------------------------------'
'- This function returns the number of times the -'
'-  computer can increment a long int in a FOR   -'
'-  loop per second.                             -'
'-------------------------------------------------'
  Start! = TIMER
  FOR i& = 1 TO 1500
    FOR i2& = 1 TO 1500
    NEXT i2&
  NEXT i&
  EndTime! = TIMER
  TimeTaken! = (EndTime! - Start!)

  GetSpeed& = ((1500& * 1500&) / TimeTaken!)
END FUNCTION

SUB LINES (xx1, yy1, xx2, yy2, col, Spd&)
'-------------------------------------------------'
' THIS SUB PROCEDURE WAS ENTIRELY CREATED BY      '
' COLIN MORGAN                                    '
'-------------------------------------------------'
 
  DIM Points(1000) AS Pointer
  DIM slopes(1000) AS INTEGER
  x1 = xx1: x2 = xx2
  y1 = yy1: y2 = yy2
  IF Spd& > 0 THEN
    speed! = 3
  END IF
  IF x1 < 0 OR x2 < 0 OR y1 < 0 OR y2 < 0 OR col < 0 THEN
    EXIT SUB
  END IF

'-------------------------------------------------
'Get the direction of the line.
  IF 0 = 1 THEN
  ELSEIF x2 >= x1 AND y2 < y1 THEN
    slopetype = 2
    y2 = y1 + (y1 - y2)
  ELSEIF x2 >= x1 AND y2 >= y1 THEN
    slopetype = 3
  ELSEIF x2 < x1 AND y2 >= y1 THEN
    slopetype = 6
    x2 = x1 + (x1 - x2)
  ELSEIF x2 < x1 AND y2 < y1 THEN
    slopetype = 7
    x2 = x1 + (x1 - x2)
    y2 = y1 + (y1 - y2)
  END IF

  numerator# = (y2 - y1 + 1)
  denominator# = (x2 - x1 + 1)
  IF numerator# >= denominator# THEN
    SELECT CASE slopetype
      CASE 2: slopetype = 1
      CASE 3: slopetype = 4
      CASE 6: slopetype = 5
      CASE 7: slopetype = 8
    END SELECT
  END IF
  st = slopetype

  IF st = 1 OR st = 4 OR st = 5 OR st = 8 THEN
    x3 = x1 + (y2 - y1)
    y3 = y1 + (x2 - x1)
    x2 = x3: y2 = y3
  END IF

'-------------------------------------------------
'Get the numerator and denominator of the slope.
  numerator# = (y2 - y1 + 1)
  denominator# = (x2 - x1 + 1)


'-------------------------------------------------
'Find out how many x's per y.
  slope# = (numerator# / denominator#)
  slopenum# = (1 / slope#)


  'If not a whole number then round to the next highest number
  ' to ensure that it either hits of overshoots the mark.
  IF slopenum# <> INT(slopenum#) THEN
    slopenum# = INT(slopenum# + 1)
  END IF


'-------------------------------------------------
'Find out how many times it will have to use this slope
' before hitting the y mark.
  dist = 0
  FOR i = 0 TO (numerator# - 1)
    dist = dist + slopenum#
  NEXT i

  'Set this variable to the number of slopes to shorten
  ' by one so that the slope will hit the mark.
  slopenum2 = (dist - denominator#)



'-------------------------------------------------
    IF (numerator# - slopenum2) >= slopenum2 THEN
      FOR i = 1 TO 1000
        slopes(i) = slopenum#
      NEXT i
      IF slopenum2 > 0 THEN
        skip! = (numerator# / slopenum2)
        skip2 = INT(skip!)
        skip! = skip! - skip2
        count = 0
        FOR i = INT(skip / 2) TO numerator# STEP skip2
          count = count + 1
          IF (skip! * count) >= flag + 1 THEN
            i = i + 1: flag = INT(skip! * count)
          END IF
          slopes(i) = slopes(i) - 1
        NEXT i
      END IF


    ELSEIF (numerator# - slopenum2) < slopenum2 THEN
      FOR i = 1 TO 1000
        slopes(i) = slopenum# - 1
      NEXT i
      IF (numerator# - slopenum2) > 0 THEN
        skip! = (numerator# / (numerator# - slopenum2))
        skip2 = INT(skip!)
        skip! = skip! - skip2
        count = 0
        FOR i = INT(skip / 2) TO numerator# STEP skip2
          count = count + 1
          IF (skip! * count) >= flag + 1 THEN
            i = i + 1: flag = INT(skip! * count)
          END IF
          slopes(i) = slopes(i) + 1
        NEXT i
      END IF
    END IF


'-------------------------------------------------
'Draw the line.
  currentx = x1: currenty = y1: times = 1
    DO
      FOR y = 0 TO numerator#
        FOR x = 0 TO (slopes(times) - 1)
          pointnum = pointnum + 1
          xcoord = (x + (currentx))
          ycoord = (y + (currenty))
          Points(pointnum).x = xcoord: Points(pointnum).y = ycoord
          IF xcoord = x2 AND ycoord = y2 THEN
            EXIT DO
          END IF
        NEXT x
        currentx = xcoord + 1
        times = times + 1
      NEXT y
      currenty = ycoord
    LOOP


  'Switch if inverse.
  IF st = 1 OR st = 4 OR st = 5 OR st = 8 THEN
    x3 = x1 + (y2 - y1)
    y3 = y1 + (x2 - x1)
    x2 = x3: y2 = y3
    FOR i = 1 TO pointnum
      x3 = x1 + (Points(i).y - y1)
      y3 = y1 + (Points(i).x - x1)
      Points(i).x = x3
      Points(i).y = y3
    NEXT i
  END IF

  IF 1 = 0 THEN
  ELSEIF st = 1 THEN
    FOR i = 1 TO pointnum
      Points(i).y = y1 - (Points(i).y - y1)
    NEXT i
    y2 = y1 + (y1 - y2)
  ELSEIF st = 2 THEN
    FOR i = 1 TO pointnum
      Points(i).y = y1 - (Points(i).y - y1)
    NEXT i
    y2 = y1 + (y1 - y2)
  ELSEIF st = 3 THEN
  ELSEIF st = 4 THEN
  ELSEIF st = 5 THEN
    FOR i = 1 TO pointnum
      Points(i).x = x1 - (Points(i).x - x1)
    NEXT i
    x2 = x1 + (x1 - x2)
  ELSEIF st = 6 THEN
    FOR i = 1 TO pointnum
      Points(i).x = x1 - (Points(i).x - x1)
    NEXT i
    x2 = x1 + (x1 - x2)
  ELSEIF st = 7 THEN
    FOR i = 1 TO pointnum
      Points(i).x = x1 - (Points(i).x - x1)
    NEXT i
    x2 = x1 + (x1 - x2)
    FOR i = 1 TO pointnum
      Points(i).y = y1 - (Points(i).y - y1)
    NEXT i
    y2 = y1 + (y1 - y2)
  ELSEIF st = 8 THEN
    FOR i = 1 TO pointnum
      Points(i).x = x1 - (Points(i).x - x1)
    NEXT i
    x2 = x1 + (x1 - x2)
    FOR i = 1 TO pointnum
      Points(i).y = y1 - (Points(i).y - y1)
    NEXT i
    y2 = y1 + (y1 - y2)
  END IF

  IF Spd& <= 0 THEN
    FOR i = 1 TO pointnum
      PSET (Points(i).x, Points(i).y), col
    NEXT i
  ELSE
    FOR i = 1 TO pointnum
      PSET (Points(i).x, Points(i).y), col
      Suspend speed!, Spd&
    NEXT i
  END IF
END SUB

SUB LINES2 (Array() AS Pointer, xx1, yy1, xx2, yy2)
'-------------------------------------------------'
' THIS SUB PROCEDURE WAS ENTIRELY CREATED BY      '
' COLIN MORGAN                                    '
'-------------------------------------------------'
'- DIM Array(z) AS POINTER                       -'
'-------------------------------------------------'
'- Return Values                                 -'
'- The Array is filled with the points in the    -'
'-  line.                                        -'
'- xx1 = The number of points in the line.       -'
'-------------------------------------------------'
  DIM Points(1000) AS Pointer
  DIM slopes(1000) AS INTEGER
  x1 = xx1: x2 = xx2
  y1 = yy1: y2 = yy2
  IF x1 < 0 OR x2 < 0 OR y1 < 0 OR y2 < 0 OR col < 0 THEN
    EXIT SUB
  END IF

'-------------------------------------------------
'Get the direction of the line.
  IF 0 = 1 THEN
  ELSEIF x2 >= x1 AND y2 < y1 THEN
    slopetype = 2
    y2 = y1 + (y1 - y2)
  ELSEIF x2 >= x1 AND y2 >= y1 THEN
    slopetype = 3
  ELSEIF x2 < x1 AND y2 >= y1 THEN
    slopetype = 6
    x2 = x1 + (x1 - x2)
  ELSEIF x2 < x1 AND y2 < y1 THEN
    slopetype = 7
    x2 = x1 + (x1 - x2)
    y2 = y1 + (y1 - y2)
  END IF

  numerator# = (y2 - y1 + 1)
  denominator# = (x2 - x1 + 1)
  IF numerator# >= denominator# THEN
    SELECT CASE slopetype
      CASE 2: slopetype = 1
      CASE 3: slopetype = 4
      CASE 6: slopetype = 5
      CASE 7: slopetype = 8
    END SELECT
  END IF
  st = slopetype

  IF st = 1 OR st = 4 OR st = 5 OR st = 8 THEN
    x3 = x1 + (y2 - y1)
    y3 = y1 + (x2 - x1)
    x2 = x3: y2 = y3
  END IF

'-------------------------------------------------
'Get the numerator and denominator of the slope.
  numerator# = (y2 - y1 + 1)
  denominator# = (x2 - x1 + 1)


'-------------------------------------------------
'Find out how many x's per y.
  slope# = (numerator# / denominator#)
  slopenum# = (1 / slope#)


  'If not a whole number then round to the next highest number
  ' to ensure that it either hits of overshoots the mark.
  IF slopenum# <> INT(slopenum#) THEN
    slopenum# = INT(slopenum# + 1)
  END IF


'-------------------------------------------------
'Find out how many times it will have to use this slope
' before hitting the y mark.
  dist = 0
  FOR i = 0 TO (numerator# - 1)
    dist = dist + slopenum#
  NEXT i

  'Set this variable to the number of slopes to shorten
  ' by one so that the slope will hit the mark.
  slopenum2 = (dist - denominator#)



'-------------------------------------------------
    IF (numerator# - slopenum2) >= slopenum2 THEN
      FOR i = 1 TO 1000
        slopes(i) = slopenum#
      NEXT i
      IF slopenum2 > 0 THEN
        skip! = (numerator# / slopenum2)
        skip2 = INT(skip!)
        skip! = skip! - skip2
        count = 0
        FOR i = INT(skip / 2) TO numerator# STEP skip2
          count = count + 1
          IF (skip! * count) >= flag + 1 THEN
            i = i + 1: flag = INT(skip! * count)
          END IF
          slopes(i) = slopes(i) - 1
        NEXT i
      END IF


    ELSEIF (numerator# - slopenum2) < slopenum2 THEN
      FOR i = 1 TO 1000
        slopes(i) = slopenum# - 1
      NEXT i
      IF (numerator# - slopenum2) > 0 THEN
        skip! = (numerator# / (numerator# - slopenum2))
        skip2 = INT(skip!)
        skip! = skip! - skip2
        count = 0
        FOR i = INT(skip / 2) TO numerator# STEP skip2
          count = count + 1
          IF (skip! * count) >= flag + 1 THEN
            i = i + 1: flag = INT(skip! * count)
          END IF
          slopes(i) = slopes(i) + 1
        NEXT i
      END IF
    END IF


'-------------------------------------------------
'Draw the line.
  currentx = x1: currenty = y1: times = 1
    DO
      FOR y = 0 TO numerator#
        FOR x = 0 TO (slopes(times) - 1)
          pointnum = pointnum + 1
          xcoord = (x + (currentx))
          ycoord = (y + (currenty))
          Points(pointnum).x = xcoord: Points(pointnum).y = ycoord
          IF xcoord = x2 AND ycoord = y2 THEN
            EXIT DO
          END IF
        NEXT x
        currentx = xcoord + 1
        times = times + 1
      NEXT y
      currenty = ycoord
    LOOP


  'Switch if inverse.
  IF st = 1 OR st = 4 OR st = 5 OR st = 8 THEN
    x3 = x1 + (y2 - y1)
    y3 = y1 + (x2 - x1)
    x2 = x3: y2 = y3
    FOR i = 1 TO pointnum
      x3 = x1 + (Points(i).y - y1)
      y3 = y1 + (Points(i).x - x1)
      Points(i).x = x3
      Points(i).y = y3
    NEXT i
  END IF

  IF 1 = 0 THEN
  ELSEIF st = 1 THEN
    FOR i = 1 TO pointnum
      Points(i).y = y1 - (Points(i).y - y1)
    NEXT i
    y2 = y1 + (y1 - y2)
  ELSEIF st = 2 THEN
    FOR i = 1 TO pointnum
      Points(i).y = y1 - (Points(i).y - y1)
    NEXT i
    y2 = y1 + (y1 - y2)
  ELSEIF st = 3 THEN
  ELSEIF st = 4 THEN
  ELSEIF st = 5 THEN
    FOR i = 1 TO pointnum
      Points(i).x = x1 - (Points(i).x - x1)
    NEXT i
    x2 = x1 + (x1 - x2)
  ELSEIF st = 6 THEN
    FOR i = 1 TO pointnum
      Points(i).x = x1 - (Points(i).x - x1)
    NEXT i
    x2 = x1 + (x1 - x2)
  ELSEIF st = 7 THEN
    FOR i = 1 TO pointnum
      Points(i).x = x1 - (Points(i).x - x1)
    NEXT i
    x2 = x1 + (x1 - x2)
    FOR i = 1 TO pointnum
      Points(i).y = y1 - (Points(i).y - y1)
    NEXT i
    y2 = y1 + (y1 - y2)
  ELSEIF st = 8 THEN
    FOR i = 1 TO pointnum
      Points(i).x = x1 - (Points(i).x - x1)
    NEXT i
    x2 = x1 + (x1 - x2)
    FOR i = 1 TO pointnum
      Points(i).y = y1 - (Points(i).y - y1)
    NEXT i
    y2 = y1 + (y1 - y2)
  END IF

  FOR i = 1 TO pointnum
    Array(i) = Points(i)
  NEXT i
  xx1 = pointnum
END SUB

SUB ScreenSaver1 (Spd&)
IF Spd& > 0 THEN
  speed! = 3
END IF


SCREEN 12
CLS
xx = (RND * 320 + 160)
yy = (RND * 240 + 120)
x = xx
y = yy

NextLine:
a$ = INKEY$
IF a$ = CHR$(27) THEN
  SYSTEM
END IF
IF a$ <> "" THEN
  EXIT SUB
END IF
times = times + 1

IF times = 250 THEN
    FOR q! = 1 TO 50000
        DOTx = INT(RND * 640 + 1)
        DOTy = INT(RND * 480 + 1)
        LINE (DOTx, DOTy)-(DOTx + 2, DOTy + 2), 0, BF
        a$ = INKEY$
        IF a$ = CHR$(27) THEN
          SYSTEM
        END IF
        IF a$ <> "" THEN
          EXIT SUB
        END IF
    NEXT q!
  
    FOR f = 0 TO 640
      LINE (f, 0)-(f, 480), 0
    NEXT f

    xx = (RND * 320 + 160)
    yy = (RND * 240 + 120)
    times = 0
END IF

IF x < 1 OR x > 640 THEN
    xx = (RND * 320 + 160)
    yy = (RND * 240 + 120)
    LINE (x - 5, y - 5)-(xx - 5, yy - 5), Clrs
    LINE (x + 0, y + 0)-(xx + 0, yy + 0), Clrs
    LINE (x + 5, y + 5)-(xx + 5, yy + 5), Clrs
    x = xx
    y = yy
END IF
IF y < 1 OR y > 480 THEN
    xx = (RND * 320 + 160)
    yy = (RND * 240 + 120)
    LINE (x - 5, y - 5)-(xx - 5, yy - 5), Clrs
    LINE (x - 0, y + 0)-(xx + 0, yy + 0), Clrs
    LINE (x + 5, y + 5)-(xx + 5, yy + 5), Clrs
    x = xx
    y = yy
END IF

IF direction = 0 THEN
    direction = INT(RND * 4 + 1)
    GOTO SNL:
END IF

IF direction = 1 THEN
    direction = INT(RND * 2 + 3)
    GOTO SNL:
END IF

IF direction = 2 THEN
    direction = INT(RND * 2 + 3)
    GOTO SNL:
END IF

IF direction = 3 THEN
    direction = INT(RND * 2 + 1)
    GOTO SNL:
END IF

IF direction = 4 THEN
    direction = INT(RND * 2 + 1)
    GOTO SNL:
END IF


SNL:
IF direction = 1 THEN GOTO RIGHT:
IF direction = 2 THEN GOTO LEFT:
IF direction = 3 THEN GOTO UP:
IF direction = 4 THEN GOTO DOWN:

RIGHT:
Length = INT(RND * 90 + 10)
Clrs = INT(RND * 15 + 1)
FOR i = 1 TO Length
    LINE (x, y)-(x + i, y), Clrs
    LINE (x - 5, y - 5)-(x + i - 5, y - 5), Clrs
    LINE (x + 5, y + 5)-(x + i + 5, y + 5), Clrs
    Suspend speed!, Spd&
NEXT i
x = x + Length
GOTO NextLine:


LEFT:
Length = INT(RND * 90 + 10)
Clrs = INT(RND * 15 + 1)
FOR i = 1 TO Length
    LINE (x, y)-(x - i, y), Clrs
    LINE (x + 5, y + 5)-(x - i + 5, y + 5), Clrs
    LINE (x - 5, y - 5)-(x - i - 5, y - 5), Clrs
    Suspend speed!, Spd&
NEXT i
x = x - Length
GOTO NextLine:


UP:
Length = INT(RND * 90 + 10)
Clrs = INT(RND * 15 + 1)
FOR i = 1 TO Length
    LINE (x, y)-(x, y - i), Clrs
    LINE (x + 5, y + 5)-(x + 5, y - i + 5), Clrs
    LINE (x - 5, y - 5)-(x - 5, y - i - 5), Clrs
    Suspend speed!, Spd&
NEXT i
y = y - Length
GOTO NextLine:


DOWN:
Length = INT(RND * 90 + 10)
Clrs = INT(RND * 15 + 1)
FOR i = 1 TO Length
    LINE (x, y)-(x, y + i), Clrs
    LINE (x - 5, y - 5)-(x - 5, y + i - 5), Clrs
    LINE (x + 5, y + 5)-(x + 5, y + i + 5), Clrs
    Suspend speed!, Spd&
NEXT i
y = y + Length
GOTO NextLine:

END SUB

SUB ScreenSaver10 (Spd&)
  SCREEN 13
  DO
    FOR y = 1 TO 200
      FOR x = 1 TO 320
        a$ = INKEY$
        IF a$ <> "" THEN EXIT DO
        c = INT(RND * 2)
        IF c = 0 THEN
          c = (INT(RND * 15 + 1))
        ELSE
          c = (INT(RND * 254 + 1))
        END IF
        PSET (x, y), c
      NEXT x
    NEXT y
    FOR y = 1 TO 320
      FOR x = 1 TO 200
        a$ = INKEY$
        IF a$ <> "" THEN EXIT DO
        c = INT(RND * 2)
        IF c = 0 THEN
          c = (INT(RND * 15 + 1))
        ELSE
          c = (INT(RND * 254 + 1))
        END IF
        PSET (y, x), c
      NEXT x
    NEXT y
    FOR y = 200 TO 1 STEP -1
      FOR x = 320 TO 1 STEP -1
        a$ = INKEY$
        IF a$ <> "" THEN EXIT DO
        c = INT(RND * 2)
        IF c = 0 THEN
          c = (INT(RND * 15 + 1))
        ELSE
          c = (INT(RND * 254 + 1))
        END IF
        PSET (x, y), c
      NEXT x
    NEXT y
    FOR y = 320 TO 1 STEP -1
      FOR x = 200 TO 1 STEP -1
        a$ = INKEY$
        IF a$ <> "" THEN EXIT DO
        c = INT(RND * 2)
        IF c = 0 THEN
          c = (INT(RND * 15 + 1))
        ELSE
          c = (INT(RND * 254 + 1))
        END IF
        PSET (y, x), c
      NEXT x
    NEXT y
  LOOP
  IF a$ = CHR$(27) THEN
    SYSTEM
  END IF
END SUB

SUB ScreenSaver11 (Spd&)
  SCREEN 13
  DO
Next11:
    num = (INT(RND * 4 + 1))
    SELECT CASE num
      CASE 1: GOTO UpDown11
      CASE 2: GOTO LeftRight11
      CASE 3: GOTO DownUp11
      CASE 4: GOTO RightLeft11
      CASE ELSE: ERROR 77
    END SELECT
    GOTO Next11 'Should never get here.
UpDown11:
    FOR i = 0 TO 200
      a$ = INKEY$
      IF a$ <> "" THEN EXIT DO
      c = INT(RND * 2)
      IF c = 0 THEN
        c = (INT(RND * 15 + 1))
      ELSE
        c = (INT(RND * 254 + 1))
      END IF
      LINE (0, i)-(320, i), c
      Suspend 1, Spd&
    NEXT i
    GOTO Next11
LeftRight11:
    FOR i = 0 TO 320
      a$ = INKEY$
      IF a$ <> "" THEN EXIT DO
      c = INT(RND * 2)
      IF c = 0 THEN
        c = (INT(RND * 15 + 1))
      ELSE
        c = (INT(RND * 254 + 1))
      END IF
      LINE (i, 0)-(i, 200), c
      Suspend 1, Spd&
    NEXT i
    GOTO Next11
DownUp11:
    FOR i = 200 TO 0 STEP -1
      a$ = INKEY$
      IF a$ <> "" THEN EXIT DO
      c = INT(RND * 2)
      IF c = 0 THEN
        c = (INT(RND * 15 + 1))
      ELSE
        c = (INT(RND * 254 + 1))
      END IF
      LINE (0, i)-(320, i), c
      Suspend 1, Spd&
    NEXT i
    GOTO Next11
RightLeft11:
    FOR i = 320 TO 0 STEP -1
      a$ = INKEY$
      IF a$ <> "" THEN EXIT DO
      c = INT(RND * 2)
      IF c = 0 THEN
        c = (INT(RND * 15 + 1))
      ELSE
        c = (INT(RND * 254 + 1))
      END IF
      LINE (i, 0)-(i, 200), c
      Suspend 1, Spd&
    NEXT i
    GOTO Next11
  LOOP
  IF a$ = CHR$(27) THEN
    SYSTEM
  END IF
END SUB

SUB ScreenSaver12 (Spd&)
  SCREEN 13
  CLS
  i = 1
  DO
    a$ = INKEY$
    size = (INT(RND * 30 + 10))
    num = (INT(RND * 2 + 1))
    x1 = (INT(RND * 319) + 1)
    y1 = (INT(RND * 200) + 1)
    c = (INT(RND * 254 + 1))
    FOR i2 = 1 TO size
      CIRCLE (x1, y1), i2, c
      Suspend (300 / size), Spd&
    NEXT i2
    IF num = 1 THEN
      FOR i2 = size TO 1 STEP -1
        CIRCLE (x1, y1), i2, 0
        Suspend (300 / size), Spd&
      NEXT i2
    ELSEIF num = 2 THEN
      FOR i2 = 1 TO size
        CIRCLE (x1, y1), i2, 0
        Suspend (300 / size), Spd&
      NEXT i2
    END IF
  LOOP UNTIL a$ <> ""
  IF a$ = CHR$(27) THEN
    SYSTEM
  END IF
END SUB

SUB ScreenSaver13 (Spd&)
DIM LiteLine(205)
DIM LiteLines(10, 205)
DIM numsplits
DIM firstlen
DIM ltime
DIM htime
DIM numc
DIM lastc

  SCREEN 13
  CLS

  'ltime = Lightning Time = the Length of each stike of lightning.
  ltime = 1

  'htime = Hold Time = the Length to wait between each strike of lightning.
  htime = 50


  'numc = Number of Colors = The number of different possible colors of lightning.
  '1 = Only White
  '2 = 1 plus Blue
  '3 = 2 plus Green
  '4 = 3 plus Red
  '5 = 4 plus Orange
  '6 = 5 plus Yellow
  '7 = 6 plus Purple
  '8 = 7 plus Pink
  '9 = 8 plus Teal
  '10 = 9 plus Light Blue
  '11 = 10 plus Bright Pink
  numc = 11

  DO
    a$ = INKEY$
    Calc LiteLine(), LiteLines(), numsplits, firstlen, ltime, htime, numc, lastc
    Display LiteLine(), LiteLines(), numsplits, firstlen, ltime, htime, numc, lastc, Spd&
    Suspend (INT(RND * 750 + 1)), Spd&
  LOOP UNTIL a$ <> ""
  IF a$ = CHR$(27) THEN
    OUT &H3C8, 8: OUT &H3C9, 20: OUT &H3C9, 20: OUT &H3C9, 20
    OUT &H3C8, 7: OUT &H3C9, 40: OUT &H3C9, 40: OUT &H3C9, 40
    OUT &H3C8, 15: OUT &H3C9, 60: OUT &H3C9, 60: OUT &H3C9, 60
    SYSTEM
  END IF
  OUT &H3C8, 8: OUT &H3C9, 20: OUT &H3C9, 20: OUT &H3C9, 20
  OUT &H3C8, 7: OUT &H3C9, 40: OUT &H3C9, 40: OUT &H3C9, 40
  OUT &H3C8, 15: OUT &H3C9, 60: OUT &H3C9, 60: OUT &H3C9, 60
END SUB

SUB ScreenSaver2 (Spd&)
IF Spd& > 0 THEN
  speed! = 3
END IF


SCREEN 12
CLS
xx = (RND * 320 + 160)
yy = (RND * 240 + 120)
x = xx
y = yy

NextLine2:
a$ = INKEY$
IF a$ = CHR$(27) THEN
  SYSTEM
END IF
IF a$ <> "" THEN
  EXIT SUB
END IF
times = times + 1

IF times = 250 THEN
    FOR q! = 1 TO 50000
        DOTx = INT(RND * 640 + 1)
        DOTy = INT(RND * 480 + 1)
        LINE (DOTx, DOTy)-(DOTx + 2, DOTy + 2), 0, BF
        a$ = INKEY$
        IF a$ = CHR$(27) THEN
          SYSTEM
        END IF
        IF a$ <> "" THEN
          EXIT SUB
        END IF
    NEXT q!
 
    FOR f = 0 TO 640
    LINE (f, 0)-(f, 480), 0
    NEXT f

    xx = (RND * 320 + 160)
    yy = (RND * 240 + 120)
    times = 0
END IF

IF x < 1 OR x > 640 THEN
    xx = (RND * 320 + 160)
    yy = (RND * 240 + 120)
    LINE (x - 5, y - 5)-(xx, yy), Clrs
    LINE (x + 0, y + 0)-(xx, yy), Clrs
    LINE (x + 5, y + 5)-(xx, yy), Clrs
    x = xx
    y = yy
END IF
IF y < 1 OR y > 480 THEN
    xx = (RND * 320 + 160)
    yy = (RND * 240 + 120)
    LINE (x - 5, y - 5)-(xx, yy), Clrs
    LINE (x - 0, y + 0)-(xx, yy), Clrs
    LINE (x + 5, y + 5)-(xx, yy), Clrs
    x = xx
    y = yy
END IF

IF direction = 0 THEN
    direction = INT(RND * 4 + 1)
    GOTO SNL2:
END IF

IF direction = 1 THEN
    direction = INT(RND * 2 + 3)
    GOTO SNL2:
END IF

IF direction = 2 THEN
    direction = INT(RND * 2 + 3)
    GOTO SNL2:
END IF

IF direction = 3 THEN
    direction = INT(RND * 2 + 1)
    GOTO SNL2:
END IF

IF direction = 4 THEN
    direction = INT(RND * 2 + 1)
    GOTO SNL2:
END IF


SNL2:
IF direction = 1 THEN GOTO RIGHT2:
IF direction = 2 THEN GOTO LEFT2:
IF direction = 3 THEN GOTO UP2:
IF direction = 4 THEN GOTO DOWN2:

RIGHT2:
Length = INT(RND * 90 + 10)
Clrs = INT(RND * 15 + 1)
FOR i = 1 TO Length
    LINE (x, y)-(x + i, y), Clrs
    LINE (x - 5, y - 5)-(x + i, y), Clrs
    LINE (x + 5, y + 5)-(x + i, y), Clrs
    Suspend speed!, Spd&
NEXT i
x = x + Length
GOTO NextLine2:


LEFT2:
Length = INT(RND * 90 + 10)
Clrs = INT(RND * 15 + 1)
FOR i = 1 TO Length
    LINE (x, y)-(x - i, y), Clrs
    LINE (x + 5, y + 5)-(x - i, y), Clrs
    LINE (x - 5, y - 5)-(x - i, y), Clrs
    Suspend speed!, Spd&
NEXT i
x = x - Length
GOTO NextLine2:


UP2:
Length = INT(RND * 90 + 10)
Clrs = INT(RND * 15 + 1)
FOR i = 1 TO Length
    LINE (x, y)-(x, y - i), Clrs
    LINE (x + 5, y + 5)-(x, y - i), Clrs
    LINE (x - 5, y - 5)-(x, y - i), Clrs
    Suspend speed!, Spd&
NEXT i
y = y - Length
GOTO NextLine2:


DOWN2:
Length = INT(RND * 90 + 10)
Clrs = INT(RND * 15 + 1)
FOR i = 1 TO Length
    LINE (x, y)-(x, y + i), Clrs
    LINE (x - 5, y - 5)-(x, y + i), Clrs
    LINE (x + 5, y + 5)-(x, y + i), Clrs
    Suspend speed!, Spd&
NEXT i
y = y + Length
GOTO NextLine2:

END SUB

SUB ScreenSaver3 (Spd&)
  SCREEN 12
  CLS
  DIM points2(10) AS Pointer
  DO
    a$ = INKEY$
    points2(0).x = 0: points2(0).y = 0
    FOR i = 1 TO 10
      points2(i).x = INT((RND * 640))
      points2(i).y = INT((RND * 480))
    NEXT i

    FOR i = 1 TO 10
      LINES points2(i - 1).x, points2(i - 1).y, points2(i).x, points2(i).y, INT(RND * 15 + 1), Spd&
      a$ = INKEY$
      IF a$ <> "" THEN EXIT DO
    NEXT i
    FOR i = 1 TO 10
      LINES points2(i - 1).x, points2(i - 1).y, points2(i).x, points2(i).y, 0, Spd&
      a$ = INKEY$
      IF a$ <> "" THEN EXIT DO
    NEXT i
  LOOP UNTIL a$ <> ""
  IF a$ = CHR$(27) THEN
    SYSTEM
  END IF
END SUB

SUB ScreenSaver4 (Spd&)
  SCREEN 13
  CLS
  i = 1
  DO
    a$ = INKEY$
    num = num + 1
    IF num = 1000 THEN
      IF i = 1 THEN flag = 1
      IF i = 15 THEN flag = 2
      IF flag = 1 THEN i = i + 1
      IF flag = 2 THEN i = i - 1
      num = 0
    END IF
    CIRCLE (INT(RND * 319) + 1, INT(RND * 200) + 1), i, INT(RND * 254) + 1
    Suspend 1, Spd&
  LOOP UNTIL a$ <> ""
  IF a$ = CHR$(27) THEN
    SYSTEM
  END IF
END SUB

SUB ScreenSaver5 (Spd&)
  SCREEN 13
  DO
    a$ = INKEY$
    x1 = (INT(RND * 320 + 1))
    x2 = (INT(RND * 320 + 1))
    y1 = (INT(RND * 200 + 1))
    y2 = (INT(RND * 200 + 1))
    c = INT(RND * 2)
    IF c = 0 THEN
      c = (INT(RND * 15 + 1))
    ELSE
      c = (INT(RND * 254 + 1))
    END IF
    LINE (x1, y1)-(x2, y2), c
    Suspend 1, Spd&
  LOOP UNTIL a$ <> ""
  IF a$ = CHR$(27) THEN
    SYSTEM
  END IF
END SUB

SUB ScreenSaver6 (Spd&)
  SCREEN 13
  DO
    a$ = INKEY$
    x1 = (INT(RND * 320 + 1))
    x2 = (INT(RND * 320 + 1))
    y1 = (INT(RND * 200 + 1))
    y2 = (INT(RND * 200 + 1))
    c = INT(RND * 2)
    IF c = 0 THEN
      c = (INT(RND * 15 + 1))
    ELSE
      c = (INT(RND * 254 + 1))
    END IF
    LINE (x1, y1)-(x2, y2), c, B
    Suspend 1, Spd&
  LOOP UNTIL a$ <> ""
  IF a$ = CHR$(27) THEN
    SYSTEM
  END IF
END SUB

SUB ScreenSaver7 (Spd&)
  SCREEN 13
  DO
    a$ = INKEY$
    x1 = (INT(RND * 320 + 1))
    x2 = (INT(RND * 320 + 1))
    y1 = (INT(RND * 200 + 1))
    y2 = (INT(RND * 200 + 1))
    c = INT(RND * 2)
    IF c = 0 THEN
      c = (INT(RND * 15 + 1))
    ELSE
      c = (INT(RND * 254 + 1))
    END IF
    LINE (x1, y1)-(x2, y2), c, BF
    Suspend 50, Spd&
  LOOP UNTIL a$ <> ""
  IF a$ = CHR$(27) THEN
    SYSTEM
  END IF
END SUB

SUB ScreenSaver8 (Spd&)
  SCREEN 0: WIDTH 80, 25
  DO
    a$ = INKEY$
    x1 = (INT(RND * 80 + 1))
    y1 = (INT(RND * 25 + 1))
    c = (INT(RND * 15 + 1))
    char$ = CHR$((RND * 239 + 16))
    LOCATE y1, x1: COLOR c: PRINT char$;
    Suspend 1, Spd&
  LOOP UNTIL a$ <> ""
  IF a$ = CHR$(27) THEN
    SYSTEM
  END IF
END SUB

SUB ScreenSaver9 (Spd&)
  SCREEN 13
  DO
    a$ = INKEY$
    FOR y = 1 TO 200
      c = INT(RND * 2)
      IF c = 0 THEN
        c = (INT(RND * 15 + 1))
      ELSE
        c = (INT(RND * 254 + 1))
      END IF
      LINE (0, y)-(320, y), c
      Suspend .1, Spd&
    NEXT y
  LOOP UNTIL a$ <> ""
  IF a$ = CHR$(27) THEN
    SYSTEM
  END IF
END SUB

SUB Suspend (delay!, speed&)
'-------------------------------------------------'
'- This function suspends the process for delay! -'
'-  thousanths of a second, with speed& being    -'
'-  how many times the computer can increment a  -'
'-  long int in a FOR loop per second.           -'
'-------------------------------------------------'
  IF delay! = 0 THEN
    WHILE INKEY$ = "": WEND
    EXIT SUB
  END IF
 
  FOR i& = 1 TO (speed& * (delay! / 1000))
  NEXT i&
END SUB

SUB TRIANGLE (x1, y1, x2, y2, x3, y3, col, fill)
  DIM TPoints(3) AS Pointer
  DIM Points(1000) AS Pointer
  TPoints(1).x = x1: TPoints(1).y = y1
  TPoints(2).x = x2: TPoints(2).y = y2
  TPoints(3).x = x3: TPoints(3).y = y3

  'Draw the Triangle.
  LINES x1, y1, x2, y2, col, 0
  LINES x2, y2, x3, y3, col, 0
  LINES x3, y3, x1, y1, col, 0
  LINES x1, y1, x3, y3, col, 0
  LINES x3, y3, x2, y2, col, 0
  LINES x2, y2, x1, y1, col, 0

  'Fill in the Triangle by drawing from each corner to each point
  ' along all three lines through the middle.
  IF fill > -1 THEN
    'First fill to point 3.
    x1 = TPoints(1).x: y1 = TPoints(1).y
    x2 = TPoints(2).x: y2 = TPoints(2).y
    x3 = TPoints(3).x: y3 = TPoints(3).y
    LINES2 Points(), x1, y1, x2, y2
    curx = Points(x1 / 2).x
    cury = Points(x1 / 2).y
    FOR i = 2 TO (x1 - 1)
      LINES Points(i).x, Points(i).y, TPoints(3).x, TPoints(3).y, fill, 0
    NEXT i
    LINES2 Points(), curx, cury, x3, y3
    numpoints = curx
    FOR i = 2 TO (numpoints - 1)
      LINES TPoints(1).x, TPoints(1).y, Points(i).x, Points(i).y, fill, 0
      LINES TPoints(2).x, TPoints(2).y, Points(i).x, Points(i).y, fill, 0
    NEXT i
    'Second fill to point 2.
    x1 = TPoints(1).x: y1 = TPoints(1).y
    x2 = TPoints(2).x: y2 = TPoints(2).y
    x3 = TPoints(3).x: y3 = TPoints(3).y
    LINES2 Points(), x1, y1, x3, y3
    curx = Points(x1 / 2).x
    cury = Points(x1 / 2).y
    FOR i = 2 TO (x1 - 1)
      LINES Points(i).x, Points(i).y, TPoints(2).x, TPoints(2).y, fill, 0
    NEXT i
    LINES2 Points(), curx, cury, x2, y2
    numpoints = curx
    FOR i = 2 TO (numpoints - 1)
      LINES TPoints(1).x, TPoints(1).y, Points(i).x, Points(i).y, fill, 0
      LINES TPoints(3).x, TPoints(3).y, Points(i).x, Points(i).y, fill, 0
    NEXT i
    'Third fill to point 1.
    x1 = TPoints(1).x: y1 = TPoints(1).y
    x2 = TPoints(2).x: y2 = TPoints(2).y
    x3 = TPoints(3).x: y3 = TPoints(3).y
    LINES2 Points(), x2, y2, x3, y3
    curx = Points(x2 / 2).x
    cury = Points(x2 / 2).y
    FOR i = 2 TO (x2 - 1)
      LINES Points(i).x, Points(i).y, TPoints(1).x, TPoints(1).y, fill, 0
    NEXT i
    LINES2 Points(), curx, cury, x1, y1
    numpoints = curx
    FOR i = 2 TO (numpoints - 1)
      LINES TPoints(2).x, TPoints(2).y, Points(i).x, Points(i).y, fill, 0
      LINES TPoints(3).x, TPoints(3).y, Points(i).x, Points(i).y, fill, 0
    NEXT i


    'Draw the Triangle Border Again.
    x1 = TPoints(1).x: y1 = TPoints(1).y
    x2 = TPoints(2).x: y2 = TPoints(2).y
    x3 = TPoints(3).x: y3 = TPoints(3).y
    LINES x1, y1, x2, y2, col, 0
    LINES x2, y2, x3, y3, col, 0
    LINES x3, y3, x1, y1, col, 0
    LINES x1, y1, x3, y3, col, 0
    LINES x3, y3, x2, y2, col, 0
    LINES x2, y2, x1, y1, col, 0
  END IF
END SUB

