sync on sync rate 25 hide mouse autocam off position camera 0,5,0 color backdrop rgb(100,100,155) fog on fog color rgb(100,100,155) fog distance 2000 `grass for x=1 to 10 for y=1 to 10 ink rgb(rnd(100),rnd(155)+100,0),0 dot x,y next y next x get image 1000,1,1,10,10 make object plain 1000,2000,2000 xrotate object 1000,-90 texture object 1000,1000 scale object texture 1000,10,10 set object texture 1000,2,0 `particle properties numberofparticles=10000 dim x#(numberofparticles) dim y#(numberofparticles) dim xspeed#(numberofparticles) dim yspeed#(numberofparticles) dim brightness(numberofparticles) dim a#(numberofparticles) dim e#(numberofparticles) `phase angle for particle=1 to numberofparticles x#(particle)=rnd(screen width()) y#(particle)=rnd(screen height()) xspeed#(particle)=(rnd(3000)/1000.0) e#(particle)=rnd(360) brightness(particle)=rnd(100)+100 a#(particle)=gaussian(2*screen width())-screen width() `amplitude gravitya#=.01 gravityb#=1.0 omega#=0.0006 `primary angular velocity phi#=2.0 `secondary angular velocity next particle do inc counter if counter>1000 then counter=0 if counter=100 or counter=110 or counter=400 color backdrop rgb(255,255,255) else color backdrop rgb(100,100,155) endif gosub particles control camera using arrowkeys 0,1,1 if counter/2.0=int(counter/2.0) then sync loop particles: text 0,0,str$(screen fps()) lock pixels `tornado particles for particle=1 to numberofparticles step 2 inc y#(particle),gravityb# if y#(particle)>0 and y#(particle)<screen height() and x#(particle)>0 and x#(particle)<screen width() then set_locked_pixel(x#(particle),y#(particle),rgb(brightness(particle),brightness(particle),200)) x#(particle)=(500/y#(particle)^1.5)*a#(particle)*sin(theta#+e#(particle))+screen width()/2+(20*sin(y#(particle)+psi#)) theta#=wrapvalue(theta#)+omega# if y#(particle)>=screen height()/1.5 then dec y#(particle),screen height() next particle psi#=wrapvalue(psi#)+phi# `background particles for particle=2 to numberofparticles step 2 inc y#(particle),gravityb# if y#(particle)>screen height()-1 then y#(particle)=1 if y#(particle)>0 and y#(particle)<screen height() and x#(particle)>0 and x#(particle)<screen width() then set_locked_pixel(x#(particle),y#(particle),rgb(brightness(particle),brightness(particle),200)) inc x#(particle),xspeed#(particle) if x#(particle)>screen width()-1 then x#(particle)=1 next particle unlock pixels return `Function borrowed from Coding Fodder's Rain code function set_locked_pixel(x,y,color_value) start=get pixels pointer() repeat_number=get pixels pitch() bits_per_pixel=bitmap depth(num)/8 pointer=start+y*repeat_number+x*bits_per_pixel *pointer=color_value endfunction function gaussian(range#) r=0 for a = 1 to range#/10 inc r, rnd(range#) next a r=int(10*r/range#) endFunction r