' For this Program I joined up a bunch of my simulations ' and screen savers so I would only have to submit them once. ' You will not find these programs anywhere else on the net because I never submitted ' them to any other site. I hope you enjoy them! ' Lucas Alonso ' August 1998 DECLARE SUB savpoly () DECLARE SUB snowfall () DECLARE SUB bounce () DECLARE SUB action () start: COLOR 15 CLS SCREEN 12 PRINT PRINT PRINT " SIMULATIONS: By Lucas Alonso" PRINT PRINT PRINT " 1. Snowfall On A Peacful Winter Night " PRINT " 2. Bouncing Balls" PRINT " 3. Black Hole Journey" PRINT " 4. Bouncing Polygons" PRINT " 5. Action Movie Title Generator" PRINT PRINT INPUT "Choice? > "; choice$ SELECT CASE choice$ CASE "1" snowfall CASE "2" bounce CASE "3" GOTO warp CASE "4" savpoly CASE "5" action CASE ELSE GOTO start END SELECT GOTO start warp: CLS INPUT "Delay (1 - Whatever Works For You)? > "; delaay CLS PRINT "I'm not letting you quit this one, it's REALLY COOL" SLEEP 'DEFINT A-Z DEF FNMove (xp%, yp%, xr%, yr%, n%, vstop%) ul = yr: ll = xr: bl = vstop - yr: rl = 319 - xr SELECT CASE n CASE 1 IF yp > ul THEN IF xp > ll THEN FNMove = 1 ELSE FNMove = 2 ELSE IF xp > ll THEN FNMove = 4 ELSE FNMove = 3 CASE 2 IF yp > ul THEN IF xp < rl THEN FNMove = 2 ELSE FNMove = 1 ELSE IF xp < rl THEN FNMove = 3 ELSE FNMove = 4 CASE 3 IF yp < bl THEN IF xp < rl THEN FNMove = 3 ELSE FNMove = 4 ELSE IF xp < rl THEN FNMove = 2 ELSE FNMove = 1 CASE 4 IF yp < bl THEN IF xp > ll THEN FNMove = 4 ELSE FNMove = 3 ELSE IF xp > ll THEN FNMove = 1 ELSE FNMove = 2 END SELECT END DEF OPTION BASE 1 RANDOMIZE TIMER DIM SHARED ScrollDelay ScrollDelay = ComputerType SCREEN 7, , 0 Stars = 100 NumBoxes = 4 Dist = 5 LineClr = 9 DelayClr = LineClr - 8 Grid3DClr = 5 Counter = 1 NumDelayVectors = 8 NumCircles = 20 IF once1 <> 1 THEN DIM ReflTxt#(124) DIM BoxXradius(NumBoxes), BoxYradius(NumBoxes), BoxX(NumBoxes), BoxY(NumBoxes), BoxDir(NumBoxes), BoxClr(NumBoxes) DIM StarX(Stars), StarY(Stars), StarSpeed(Stars), StarClr(Stars) DIM LineX(2), LineY(2), LineDir(2), DelayVector(4 * NumDelayVectors) DIM Colors(4) DIM ForeCircles(3 * NumCircles), CircleR(NumCircles * 3 + 1) once1 = 1 END IF RESTORE TubeData READ NumFrames IF once2 <> 1 THEN DIM CircleX(NumFrames), CircleY(NumFrames), CircleC(NumFrames) once2 = 1 END IF FOR num = 1 TO NumFrames READ CircleX(num), CircleY(num) NEXT FOR num = 1 TO NumFrames clr = INT(RND * 2) + 1 IF clr = 1 THEN CircleC(num) = 9 ELSE CircleC(num) = 1 NEXT CircleR(1) = 40 FOR num = 1 TO NumCircles * 3 STEP 3 CircleR(num + 1) = num ^ (3 / 2) / 2 + CircleR(1) NEXT RESTORE Colors FOR num = 1 TO 4 READ Colors(num) NEXT PickClr = 1 BoxCount = 1 DO BoxClr(BoxCount) = Colors(PickClr) IF PickClr < 4 THEN PickClr = PickClr + 1 ELSE PickClr = 1 BoxCount = BoxCount + 1 LOOP UNTIL BoxCount > NumBoxes LineX(1) = 62 LineY(1) = 53 LineX(2) = 120 LineY(2) = 198 LineDir(1) = 1 LineDir(2) = 2 CLS SCREEN 7 SCREEN , , 7, 0 PCOPY 1, 7 Part2: FrameCounter = 1 FOR FrameNum = 1 TO NumFrames FOR tyu = 1 TO delaay * 10 NEXT tyu SCREEN , , 7, 0 PCOPY FrameCounter, 7 FrameCounter = FrameCounter + 1 IF FrameCounter > 6 THEN FrameCounter = 1 CIRCLE (CircleX(FrameNum), CircleY(FrameNum)), CircleR(1), CircleC(FrameNum) CountEm = NumCircles + 1 FOR Tube = 1 TO NumCircles * 3 STEP 3 CountEm = CountEm - 1 IF ForeCircles(Tube) <> 0 THEN AdjCircleX = CINT((ForeCircles(Tube) * CountEm * 2 + 160) / (CountEm * 2 + 1)) AdjCircleY = CINT((ForeCircles(Tube + 1) * CountEm * 2 + 99) / (CountEm * 2 + 1)) CIRCLE (AdjCircleX, AdjCircleY), CircleR(Tube + 1), ForeCircles(Tube + 2) END IF NEXT FOR Shift = NumCircles * 3 TO 6 STEP -3 ForeCircles(Shift) = ForeCircles(Shift - 3) ForeCircles(Shift - 1) = ForeCircles(Shift - 4) ForeCircles(Shift - 2) = ForeCircles(Shift - 5) NEXT ForeCircles(1) = CircleX(FrameNum) ForeCircles(2) = CircleY(FrameNum) ForeCircles(3) = CircleC(FrameNum) PCOPY 7, 0 SCREEN , , 0, 0 NEXT DO: LOOP UNTIL INKEY$ <> "" GOTO start Grid3DFrame1: DATA 0,144,319,144, 0,146,319,146, 0,151,319,151, 0,160,319,160 DATA 0,175,319,175, 0,199,319,199, 0,199,319,199, 0,199,319,199 Grid3DFrame2: DATA 0,144,319,144, 0,145,319,145, 0,146,319,146, 0,152,319,152 DATA 0,162,319,162, 0,178,319,178, 0,199,319,199, 0,199,319,199 Grid3DFrame3: DATA 0,144,319,144, 0,145,319,145, 0,147,319,147, 0,153,319,153 DATA 0,164,319,164, 0,182,319,182, 0,199,319,199, 0,199,319,199 Grid3DFrame4: DATA 0,144,319,144, 0,146,319,146, 0,148,319,148, 0,154,319,154 DATA 0,166,319,166, 0,186,319,186, 0,199,319,199, 0,199,319,199 Grid3DFrame5: DATA 0,144,319,144, 0,146,319,146, 0,149,319,149, 0,156,319,156 DATA 0,169,319,169, 0,190,319,190, 0,199,319,199, 0,199,319,199 Grid3DFrame6: DATA 0,144,319,144, 0,145,319,145, 0,147,319,147, 0,150,319,150 DATA 0,158,319,158, 0,172,319,172, 0,194,319,194, 0,199,319,199 Grid3DCommons: DATA 280,144,319,153, 200,144,225,199, 220,144,275,199, 240,144,319,189 DATA 260,144,319,167, 300,144,319,147, 140,144,130,199, 120,144, 95,199 DATA 100,144, 45,199, 80,144, 0,189, 60,144, 0,167, 40,144, 0,153 DATA 20,144, 0,147, 160,144,160,199, 180,144,190,199 Colors: DATA 10,11,12,14 Logo: TubeData: DATA 474 ' ------ Path data ------ DATA 159,99,159,99,159,99,159,99,159,99,159,99,159,99,158,100,157,100,156,101,154,102,153,103,152,105,149,107,147,108,145,110,144,112,139,114,136,116,130,119 DATA 122,122,116,125,108,128,101,132,92,136,83,139,75,142,67,145,57,146,47,146,40,147,38,147,45,146,53,146,59,145,69,142,82,138,95,134,114,127,130,121 DATA 148,113,162,103,171,97,185,88,196,81,209,74,220,66,230,61,242,54,252,48,264,42,270,36,267,38,261,43,256,48,250,53,240,60,230,68,218,75,209,82 DATA 198,88,188,93,177,96,164,99,151,101,139,102,126,102,113,102,104,102,89,102,78,101,66,101,51,101,40,101,29,101,19,101,26,101,42,101,57,101,71,100 DATA 90,98,100,98,110,97,124,97,140,97,158,99,177,102,190,105,206,111,216,116,228,122,238,129,251,136,264,144,276,152,281,154,285,157,269,157,256,155,240,152 DATA 221,148,205,142,185,135,163,129,150,126,136,122,119,119,106,117,94,115,80,115,69,116,55,119,51,121,53,127,60,128,75,128,89,128,108,127,129,126,144,124 DATA 160,122,172,121,189,118,212,117,224,116,236,113,249,108,257,103,264,97,269,87,269,78,267,76,260,81,254,90,250,96,242,103,234,110,225,115,212,120,200,125 DATA 188,129,173,133,159,135,139,135,128,134,128,132,136,130,149,130,165,130,182,128,197,123,209,118,225,110,237,103,245,97,254,90,263,82,266,78,262,91,257,98 DATA 247,103,232,108,218,111,206,115,196,117,185,115,172,110,164,104,154,95,144,85,134,76,123,65,113,58,100,53,84,48,74,48,62,48,52,51,47,57,42,66 DATA 41,70,44,75,51,78,60,76,69,71,78,65,86,59,94,54,103,49,114,45,128,44,142,46,150,50,156,56,158,64,161,74,163,84,163,96,163,108,163,116 DATA 164,126,166,138,167,146,170,152,178,161,188,164,190,160,186,155,181,153,173,151,168,142,165,130,165,116,165,100,164,83,164,68,164,54,162,40,162,36,160,44 DATA 159,58,158,72,158,89,158,102,158,117,158,129,159,140,159,153,158,162,158,169,159,167,164,158,167,144,167,129,167,115,168,96,168,85,168,68,168,52,166,40 DATA 164,32,161,31,158,41,157,52,157,66,158,82,158,98,159,113,158,127,158,138,158,147,156,156,155,160,152,162,148,160,143,156,135,146,127,137,117,122,108,108 DATA 99,93,91,79,82,66,75,59,68,55,59,48,47,40,52,47,60,53,73,59,86,68,103,80,117,90,132,98,144,105,162,114,183,123,198,130,218,140,232,146 DATA 250,154,272,161,280,162,284,156,279,150,268,145,252,139,236,132,227,129,213,125,205,116,199,100,198,79,198,64,200,52,202,43,207,36,208,41,207,53,203,67 DATA 196,86,188,95,178,104,169,110,159,116,146,122,135,128,124,137,114,144,105,150,92,155,82,156,66,157,63,156,75,154,85,152,96,149,108,144,118,139,128,132 DATA 138,124,146,113,148,101,142,92,133,89,123,90,109,93,92,94,78,95,61,95,48,94,41,92,42,85,49,78,57,72,71,63,86,55,105,47,119,44,133,42 DATA 152,41,170,41,188,42,208,46,224,51,236,57,249,65,258,76,265,89,266,99,266,112,263,126,257,138,250,147,240,155,231,158,223,160,214,161,201,160,188,156 DATA 175,149,165,140,160,132,150,118,141,107,130,99,116,98,111,105,111,113,116,120,124,127,134,137,146,144,160,147,176,146,190,141,199,131,205,119,205,105,202,93 DATA 191,81,186,79,181,87,175,100,169,110,161,124,155,138,149,148,144,153,147,150,155,137,166,124,176,113,183,97,187,83,188,69,186,53,182,44,181,53,183,67 DATA 186,75,192,86,204,94,224,99,238,100,256,99,272,94,288,91,294,88,285,90,270,95,252,98,239,100,226,103,206,106,181,106,156,106,137,107,122,107,113,106 DATA 94,108,82,109,75,110,86,112,103,111,124,109,145,107,172,102,194,97,210,90,220,83,237,70,245,64,244,74,232,90,218,103,206,111,189,115,171,117,154,112 DATA 141,103,136,88,136,66,136,55,137,47,135,56,133,70,125,81,112,87,92,91,87,85,97,76,109,76,119,85,123,100,124,113,126,124,131,127,143,125,152,118 DATA 156,112,159,107,162,103,163,100,164,100,166,99,167,99,168,99,169,99,169,99,169,99,169,99,169,99,169,99 SUB action CLS COLOR 4 LOCATE 2, 25 PRINT "ACTION MOVIE TITLE GENERATOR" COLOR 8 LOCATE 3, 37 PRINT "V 1.2" LOCATE 7, 39 PRINT "By" LOCATE 10, 25 PRINT " Lucas Alonso" LOCATE 20, 20 PRINT "(c) 1998"; COLOR 4 PRINT " Dark Sith"; COLOR 8 PRINT " Productions" LOCATE 25, 28 PRINT "Press to continue..." DO LOOP UNTIL INKEY$ = CHR$(32) RANDOMIZE TIMER DO word1 = INT(RND * 23) + 1 word2 = INT(RND * 16) + 1 CLS LOCATE 7, 32 COLOR 4 IF word1 = 1 THEN PRINT "SAVAGE "; IF word1 = 2 THEN PRINT "SILENT "; IF word1 = 3 THEN PRINT "HARD "; IF word1 = 4 THEN PRINT "TARGET: "; IF word1 = 5 THEN PRINT "OUT FOR "; IF word1 = 6 THEN PRINT "JUDGEMENT: "; IF word1 = 7 THEN PRINT "COLD BLOODED "; IF word1 = 8 THEN PRINT "MARKED FOR "; IF word1 = 9 THEN PRINT "LETHAL "; IF word1 = 10 THEN PRINT "INSTANT "; IF word1 = 11 THEN PRINT "HEATED "; IF word1 = 12 THEN PRINT "FORCED "; IF word1 = 13 THEN PRINT "MORTAL "; IF word1 = 14 THEN PRINT "FATAL "; IF word1 = 15 THEN PRINT "DIRTY "; IF word1 = 16 THEN PRINT "DOOMED TO "; IF word1 = 17 THEN PRINT "DEADLY "; IF word1 = 18 THEN PRINT "DANGEROUS "; IF word1 = 19 THEN PRINT "BEYOND "; IF word1 = 20 THEN PRINT "RAW "; IF word1 = 21 THEN PRINT "RAPID "; IF word1 = 22 THEN PRINT "ACTION "; IF word1 = 23 THEN PRINT "VIOLENT "; IF word2 = 1 THEN PRINT "MURDER" IF word2 = 2 THEN PRINT "TARGET" IF word2 = 3 THEN PRINT "JUSTICE" IF word2 = 4 THEN PRINT "FIRE" IF word2 = 5 THEN PRINT "JUDGEMENT" IF word2 = 6 THEN PRINT "DEATH" IF word2 = 7 THEN PRINT "BLOOD" IF word2 = 8 THEN PRINT "VENGEANCE" IF word2 = 9 THEN PRINT "VIOLENCE" IF word2 = 10 THEN PRINT "FORCE" IF word2 = 11 THEN PRINT "IMPACT" IF word2 = 12 THEN PRINT "COMBAT" IF word2 = 13 THEN PRINT "DANGER" IF word2 = 14 THEN PRINT "INSTINCT" IF word2 = 15 THEN PRINT "ACTION" IF word2 = 16 THEN PRINT "SILENCE" LOCATE 23, 1 COLOR 8 PRINT "Press return to view more titles, or press Q to quit "; INPUT "", a$ LOOP UNTIL a$ = "q" END SUB SUB bounce INPUT "Number of Balls (1 - 10, or more if you wish....)? > "; ballat INPUT "Delay ( 1 - Whatever Works For You )? > "; delaaaay CLS PRINT "Press Q To Quit" PRINT "Note: I could have employed a more complex 'all around the balls'" PRINT "collision detection system, but the collision detection in the center" PRINT "of the balls system, is simpler, faster and creates some pretty cool effects" SLEEP DIM ballx(ballat + 1) DIM bally(ballat + 1) DIM balldx(ballat + 1) DIM balldy(ballat + 1) DIM ballrad(ballat + 1) DIM ballcolor(ballat + 1) FOR ball = 1 TO ballat RANDOMIZE TIMER ballx(ball) = INT(RND * 300) bally(ball) = INT(RND * 180) SELECT CASE INT(RND * 6) CASE 0 balldx(ball) = -1 CASE 1 balldx(ball) = 1 CASE 2 balldx(ball) = -2 CASE 3 balldx(ball) = 2 CASE 4 balldx(ball) = -3 CASE 5 balldx(ball) = 3 END SELECT SELECT CASE INT(RND * 6) CASE 0 balldy(ball) = -1 CASE 1 balldy(ball) = 1 CASE 2 balldy(ball) = -2 CASE 3 balldy(ball) = 2 CASE 4 balldy(ball) = -3 CASE 5 balldy(ball) = 3 END SELECT ballrad(ball) = INT(RND * 10) + 10 ballcolor(ball) = INT(RND * 200) NEXT ball SCREEN 13 DO IF INKEY$ = "q" THEN GOTO endball FOR ballnum = 1 TO ballat FOR ctr = 1 TO delaaaay NEXT ctr CIRCLE (ballx(ballnum), bally(ballnum)), ballrad(ballnum), 0 ballx(ballnum) = ballx(ballnum) + balldx(ballnum) bally(ballnum) = bally(ballnum) + balldy(ballnum) IF POINT(ballx(ballnum) + balldx(ballnum), bally(ballnum)) <> 0 THEN balldx(ballnum) = -balldx(ballnum) IF POINT(ballx(ballnum), bally(ballnum) + balldy(ballnum)) <> 0 THEN balldy(ballnum) = -balldy(ballnum) CIRCLE (ballx(ballnum), bally(ballnum)), ballrad(ballnum), ballcolor(ballnum) FOR ctr = 1 TO 200 NEXT ctr NEXT ballnum LOOP endball: END SUB SUB savpoly DIM x(20) DIM y(20) DIM dx(20) DIM dy(20) DIM x2(20) DIM y2(20) ' I made this program when I saw the "Mystify Your Mind" ' Screen Saver in Windows. I decided to do the same in qbasic ' Right now it has 2 polygons. The next version will have 3 or 4. ' In my program the points that make up the polygon ' have one constant velocity that never chnages (dx, dy) ' in windows, the velocity changes constantly. You are free to make ' modifications as long as you send the modified one back to me. ' Polygon 1 can have copies of itself running right behind ' it, but it seroisly affects performance ' The Hi-res version is SLOOOOW and it flickers a lot ' but it looks almost exactly like windows ' I think that 1 POLYGON with a few streamers running behind it ' looks best. ' Some Ideas: ' Have dx and dy change when you hit a border ' Use palette and make the colors change gradualy ' SPEED up the Hi-res mode, it runs SLOOOWW on my 333Mhz Pentium ' ' Have Fun 'Variables ' How many "trails" running behind poly 1 ' put in DOUBLE the amount you actualy want ' 0 means nothing stream = 12 'Two Polygons? polygons = 1 ' DELAY ' Higher is FASTER, from 0 to 200 comp = 0 ' Asking for Resolution and Vertical Retrace and setting the variables for the ' resolution CLS INPUT "Resolution (12 - 13)"; resl INPUT "Wait for Vertical Retrace? (Reduces Flickering, but makes the shape diapear on some areas of the screen) Type 0 for No and 1 for Yes "; retrace INPUT "Number Of Shapes (1-2)? >"; polygons INPUT "Delay (0 - Whatever Works For You, Higher is FASTER)? > "; comp INPUT "The Amount Of Tails You Want Running Behind Polygon 1? > "; stra CLS PRINT " Push SPACEBAR During Simulation To Freeze Points On Polygon" PRINT " Push N To Un-Freeze Them. Push Q To Quit" stream = (stra * 2) IF resl = 12 THEN res$ = "high" IF resl = 13 THEN res$ = "low" SCREEN resl IF res$ = "high" THEN xlim = 640 IF res$ = "low" THEN xlim = 320 IF res$ = "high" THEN ylim = 480 IF res$ = "low" THEN ylim = 200 IF res$ = "low" THEN resdel = 200 - comp pointnum = 8 IF polygons = 1 THEN pointnum = 4 FOR ctr = 1 TO pointnum RANDOMIZE TIMER y(ctr) = INT(RND * ylim) x(ctr) = INT(RND * xlim) dx(ctr) = INT(RND * 2) + 1 dy(ctr) = INT(RND * 2) + 1 NEXT ctr DO 'COLOR CHOOSING 'Polygon 1 IF tick <> 1 THEN SELECT CASE INT(RND * 4) + 1 CASE ELSE tick = 1 col = INT(RND * 14) + 1 IF res$ = "low" THEN col = INT(RND * 200) ticklim = INT(RND * 200) END SELECT END IF IF tick = 1 THEN ticktock = ticktock + 1 IF ticktock >= ticklim THEN tick = 0: ticktock = 0 IF tick2 <> 1 THEN 'Polygon 2 SELECT CASE INT(RND * 4) + 1 CASE ELSE tick2 = 1 col2 = INT(RND * 14) + 1 IF res$ = "low" THEN col2 = INT(RND * 200) ticklim2 = INT(RND * 200) END SELECT END IF IF tick2 = 1 THEN ticktock2 = ticktock2 + 1 IF ticktock2 >= ticklim2 THEN tick2 = 0: ticktock2 = 0 FOR ctr = 1 TO pointnum 'INKEY OPTIONS SELECT CASE INKEY$ CASE "q" GOTO endpoly CASE " " dx(ctr) = 0: dy(ctr) = 0 CASE "n" dx(ctr) = 1: dy(ctr) = 1 END SELECT 'POINT CALCLATION IF y(ctr) >= ylim THEN dy(ctr) = -dy(ctr) IF y(ctr) <= ylim2 THEN dy(ctr) = -dy(ctr) IF x(ctr) >= xlim THEN dx(ctr) = -dx(ctr) IF x(ctr) <= xlim2 THEN dx(ctr) = -dx(ctr) y(ctr) = y(ctr) + dy(ctr) x(ctr) = x(ctr) + dx(ctr) 'DRAWING OF THE POLYGONS ' This is were the code gets a little messy 'Polygon 1 LINE (x(1), y(1))-(x(2), y(2)), col LINE (x(2), y(2))-(x(3), y(3)), col LINE (x(3), y(3))-(x(4), y(4)), col LINE (x(4), y(4))-(x(1), y(1)), col 'Polygon 2 'Leave if there is only 1 Polygon IF polygons <> 2 THEN GOTO nopol2 LINE (x(5), y(5))-(x(6), y(6)), col2 LINE (x(6), y(6))-(x(7), y(7)), col2 LINE (x(7), y(7))-(x(8), y(8)), col2 LINE (x(8), y(8))-(x(5), y(5)), col2 nopol2: 'STREAMER CODE IF stream <> 0 THEN FOR cts = 1 TO stream STEP 2 LINE (x(1) - cts, y(1) - cts)-(x(2) - cts, y(2) - cts), col NEXT cts FOR cts = 1 TO stream STEP 2 LINE (x(2) - cts, y(2) - cts)-(x(3) - cts, y(3) - cts), col NEXT cts FOR cts = 1 TO stream STEP 2 LINE (x(3) - cts, y(3) - cts)-(x(4) - cts, y(4) - cts), col NEXT cts FOR cts = 1 TO stream STEP 2 LINE (x(4) - cts, y(4) - cts)-(x(1) - cts, y(1) - cts), col NEXT cts END IF ' Without this the polygons leave ' a messy trail in the first ten movements IF dt <= 10 THEN CLS dt = dt + 1 ' DELAY ' You might really need to change this FOR ct = 1 TO resdel NEXT ct ' Setting some more points right behind the originals x2(ctr) = x(ctr) + (dx) y2(ctr) = y(ctr) + (dy) IF retrace = 1 THEN WAIT &H3DA, 8 'Eraseing the Polygons 'Polygon 1 LINE (x2(1), y2(1))-(x2(2), y2(2)), 0 LINE (x2(2), y2(2))-(x2(3), y2(3)), 0 LINE (x2(3), y2(3))-(x2(4), y2(4)), 0 LINE (x2(4), y2(4))-(x2(1), y2(1)), 0 'Polygon 2 ' Leave if there aren't two Polygons IF polygons <> 2 THEN GOTO nopol22 LINE (x2(5), y2(5))-(x2(6), y2(6)), 0 LINE (x2(6), y2(6))-(x2(7), y2(7)), 0 LINE (x2(7), y2(7))-(x2(8), y2(8)), 0 LINE (x2(8), y2(8))-(x2(5), y2(5)), 0 nopol22: 'ERASING THE STREAMERS IF stream <> 0 THEN FOR cts = 1 TO stream STEP 2 LINE (x2(1) - cts, y2(1) - cts)-(x(2) - cts, y(2) - cts), 0 NEXT cts FOR cts = 1 TO stream STEP 2 LINE (x2(2) - cts, y2(2) - cts)-(x2(3) - cts, y2(3) - cts), 0 NEXT cts FOR cts = 1 TO stream STEP 2 LINE (x2(3) - cts, y2(3) - cts)-(x2(4) - cts, y2(4) - cts), 0 NEXT cts FOR cts = 1 TO stream STEP 2 LINE (x2(4) - cts, y2(4) - cts)-(x2(1) - cts, y2(1) - cts), 0 NEXT cts END IF NEXT ctr ' Loop Back LOOP endpoly: END SUB SUB snowfall 'Get The Number Of To Know Ho Much Memory To Reserve For Them INPUT "Flakes (1 - 20)? > "; flakes INPUT "Delay ( 1 - Whatever Works For You )? > "; delaaay ' Toggle between 1 and 0 to turn slow falling background snow off and on backsnow = 1 sizedy = 0 sizeuy = 1 backy = 0 'Add One For Good Luck DIM x(flakes + 1) DIM y(flakes + 1) DIM snowcolor(flakes + 1) DIM snowcolor2(flakes + 1) DIM snowdead(flakes + 1) DIM defy(flakes + 1) snowcreation: FOR snowarray = 1 TO flakes RANDOMIZE TIMER x(snowarray) = INT(RND * 320) y(snowarray) = INT(RND * 200) snowcolor(snowarray) = 15 snowcolor2(snowarray) = 31 SELECT CASE INT(RND * 7) CASE 0 defy(snowarray) = 1 CASE 1 defy(snowarray) = .5 CASE 2 defy(snowarray) = .6 CASE 3 defy(snowarray) = .7 CASE 4 defy(snowarray) = .8 CASE 5 defy(snowarray) = .9 CASE 6 defy(snowarray) = 1 END SELECT PRINT x(snowarray), y(snowarray), snowcolor(snowarray), snowcolor2(snowarray), defy(snowarray) NEXT snowarray CLS PRINT "Press SPACEBAR During Simulation To Toggle Snow Speed, but I reccommend you dont" PRINT "And Q To End" SLEEP 2 SCREEN 13 LINE (0, 170)-(320, 170), 6 PAINT (1, 171), 6, 6 LINE (160, 170)-(160, 150), 6 LINE (170, 170)-(170, 150), 6 LINE (170, 150)-(160, 150), 6 PAINT (161, 151), 6, 6 LINE (145, 150)-(185, 150), 2 LINE (145, 150)-(165, 100), 2 LINE (185, 150)-(165, 100), 2 PAINT (165, 110), 2, 2 LINE (60, 170)-(60, 150), 6 LINE (70, 170)-(70, 150), 6 LINE (70, 150)-(60, 150), 6 PAINT (61, 151), 6 LINE (45, 150)-(85, 150), 2 LINE (45, 150)-(65, 100), 2 LINE (85, 150)-(65, 100), 2 PAINT (62, 110), 2, 2 DO SELECT CASE INKEY$ CASE "q" GOTO endsnow CASE "Q" GOTO endsnow CASE " " SWAP backsnow, backy END SELECT IF INKEY$ <> "" THEN END RANDOMIZE TIMER FOR d = 1 TO flakes FOR ctr = 1 TO delaaay NEXT ctr IF backsnow = 0 THEN defy(d) = 1 PSET (x(d), y(d)), 0 y(d) = y(d) + defy(d) x(d) = x(d) IF POINT(x(d), y(d) + 1) <> 0 AND POINT(x(d), y(d) + 1) <> snowcolor(1) THEN IF POINT(x(d), y(d) + 1) <> 0 AND POINT(x(d) + 1, y(d) + 1) <> 0 AND POINT(x(d) - 1, y(d) + 1) <> 0 THEN snowdead(d) = 1: GOTO skip SELECT CASE POINT(x(d), y(d) + 1) CASE -1 snowdead(d) = 1: GOTO skip CASE ELSE SELECT CASE POINT(x(d) - 1, y(d) + 1) CASE -1 snowdead(d) = 1 CASE 0 x(d) = x(d) - 1 y(d) = y(d) + 1 CASE ELSE SELECT CASE POINT(x(d) + 1, y(d) + 1) CASE -1 snowdead(d) = 1: CASE 0 x(d) = x(d) + 1 y(d) = y(d) + 1 CASE ELSE FOR c = 1 TO 5 up = up + 1 IF POINT(x(d), y(d) - c) = snowcolor(d) THEN GOTO k NEXT c GOTO l k: snowdead(d) = 1 PSET (x(d), y(d) - up), snowcolor(d) GOTO skip l: snowdead(d) = 1 END SELECT END SELECT END SELECT END IF skip: IF snowdead(d) = 1 THEN PSET (x(d), y(d) - sizeuy), snowcolor2(d) IF defy(d) = .5 THEN PSET (x(d), y(d) + (sizedy + .5)), snowcolor2(d) IF defy(d) = .6 THEN PSET (x(d), y(d) + (sizedy + .4)), snowcolor2(d) IF defy(d) = .7 THEN PSET (x(d), y(d) + (sizedy + .3)), snowcolor2(d) IF defy(d) = .8 THEN PSET (x(d), y(d) + (sizedy + .2)), snowcolor2(d) IF defy(d) = .9 THEN PSET (x(d), y(d) + (sizedy + .1)), snowcolor2(d) PSET (x(d), y(d) + sizedy), snowcolor2(d) PSET (x(d), y(d)), snowcolor2(d) RANDOMIZE TIMER x(d) = INT(RND * 320) y(d) = 1 SELECT CASE INT(RND * 7) CASE 0 defy(d) = 1 CASE 1 defy(d) = .5 CASE 2 defy(d) = .6 CASE 3 defy(d) = .7 CASE 4 defy(d) = .8 CASE 5 defy(d) = .9 CASE 6 defy(d) = 1 END SELECT snowdead(d) = 0 END IF PSET (x(d), y(d)), 15 NEXT d LOOP endsnow: END SUB