barrier=[[70,750],[0,0]],
rtd=new p5.Vector(425,0).rotate(Math.PI/2*0.9).x+80
setTimeout(_=>{if(keyIsDown(32)){
let norm=new p5.Vector(425+pt,0).rotate(Math.PI/2*0.9)
barrier[1]=[80+norm.x,750-norm.y]
let norm=new p5.Vector(425+pt,0).rotate(Math.PI/2*0.9)
barrier[1]=[80+norm.x,750-norm.y]
for(i=12.5;i<387.5;i+=25*pack){for(j=12.5;j<387.5;j+=25*pack){particles.push(new Particle(i/4+300+random(-1,1),j/5+220+random(-1,1)))}}
cnv=createGraphics(400,400)
cnv.background(0);cnv.fill(0,200,255);cnv.stroke(255);cnv.rect(0,0,400,400);cnv.stroke(0,0,0,0)
cnv.pixelDensity(1);cnv.fill(0,200,255);cnv.stroke(255);cnv.rect(0,0,400,400);cnv.stroke(0,0,0,0)
if(keyIsDown(16)||pd!=400)pd=400-(1-Math.cos((frameCount-sf)*Math.PI*2/spd))*dst
for(i=0;i<particles.length;i++){let p=particles[i];p.update();p.show()}
cnv.stroke(255);cnv.fill(0,0,255);cnv.strokeWeight(1)
cnv.stroke(255);cnv.line(...barrier[0],...barrier[1])
cnv.fill(100);cnv.stroke(255);cnv.strokeWeight(2);cnv.circle(80,750,850)
cnv.stroke(255);cnv.fill(0,0,0,0);cnv.rect(0,0,400,400);cnv.stroke(0,0,0,0)
if(keyIsDown(70))console.log(frameRate())
fill(255);noStroke();textAlign(LEFT,TOP);let r=rtd
ots=particles.filter(n=>n.pos.x<r).length
if(ots>max_ots)max_ots=ots
text('Flood intensity: '+max_ots+'/'+particles.length,10,10)
text('FPS: '+Math.floor(frameRate()).toString(),width-10,10)
keyPressed=_=>{if(keyCode==16)sf=frameCount}
if(key=='a')paused=!paused
if(key=='s')cnv.save('wave.png')
this.pos=createVector(x,y)
this.vel=createVector(0,0)
if(keyIsDown(32))this.heat=0
for(let i=0;i<particles.length;i++){
if(p.pos.dist(this.pos)<rad){
let s=p.pos.dist(this.pos)
let q=this.pos.copy().sub(p.pos).div(32).mult((s-rad)/s)
this.vel.sub(q);this.pos.sub(q);q.mult(-1)
p.vel.sub(q);p.pos.sub(q)
if(new p5.Vector(mouseX,mouseY).dist(this.pos)<50){
let s=new p5.Vector(mouseX,mouseY).dist(this.pos)
let q=this.pos.copy().sub(mouseX,mouseY).div(64).mult((s-50)/s)
this.vel.sub(q);this.pos.sub(q);q.mult(-1)
if(new p5.Vector(80,750).dist(this.pos)<rad/2+850/2){
let s=new p5.Vector(80,750).dist(this.pos)
let q=this.pos.copy().sub(80,750).div(2).mult((s-rad/2-850/2)/s)
this.vel.sub(q);this.pos.sub(q);q.mult(-1)
let norm=new p5.Vector(...barrier[1]).sub(new p5.Vector(...barrier[0])).rotate(Math.PI/2)
norm=line2([[this.pos.x+norm.x,this.pos.y+norm.y],[this.pos.x,this.pos.y]],barrier)
if(barrier[0][0]>barrier[1][0]){
if(norm[0]>barrier[0][0])norm[0]=barrier[0][0]
if(norm[0]<barrier[1][0])norm[0]=barrier[1][0]
if(norm[0]>barrier[1][0])norm[0]=barrier[1][0]
if(norm[0]<barrier[0][0])norm[0]=barrier[0][0]
if(barrier[0][1]>barrier[1][1]){
if(norm[1]>barrier[0][1])norm[1]=barrier[0][1]
if(norm[1]<barrier[1][1])norm[1]=barrier[1][1]
if(norm[1]>barrier[1][1])norm[1]=barrier[1][1]
if(norm[1]<barrier[0][1])norm[1]=barrier[0][1]
if(new p5.Vector(...norm).dist(this.pos)<rad){
let s=new p5.Vector(...norm).dist(this.pos)
let q=this.pos.copy().sub(...norm).div(2).mult((s-rad)/s)
this.vel.sub(q);this.pos.sub(q);q.mult(-1)
if(this.pos.x<rad/2){this.pos.x=rad/2;this.vel.x=this.vel.x/2}
if(this.pos.x>pd-rad/2){this.pos.x=pd-rad/2;this.vel.x=this.vel.x/2}
if(this.pos.y>400-rad/2){this.pos.y=400-rad/2;this.vel.y=this.vel.y/2}
cnv.circle(this.pos.x,this.pos.y,10)