If CommandLine()="/p" Or CommandLine()="/c" Then End Const width=1024,height=768 Graphics width,height,32 SetBuffer BackBuffer() SeedRnd MilliSecs() Global waterlevel=height/3 Global t=0 Const skyrgb=230 Or (210 Shl 8) Or (210 Shl 16) Const waterrgb=50 Global white=255 Or (255 Shl 8) Or (255 Shl 16) Global red=(255 Shl 16) Function drawbezier(ax#,ay#,v1x#,v1y#,v2x#,v2y#,dx#,dy#,limit#,rgb,filled=0,outline=0) m#=(dy-ay)/(dx-ax) bx#=ax+v1x by#=ay+v1y cx#=dx+v2x cy#=dy+v2y ;Color 0,0,255 ;Line ax,ay,bx,by ;Color 255,255,0 ;Line dx,dy,cx,cy ;WritePixel ax,ay,white ;WritePixel dx,dy,white For bstep#=0 To limit Step 1 a#=bstep/limit b#=1-bstep/limit x#=ax*b*b*b+3*bx*b*b*a+3*cx*b*a*a+dx*a*a*a y#=ay*b*b*b+3*by*b*b*a+3*cy*b*a*a+dy*a*a*a If filled top#=ay+(x-ax)*m For ly=top To y WritePixel x,ly,rgb Next If outline WritePixel x,y,outline WritePixel x,top,outline EndIf Else WritePixel x,y,rgb EndIf Next End Function Type boat Field x#,y#,an#,length# Field van#,vx#,vy# Field oaran# Field targx#,targy# Field rope.swing,endrope.swing Field ropelength# Field caught.jellyfish Field patience End Type Function waterlevel#(x) Return waterlevel+10*Sin((t+x)/2)+5*Sin((t*10+3*x)) End Function Function wobblyline(x1#,y1#,x2#,y2#,wobbles#,amp#,rgb) dx#=x2-x1 dy#=y2-y1 l#=Sqr(dx*dx+dy*dy) dx=dx/l dy=dy/l da#=360*((wobbles-.5)/l) an#=180 For st#=1 To l Step .25 an=180+st*da x#=x1+st*dx+Sin(an)*amp*dy y#=y1+st*dy-Sin(an)*amp*dx WritePixel x,y,rgb Next End Function Type swing Field px#,py# Field an#,l#,stiff# Field targan# Field v# Field x#,y# Field prv.swing,nxt.swing Field disabled End Type Type jellyfish Field x#,y#,length# Field targx#,targy#,ticker Field vx#,vy# Field tendrils.swing[5] Field lx#,ly#,rx#,ry# Field caught End Type Function newjellyfish.jellyfish(x,y,length#) j.jellyfish=New jellyfish j\x=x j\y=y j\length=length For c=1 To 5 j\tendrils[c]=newtendril(length/2) j\tendrils[c]\x=j\x j\tendrils[c]\y=j\y+100 j\tendrils[c]\targan=(c-3)*10 Next j\targx=Rand(width) j\targy=Rand(height) Return j End Function Function newtendril.swing(l#,links=5) s.swing=New swing swing.swing=s stiff#=1.0 s\l=l s\stiff=.5 For c=1 To links olds.swing=s s.swing=New swing olds\nxt=s s\prv=olds l=l*.6 s\l=l stiff=stiff*.5 s\stiff=stiff Next Return swing End Function Function newboat.boat(x,length#) b.boat=New boat b\x=x b\y=waterlevel-10 b\length=length b\rope=newtendril(100,5) s.swing=b\rope s\disabled=1 While s\nxt<>Null s=s\nxt s\disabled=1 Wend b\endrope=s b\ropelength=-50 b\targx=Rand(width) b\targy=Rand(waterlevel+200,height) Return b End Function For c=1 To 20 newjellyfish(Rand(width),Rand(waterlevel+50,height),Rand(20,50)) Next For c=1 To 4 newboat(Rand(width),Rand(30,60)) Next While Not KeyHit(1) t=t+1 Color 210,210,230 Rect 0,0,width,waterlevel-15 For c=0 To 9 Color 0,0,50-c*5 Rect 0,c*(height-waterlevel-15)/10+waterlevel+15,width,(height-waterlevel-15)/10+2 Next LockBuffer() For x=1 To width wy=waterlevel(x) For y=waterlevel-15 To wy WritePixelFast x,y,skyrgb Next For y=wy To waterlevel+15 WritePixelFast x,y,waterrgb Next Next For b.boat=Each boat b\patience=b\patience-1 If b\patience<0 b\targx=Rand(width) b\patience=Rand(1000,3000) EndIf dx#=b\targx-b\x oarspeed#=0 If (Abs(dx)>b\length Or Abs(b\vx>1)) If b\ropelength<10 oardir=Sgn(dx) oarspeed#=Abs(dx)/100.0 If oarspeed>1 Then oarspeed=1 If oarspeed<.5 Then oarspeed=.5 If b\oaran>180 b\oaran=b\oaran+15*oardir Else b\oaran=b\oaran+5*oardir*oarspeed EndIf EndIf If b\ropelength>-50 Then b\ropelength=b\ropelength-.1 Else If b\oaran<200 oarspeed=1 b\oaran=b\oaran+5*Sgn(dx) Else oarspeed=0 EndIf If b\ropelength<(b\targy-b\y)/2 b\ropelength=b\ropelength+.5 EndIf EndIf If b\caught<>Null b\caught\x=b\endrope\x b\caught\y=b\endrope\y b\ropelength=b\ropelength-1 If b\ropelength<=10 ;For c=1 To 5 ; s.swing=b\caught\tendrils[c] ; olds.swing=s ; While s\nxt<>Null ; s=s\nxt ; Delete olds ; olds=s ; Wend ; Delete olds ; WaitKey() ;Next ;Delete b\caught b\caught\y=height+100 b\caught\x=Rand(width) b\caught\caught=0 b\caught=Null b\targx=Rand(width) b\patience=Rand(1000,3000) EndIf Else If Not b\endrope\disabled s.swing=b\endrope For j.jellyfish=Each jellyfish If Not j\caught d#=Sqr((j\x-s\x)*(j\x-s\x)+(j\y-s\y)*(j\y-s\y)) If d10 s.swing=b\rope s\px=b\x s\py=b\y s\disabled=0 l#=b\ropelength s\l=l While s\nxt<>Null l=l/2 s=s\nxt s\l=l s\disabled=0 Wend Else s=b\rope s\disabled=1 While s\nxt<>Null s=s\nxt s\disabled=1 Wend EndIf If b\oaran<0 Then b\oaran=360+b\oaran b\oaran=b\oaran Mod 360 b\vx=b\vx*.99 b\vy=b\vy*.95+.1 b\van=b\van*.95 b\x=b\x+b\vx b\y=b\y+b\vy b\an=b\an+b\van lx#=b\x-Cos(b\an)*b\length ly#=b\y-Sin(b\an)*b\length rx#=b\x+Cos(b\an)*b\length ry#=b\y+Sin(b\an)*b\length ldepth#=ly-waterlevel(lx) If ldepth>0 f#=.01*ldepth fr#=Cos(b\an)*f*b\length*.01 fl#=f*2*Abs(Cos(b\an)) b\van=b\van+fr b\vx=b\vx+fl*.01 b\vy=b\vy-fl EndIf rdepth#=ry-waterlevel(rx) If rdepth>0 f#=.01*rdepth fr#=Cos(b\an)*f*b\length*.01 fl#=f*2*Abs(Cos(b\an)) b\van=b\van-fr b\vx=b\vx-fl*.01 b\vy=b\vy-fl EndIf oarx#=b\x+40*Cos(b\oaran) oary#=b\y+10*Sin(b\oaran) If oary>waterlevel(oarx) b\vx=b\vx+.04*oardir*oarspeed*b\length/50 EndIf drawbezier(lx,ly,b\length*Cos(-b\an+60)/2,b\length*Sin(-b\an+60)/2,-b\length*Cos(b\an-60)/2,-b\length*Sin(b\an-60)/2,rx,ry,b\length*2.8,255 Shl 8,1,1) Color 255,0,0 Line b\x-8*Cos(b\oaran),b\y-2*Sin(b\oaran),oarx,oary Next For j.jellyfish=Each jellyfish j\ticker=j\ticker-1 If j\ticker<0 j\targx=Rand(width) j\targy=Rand(waterlevel,height) j\ticker=Rand(250,1000) EndIf an#=ATan(j\vx/10) j\vx=j\vx*.95+(j\targx-j\x)/5000.0 j\x=j\x+j\vx If j\targy90 Then j\tendrils[c]\an=Sgn(j\tendrils[c]\an)*90 Next ;Color 255,0,0 ;Line j\x-dx*j\length/2,j\y-dy*j\length/2,j\x+dx*j\length/2,j\y+dy*j\length/2 ;oldx#=j\x-dx*j\length/2 ;oldy#=j\y-dy*j\length/2 ;For a=0 To 180 Step 20 ; x#=j\x+j\length*Cos(an-a)/2 ; y#=j\y+j\length*Sin(an-a)/2 ; Line oldx,oldy,x,y ; oldx=x:oldy=y ;Next j\lx=j\x-dx*j\length/2 j\ly=j\y-dy*j\length/2 j\rx=j\x+dx*j\length/2 j\ry=j\y+dy*j\length/2 drawbezier(j\lx,j\ly,Sin(an)*j\length*(wobble+1)/3,-Cos(an)*j\length*(wobble+1)/3,Sin(an)*j\length*(wobble+1)/3,-Cos(an)*j\length*(wobble+1)/3,j\rx,j\ry,200,red) wobblyline(j\lx,j\ly,j\rx,j\ry,5,1.5*wobble,red) ;Text j\x,j\y,an ;Color 255,255,255 ;Rect j\x-j\length/2,j\y-20,j\length,20 Next For s.swing=Each swing If Not s\disabled If s\prv<>Null s\px=s\prv\x s\py=s\prv\y EndIf s\an=90-ATan2(s\y-s\py,s\x-s\px) s\v=s\v*.97-Sin(s\an-s\targan)*20*s\stiff/s\l+Rnd(-.5,.5)*(1-s\stiff) s\an=s\an+s\v s\x=s\l*Sin(s\an)+s\px s\y=s\l*Cos(s\an)+s\py ;Line s\px,s\py,s\x,s\y If s\prv<>Null v1x#=s\prv\x-s\prv\px v1y#=s\prv\y-s\prv\py Else v1x#=Sin(s\targan)*s\l v1y#=Cos(s\targan)*s\l EndIf v2x#=s\px-s\x v2y#=s\py-s\y col#=255*(1-(s\py-waterlevel)/(height-waterlevel)) If col<0 Then col=0 If col>255 Then col=255 rgb=col Or (col Shl 8) Or (col Shl 16) drawbezier(s\px,s\py,v1x/3,v1y/3,v2x/3,v2y/3,s\x,s\y,s\l,rgb) If MouseDown(1) Then s\x=s\px:s\y=s\py+s\l:s\v=0 EndIf Next UnlockBuffer() Flip Cls Wend