'===========================================================================
' Subject: ACID FLUX: SCREEN SAVER            Date: 07-25-99 (12:02)       
'  Author: Steve Nunnally                     Code: QB, QBasic, PDS        
'  Origin: santa@tir.com                    Packet: DEMOS.ABC
'===========================================================================
'
'  Acid Flux
'
'     by Steve Nunnally, Acid Works Software
'
'
'  This is a cool screen saver that uses the palette command to
'  do nifty things. Press <Enter> to quit.
'
'
' NOTE: there is a variable below called secs%, change it for the amount
'       of time between each design to change
'
DECLARE SUB NewPalette ()
DECLARE SUB NewPattern ()
DECLARE SUB TitleScreen ()
DECLARE SUB Center (strctr$)
DECLARE SUB FigureLast ()
DECLARE SUB Fadeout ()
DECLARE SUB Fadein ()
DECLARE SUB SetItUp ()
DECLARE SUB Pat1 ()
DECLARE SUB Pat2 ()
DECLARE SUB Pat3 ()
DECLARE SUB Pat4 ()
DECLARE SUB Pat5 ()
DECLARE SUB Pat6 ()
DECLARE SUB Pat7 ()
DECLARE SUB Pat8 ()
DECLARE SUB Pat9 ()
DECLARE SUB Pat10 ()
DECLARE SUB Pat11 ()
DECLARE SUB Pat12 ()
DECLARE SUB Pat13 ()
DECLARE SUB Pat14 ()
DECLARE SUB Pat15 ()
DECLARE SUB Pat16 ()
CONST pi = 3.141592654#
DIM SHARED palhold(0 TO 255, 1 TO 3) AS INTEGER
DIM SHARED currentpal(1 TO 3) AS INTEGER
DIM SHARED palettereach(1 TO 3) AS INTEGER
DIM SHARED currentone AS INTEGER
RANDOMIZE TIMER
DEFINT A-Z

CALL TitleScreen

'*************************
secs% = 10                   'Seconds variable
'*************************

currentone = 0: totaltime! = 0: timeit! = 0
DEF SEG = &HA000
SCREEN 13
CALL SetItUp

DO
 timeit! = TIMER
 WAIT &H3DA, 8
 FOR x = 0 TO 253
	OUT &H3C7, x + 1: r = INP(&H3C9): g = INP(&H3C9): b = INP(&H3C9)
	OUT &H3C8, x: OUT &H3C9, r: OUT &H3C9, g: OUT &H3C9, b
 NEXT x
 CALL FigureLast
 totaltime! = totaltime! + (TIMER - timeit!)
 IF totaltime! > secs THEN
	CALL Fadeout
	CALL NewPattern: totaltime! = 0
	CALL Fadein
 END IF
 j$ = INKEY$
LOOP WHILE j$ <> CHR$(13)
END

SUB Center (strctr$)

 strlen = LEN(strctr$)
 LOCATE , (80 - strlen) / 2
 PRINT strctr$

END SUB

SUB Fadein

 FOR a = 1 TO 62
	FOR c = 0 TO 255
	 OUT &H3C7, c: r = INP(&H3C9): g = INP(&H3C9): b = INP(&H3C9)
	 IF r < palhold(c, 1) THEN r = r + 1
	 IF g < palhold(c, 2) THEN g = g + 1
	 IF b < palhold(c, 3) THEN b = b + 1
	 OUT &H3C8, c: OUT &H3C9, r: OUT &H3C9, g: OUT &H3C9, b
	NEXT c
	WAIT &H3DA, 8
 NEXT a

END SUB

SUB Fadeout

 FOR i = 0 TO 255
	OUT &H3C7, i: r = INP(&H3C9): g = INP(&H3C9): b = INP(&H3C9)
	palhold(i, 1) = r
	palhold(i, 2) = g
	palhold(i, 3) = b
 NEXT i

 FOR a = 1 TO 62
	FOR c = 0 TO 255
	 OUT &H3C7, c: r = INP(&H3C9): g = INP(&H3C9): b = INP(&H3C9)
	 IF r > 0 THEN r = r - 1
	 IF g > 0 THEN g = g - 1
	 IF b > 0 THEN b = b - 1
	 OUT &H3C8, c: OUT &H3C9, r: OUT &H3C9, g: OUT &H3C9, b
	NEXT c
	WAIT &H3DA, 8
 NEXT a

