'===========================================================================
' Subject: GRAVITY LINES                      Date: 04-12-96 (14:36)       
'  Author: Stephan Doughty                    Code: QB, QBasic, PDS        
'  Origin: hbj@pop.ntplx.net                Packet: EGAVGA.ABC
'===========================================================================
'Written By Stephen Doughty
'Watch, learn, play, enjoy.

5 REM Gravline.BAS
10 K = 35: S = 7: I = 1                         'K must be a multiple of 7
15 RANDOMIZE TIMER
20 DEF FNR = (INT(RND * 5) + 5)                 'Line separation
30 DEF FNZ = (INT((RND * 2) + 1) * 2 - 3)       'Makes -1 or 1
40 DIM X(K): DIM Y(K): DIM A(K): DIM B(K): DIM H(S): DIM C(S)
50 FOR Q = 0 TO 6: READ C(Q): H(Q) = K * (S - Q) / S: NEXT Q     'Loads line separation array with data
60 DATA 0,4,6,14,2,1,5                       
70 X = INT(RND * 640) + 1: XB = FNR * FNZ       'Picks X,Y and A,B points
80 Y = INT(RND * 480) + 1: YB = FNR * FNZ       'and line step values
90 A = INT(RND * 640) + 1: AB = FNR * FNZ
100 B = INT(RND * 480) + 1: BB = FNR * FNZ
110 G1 = FNZ: G2 = FNZ                          'Gravity (- or +)
120 SCREEN 12
130 M = X - A: N = Y - B: XY = (M * M + N * N): IF XY < 10 THEN G1 = -G1: G2 = -G2          'Lines 130-150 are a Gravity routine
140 XB = XB - 100 * (G1 * M + XB / 3) / XY: YB = YB - 100 * (G1 * N + YB / 3) / XY
150 AB = AB - 100 * (G2 * M + AB / 3) / XY: BB = BB - 100 * (G2 * N + BB / 3) / XY
160 IF X + XB < 0 OR X + XB > 640 THEN XB = -SGN(XB) * FNR: YB = YB * FNZ: G1 = -SGN(G1)    'Checks for edges of screen
170 IF Y + YB < 0 OR Y + YB > 480 THEN YB = -SGN(YB) * FNR: XB = XB * FNZ: G1 = -SGN(G1)    'if off screen then change line variable
180 IF A + AB < 0 OR A + AB > 640 THEN AB = -SGN(AB) * FNR: BB = BB * FNZ: G2 = -SGN(G2)    'and change gravity
190 IF B + BB < 0 OR B + BB > 480 THEN BB = -SGN(BB) * FNR: AB = AB * FNZ: G2 = -SGN(G2)
200 X = X + XB: Y = Y + YB: A = A + AB: B = B + BB      'Adds movement variables to XY coordinates
210 X(I) = X: Y(I) = Y: A(I) = A: B(I) = B              'Puts points in an array
220 I = I + 1 + ((I = K) * K)                           'increments point array
230 FOR Q = 6 TO 0 STEP -1                              'for next loop for color and erase
240 J = I + H(Q) + (I + H(Q) > K) * K                   'Divides array for color change
250 LINE (X(J), Y(J))-(A(J), B(J)), C(Q)
260 LINE (640 - X(J), 480 - Y(J))-(640 - A(J), 480 - B(J)), C(Q)
270 LINE (X(J), 480 - Y(J))-(A(J), 480 - B(J)), C(Q)
280 LINE (640 - X(J), Y(J))-(640 - A(J), B(J)), C(Q)
290 NEXT Q
300 IF INKEY$ <> "" THEN END ELSE 130                   'Used to escape
