Source for demo by Lauri Paimen. See also description and commented source.
for($ in a)a[$[m=n=0]+=$[6]||""]=a[$];i=[];h=c.width=c.height=8E2;b=[7E2,5,9,1E5,3E3,9,99,60];setInterval(onkeyup=onmousemove=function(E){E?(Z={x:m=E.pageX||m,y:n=E.pageY||n,X:0,Y:0,w:0,W:0},A=(E.which|0)-13||++Z.W&i.push(Z),A-19||i.push(Z),b[A+A%2-53>>1]*=.9+A%2/5)(d=Math.abs):a[f="fillStyle"]="rgba(0,0,0,.1)";a.fc(I=0,0,h,h);for(a[f]="tan";I<8;a.fx(b[I++]|0,99,A))a.fx("B|C Ground0D|E Speed0F|G Distance0H|I Flocking0J|K Mouse attr0L|M Obst size0N|O Perch time0P|Q Sight len".split(0)[I],5,A=9*I+9);a[f]="#270";for(a.fc(I=0,b[0],h,h);A=i[I++];)with(A){for(B=K=M=N=O=P=Q=R=0;S=i[K++];a[f]="#888"){(A=d(x-S.x)+d(y-S.y))<b[7]&&(B++,M+=S.x,N+=S.y,Q+=S.X,R+=S.Y);A<S.W*3*b[5]+b[2]&&(O-=S.x-x,P-=S.y-y)}X+=(M/B-x)/b[3]+O/9+(Q/B-X)/15+(m-x)/b[4];y>b[0]|w?(y=b[X=0],Y=-5,w=w?w-1:b[6]|0):Y+=(N/B-y)/b[3]+P/9+(R/B-Y)/15+(n-y)/b[4];C=b[1];X/=d(X)>C?d(X)/C:1;Y/=d(Y)>C?d(Y)/C:1;with(a){ba();strokeStyle="red";W?a(x,y,b[5],0,7,0)&f():m(x,y)&l(x+=X,y+=Y)&s()}}},50)