END SUB

SUB FigureLast

 IF currentpal(1) < palettereach(1) THEN currentpal(1) = currentpal(1) + 1
 IF currentpal(1) > palettereach(1) THEN currentpal(1) = currentpal(1) - 1
 IF currentpal(2) < palettereach(2) THEN currentpal(2) = currentpal(2) + 1
 IF currentpal(2) > palettereach(2) THEN currentpal(2) = currentpal(2) - 1
 IF currentpal(3) < palettereach(3) THEN currentpal(3) = currentpal(3) + 1
 IF currentpal(3) > palettereach(3) THEN currentpal(3) = currentpal(3) - 1

 r = currentpal(1)
 g = currentpal(2)
 b = currentpal(3)
 OUT &H3C8, 254: OUT &H3C9, r: OUT &H3C9, g: OUT &H3C9, b
 OUT &H3C8, 255: OUT &H3C9, r: OUT &H3C9, g: OUT &H3C9, b

 IF currentpal(1) = palettereach(1) THEN
	IF currentpal(2) = palettereach(2) THEN
	 IF currentpal(3) = palettereach(3) THEN CALL NewPalette
	END IF
 END IF

END SUB

SUB NewPalette

 howmany = INT(RND * 3) + 1
 FOR i = 1 TO howmany
	palettereach(i) = INT(RND * 62)
 NEXT i

END SUB

SUB NewPattern

 currentone = currentone + 1
 IF currentone > 16 THEN currentone = 1
 whichone = currentone

	IF whichone = 1 THEN CALL Pat1
	IF whichone = 2 THEN CALL Pat2
	IF whichone = 3 THEN CALL Pat3
	IF whichone = 4 THEN CALL Pat4
	IF whichone = 5 THEN CALL Pat5
	IF whichone = 6 THEN CALL Pat6
	IF whichone = 7 THEN CALL Pat7
	IF whichone = 8 THEN CALL Pat8
	IF whichone = 9 THEN CALL Pat9
 IF whichone = 10 THEN CALL Pat10
 IF whichone = 11 THEN CALL Pat11
 IF whichone = 12 THEN CALL Pat12
 IF whichone = 13 THEN CALL Pat13
 IF whichone = 14 THEN CALL Pat14
 IF whichone = 15 THEN CALL Pat15
 IF whichone = 16 THEN CALL Pat16

END SUB

SUB Pat1

 FOR a = 0 TO 200
	CIRCLE (160, 100), a, a
	CIRCLE (161, 100), a, a
	CIRCLE (159, 100), a, a
 NEXT a
 FOR a = 19 TO 320 STEP 40
	FOR b = 10 TO 200 STEP 30
	 startwhere = INT(RND * 223) + 1
	 FOR c = 0 TO 19
		CIRCLE (a, b), c, startwhere + c
		CIRCLE (a + 1, b), c, startwhere + c
		CIRCLE (a - 1, b), c, startwhere + c
	 NEXT c
	NEXT b
 NEXT a

END SUB

