xxxxxxxxxx
124
// click on the boxes to add water
// rain will go against your efforts!
// simulation might flash
// edit this to control difficulty
var touchMassMin = 500; // uniform selection
var touchMassMax = 1000;
var rainMass = -500;
var rainInterval = 500; // in milliseconds
var loseHeight = -105; // you win or lose when one
var winHeight = 380; // cell reaches this height
var boxSize = 20.2;
var gridSize = 25;
var interpSpeed = 0.001;
var boxDepth = 242;
var boxFar = 100;
var viewAngle = 0;
var backgroundColor = [70, 150, 200];
var boxes = [];
function setup() {
createCanvas(400, 400, WEBGL);
addScreenPositionFunction();
reset();
setInterval(function() {
boxes[Math.floor(random(gridSize**2))] += rainMass;
}, rainInterval);
}
function reset() {
boxes = [];
for(var i = 0; i < gridSize**2; i++) {
boxes.push(1 + random(50));
}
}
function draw() {
step();
pointLight(255, 255, 155, 0, -400, -100);
ambientLight(40, 70, 120);
background(backgroundColor);
noStroke();
rotateX(viewAngle);
var i = 0;
for(var vec of coordinates()) {
push();
translate(vec);
var height = boxes[i];
if(height >= winHeight) {
alert("You win! Game over!");
background(backgroundColor);
reset();
return;
} else if(height < loseHeight) {
alert("You lose! Game over!");
background(backgroundColor);
reset();
return;
}
// height = constrain(height, 0, 50);
translate(0, -height/2, 0);
box(boxSize, boxSize + height, boxSize);
pop();
i++;
}
}
function step() {
for(var x = 0; x < gridSize; x++) {
for(var y = 0; y < gridSize; y++) {
var avg = 0;
for(var x1 of [
(x - 1) % gridSize,
x,
(x + 1) % gridSize,
]) {
for(var y1 of [
(y - 1) % gridSize,
y,
(y + 1) % gridSize,
]) {
if(x1 < 0) x1 = gridSize - 1;
if(y1 < 0) y1 = gridSize - 1;
avg += boxes[y1 * gridSize + x1];
}
}
avg /= 3 * 3;
boxes[y * gridSize + x] = avg;
}
}
}
function mousePressed() {
rotateX(viewAngle);
var i = 0;
var minDist = width*height;
var minIndex = -1;
var mouse = createVector(mouseX-width/2, mouseY-height/2);
for(var vec of coordinates()) {
var pos = screenPosition(p5.Vector.add(vec, createVector(0, -boxes[i])));
var dist = pos.dist(mouse);
if(dist < minDist) {
minDist = dist;
minIndex = i;
}
i++;
}
boxes[minIndex] += random(touchMassMin, touchMassMax);
}
function* coordinates() {
for(var x = 0; x < gridSize; x++) {
for(var y = 0; y < gridSize; y++) {
yield createVector(-(gridSize-1)/2*boxSize + boxSize*x, boxDepth, -boxSize * y - boxFar);
}
}
}