SUB Pat10

 FOR y = 0 TO 199
	q = (TAN(y * 3.1347197554#) * 50)
	FOR x = 0 TO 319
	 POKE z& + x, (COS(x * .51047197554#) * 50) - q + 100
	NEXT x
	z& = z& + 320&
 NEXT y

END SUB

SUB Pat11

 FOR x = 0 TO 319
	q = (COS(x * .05847197554#) * 50)
	z& = 0
	FOR y = 0 TO 199
	 POKE z& + x, (TAN(y * 3.51047197554#) * 50) - q + 100
	 z& = z& + 320&
	NEXT y
 NEXT x

END SUB

SUB Pat12

 FOR a = 0 TO 200
	CIRCLE (160, 100), a, a
	CIRCLE (161, 100), a, a
	CIRCLE (159, 100), a, a
 NEXT a
 c = 1: d = 1
 FOR a = -10 TO 210 STEP 7
	FOR b = -10 TO 330 STEP 7
	 CIRCLE (b, a), 15, c, , , .8
	 IF d = 1 THEN c = c + 2
	 IF d = 2 THEN c = c - 2
	 IF c < 3 THEN d = 1
	 IF c > 252 THEN d = 2
	NEXT b
 NEXT a

END SUB

SUB Pat13

 f = 0
 FOR a = 0 TO 319 STEP 40
	FOR b = 0 TO 199 STEP 20
	 f = f + 50: e = 0
	 IF f = 250 THEN f = 0
	 FOR c = 0 TO 49
		e = e + 1
		LINE (a, b)-(a + c, b + 20), f + e
 NEXT c: NEXT b: NEXT a
 f = 0
 FOR a = 0 TO 319 STEP 40
	FOR b = 0 TO 199 STEP 20
	 f = f + 50: e = 0
	 IF f = 250 THEN f = 0
	 FOR c = 0 TO 49
		e = e + 1
		LINE (a, b)-(a + 40, b + (c / 2)), f + e
 NEXT c: NEXT b: NEXT a

END SUB

SUB Pat14

 sr = 16: r = 16: n = 1
 FOR a = 1 TO 4
	FOR y = 0 TO 199 STEP r
	 FOR x = 0 TO 319 STEP r
		rn = RND * (2 * n) - n
		Col = (POINT(x, y) + POINT(x + r, y + r) + POINT(x, y + r) + POINT(x + r, y)) / 4 + rn
		IF y + r >= 200 THEN Col = POINT(x, 0) + rn
		IF x + r >= 320 THEN Col = POINT(0, y) + rn
		IF r = sr THEN Col = RND * (2 * 254) - 254
		IF Col < 1 THEN Col = 1
		IF Col > 254 THEN Col = 254
		IF r > 1 THEN LINE (x, y)-(x + r, y + r), Col, BF
		IF r <= 1 THEN PSET (x, y), Col
	 NEXT x
	NEXT y
	r = r / 2
 NEXT a

END SUB

SUB Pat15

 FOR a = 0 TO 200
	CIRCLE (160, 100), a, a
	CIRCLE (161, 100), a, a
	CIRCLE (159, 100), a, a
 NEXT a
 FOR r = 0 TO 150 STEP 3
	CIRCLE (160, 100), r, 0
	CIRCLE (160, 17 + r), r, r + 1
	CIRCLE (160, 183 - r), r, r + 2
	CIRCLE (64 + r, 100), r, r + 3
	CIRCLE (256 - r, 100), r, r + 4
	o1 = 160 - (5000 ^ .5) + (.5 ^ .5) * (r)
	o2 = 160 + (5000 ^ .5) - (.5 ^ .5) * (r)
	u1 = 100 + (5000 ^ .5) - (.5 ^ .5) * (r)
	u2 = 100 - (5000 ^ .5) + (.5 ^ .5) * (r)
	CIRCLE (o1, u1), r, r + 5
	CIRCLE (o2, u1), r, r + 6
	CIRCLE (o1, u2), r, r + 7
	CIRCLE (o2, u2), r, r + 8
 NEXT r

END SUB

SUB Pat16

a1 = 40: b1 = 30: a2 = 240: b2 = 145
k = 1: x = 1: e = 1: f = 1: g = 1: h = 1
max = INT(RND * 250) + 75
FOR j = 1 TO 5
 FOR i = 1 TO max
	a3 = 320 - a1: a4 = 320 - a2: b3 = 200 - b1: b4 = 200 - b2
	LINE (a1, b1)-(a2, b2), k: LINE (a1, b1 + 1)-(a2, b2 + 1), k
	LINE (a1, b1 - 1)-(a2, b2 - 1), k: LINE (a3, b1)-(a4, b2), k
	LINE (a3, b1 + 1)-(a4, b2 + 1), k: LINE (a3, b1 - 1)-(a4, b2 - 1), k
	LINE (a1, b3)-(a2, b4), k: LINE (a1, b3 + 1)-(a2, b4 + 1), k
	LINE (a1, b3 - 1)-(a2, b4 - 1), k: LINE (a3, b3)-(a4, b4), k
	LINE (a3, b3 + 1)-(a4, b4 + 1), k: LINE (a3, b3 - 1)-(a4, b4 - 1), k
	a1 = a1 + g: b1 = b1 + e: a2 = a2 - h: b2 = b2 - f
	IF a1 > 320 THEN g = -1
	IF a1 < 6 THEN g = 1
	IF a2 > 320 THEN h = -1
	IF a2 < 6 THEN h = 1
	IF b1 > 200 THEN e = -1
	IF b1 < 6 THEN e = 1
	IF b2 > 200 THEN f = -1
	IF b2 < 6 THEN f = 1
	k = k + x
	IF k = 255 THEN x = -1
	IF k = 1 THEN x = 1
 NEXT i
 a1 = INT(RND * 320): b1 = INT(RND * 200)
 a2 = INT(RND * 320): b2 = INT(RND * 200)
 max = INT(RND * 250) + 75
 IF j > 5 THEN e = 1: f = 1: g = -1: h = 1
 IF j > 10 THEN e = 1: f = 1: g = -1: h = -1
 IF j > 15 THEN e = -1: f = 1: g = 1: h = -1
 IF j > 20 THEN e = 1: f = 1: g = -1: h = -1
NEXT j

END SUB

SUB Pat2

 u! = 190: t! = 1.5
 FOR i = 1 TO 254
	u! = u! - t!
	t! = t! - .009
	CIRCLE (160, u!), i, i, , , .5
	CIRCLE (160, u! + 1), i, i, , , .5
	CIRCLE (160, u! - 1), i, i, , , .5
 NEXT i

END SUB

SUB Pat3

 c = 30: u = 100: t! = 1.5
 FOR i = 1 TO 260
	c = c + 10
	IF c > 320 THEN c = 30
	t! = t! - .009
	u! = u! - t!
	CIRCLE (160, u), i, c, , , .5
	CIRCLE (160, u + 1), i, c, , , .5
	CIRCLE (160, u + 2), i, c, , , .5
 NEXT i

END SUB

SUB Pat4

 f = 0
 FOR a = 0 TO 319 STEP 40
	FOR b = 0 TO 199 STEP 25
	 f = f + 50
	 IF f = 250 THEN f = 0
	 FOR c = 0 TO 39 STEP 4
		FOR d = 0 TO 24 STEP 5
		 e = INT(RND * 20) + 1
		 LINE (a + c, b + d)-((a + c) + 3, (b + d) + 4), f + e, BF
		NEXT d
	 NEXT c
	NEXT b
 NEXT a

END SUB

SUB Pat5

 FOR a = 0 TO 200
	CIRCLE (160, 100), a, a: CIRCLE (161, 100), a, a: CIRCLE (159, 100), a, a
 NEXT a
 FOR e = 1 TO 5
	IF e = 1 THEN x = 160: y = 100: m = 200: l! = 1
	IF e = 2 THEN x = 80: y = 50: m = 60: l! = 1
	IF e = 3 THEN x = 80: y = 150: m = 60: l! = 91
	IF e = 4 THEN x = 240: y = 50: m = 60: l! = 181
	IF e = 5 THEN x = 240: y = 150: m = 60: l! = 241
	FOR a = 1 TO 254
	 LINE (x + m * (COS(l! * (pi / 180))), y + (m / 1.2 * SIN(l! * (pi / 180))))-(x, y), a
	 IF e = 1 THEN l! = l! + 1.417323 ELSE l! = l! - 1.417323
	NEXT a
 NEXT e

END SUB

SUB Pat6

 FOR y = 0 TO 199
	q = (SIN(y * .1047197554#) * 50)
	FOR x = 0 TO 319
	 POKE z& + x, (SIN(x * .1047197554#) * 50) - q + 127
	NEXT x
	z& = z& + 320&
 NEXT y

END SUB

SUB Pat7

 c = 1: b = 1: d = -5
 FOR e = 1 TO 2
	FOR a = -5 TO 205
	 LINE (d, a)-(160, 100), b
	 LINE (d - 1, a)-(160, 100), b
	 LINE (d - 2, a)-(160, 100), b
	 IF c = 1 THEN b = b + 1 ELSE b = b - 1
	 IF a = 100 THEN c = 0
	NEXT a
	c = 1: b = 1: d = 327
 NEXT e

 c = 1: b = 85: d = 200
 FOR e = 1 TO 2
	FOR a = 0 TO 319
	 LINE (a, d)-(160, 100), b
	 LINE (a, d - 1)-(160, 100), b
	 LINE (a, d - 2)-(160, 100), b
	 IF c = 1 THEN b = b + 1 ELSE b = b - 1
	 IF a = 160 THEN c = 0
	NEXT a
	c = 1: b = 85: d = -1
 NEXT e

END SUB

SUB Pat8

 FOR y = 0 TO 199
	q = (TAN(y * 4.1047197554#) * 50)
	FOR x = 0 TO 319
	 POKE z& + x, (SIN(x * .51047197554#) * 50) - q + 100
	NEXT x
	z& = z& + 320&
 NEXT y

END SUB

SUB Pat9

 FOR i = 0 TO 160
	LINE (160 - i, 100 - (i / 1.2))-(160 + i, 100 + (i / 1.2)), i, B
 NEXT i

END SUB

SUB SetItUp

 OUT &H3C8, 255: OUT &H3C9, 50: OUT &H3C9, 50: OUT &H3C9, 50
 COLOR 255: LOCATE 10, 9: PRINT "Loading, Please Wait...."
 currentpal(1) = INT(RND * 62) + 30
 currentpal(2) = INT(RND * 62) + 30
 currentpal(3) = INT(RND * 62) + 30
 FOR a = 1 TO 254: FOR x = 1 TO 253
	OUT &H3C7, x + 1: r = INP(&H3C9): g = INP(&H3C9): b = INP(&H3C9)
	OUT &H3C8, x: OUT &H3C9, r: OUT &H3C9, g: OUT &H3C9, b
	NEXT x
	CALL FigureLast
 NEXT a
 CALL NewPalette
 CALL Fadeout
 CALL NewPattern
 CALL Fadein
 

END SUB

SUB TitleScreen

 SCREEN 0
 CLS
 PRINT ""
 PRINT ""
 PRINT ""
 PRINT ""
 PRINT ""
 PRINT ""
 PRINT ""
 PRINT ""
 PRINT ""
 COLOR 4: Center "Thanks for trying Acid Flux Screen Saver"
 COLOR 13: Center "by"
 COLOR 3: Center "Acid Works Software"
 COLOR 0: Center ""
 COLOR 10: Center "Press Any Key to Continue"
 'COLOR 7: Center "Use the following things for the command line:"
 'COLOR 0: Center ""
 'COLOR 5: Center "acidflux [t(#)] [s(#)] [r] [h or ?]"
 'COLOR 0: Center ""
 'COLOR 6: Center "t#  Where the number following is the number of seconds   "
 'COLOR 6: Center "    between each different design.                        "
 'COLOR 6: Center ""
 'COLOR 6: Center "s#  Where the number following is used to tell the program"
 'COLOR 6: Center "    which design (1-16) to start on.                      "
 'COLOR 6: Center ""
 'COLOR 6: Center "r   Is used to tell the program you want the order of the "
 'COLOR 6: Center "    designs to be random."
 'COLOR 6: Center ""
 'COLOR 6: Center "?   Gets you this message                                 "
 'COLOR 6: Center ""
 'COLOR 6: Center ""
 'COLOR 11: Center "example usage:"
 'COLOR 6: Center ""
 'COLOR 10: Center "acidflux t5 s3"
 SLEEP
 aaa$ = INKEY$
 bbb$ = INKEY$
 ccc$ = INKEY$
 ddd$ = INKEY$
 eee$ = INKEY$
 fff$ = INKEY$

END SUB
