function draw() {
if (currentLevel === 9 || currentLevel === 13 || currentLevel === 15 || currentLevel === 20) {
background(0);
} else if (currentLevel === 8) {
background(220);
} else if (currentLevel === 11) {
background(50);
} else if (currentLevel === 12) {
background(34, 139, 34);
} else if (currentLevel === 14) {
background(100, 50, 150);
} else if (currentLevel === 17) {
background(100);
} else if (currentLevel === 18) {
background(200, 220, 255);
} else {
background(220);
}
textAlign(LEFT, TOP);
textSize(32);
fill(0);
noStroke();
text(`Level: ${currentLevel}`, 10, 10);
if (currentLevel === 8) {
text(`Fish Caught: ${fishCaughtCount}`, 10, 40);
}
if (currentLevel !== 8 && currentLevel !== 13 && currentLevel !== 20) {
translate(camX, camY);
}
if (!panning && currentLevel === 9 && !diamondFound && !gameCompleted) {
camX += driftVelocityX;
camY += driftVelocityY;
driftVelocityX *= 0.95;
driftVelocityY *= 0.95;
if (abs(driftVelocityX) < 0.1) driftVelocityX = 0;
if (abs(driftVelocityY) < 0.1) driftVelocityY = 0;
camX = constrain(camX, -(TOWN_WIDTH - width), 0);
}
if (!panning && currentLevel === 18 && !diamondFound && !gameCompleted) {
camX += slipperyPanVelocityX;
camY += slipperyPanPanVelocityY;
slipperyPanVelocityX *= 0.98;
slipperyPanPanVelocityY *= 0.98;
if (abs(slipperyPanVelocityX) < 0.1) slipperyPanVelocityX = 0;
if (abs(slipperyPanPanVelocityY) < 0.1) slipperyPanPanVelocityY = 0;
camX = constrain(camX, -(TOWN_WIDTH - width), 0);
}
if (currentLevel !== 8 && currentLevel !== 13 && currentLevel !== 15 && currentLevel !== 20) {
checkAndGenerateNewBlocks();
}
// Drawing logic for each level type (Level 9 asteroids, Level 11 lava, etc.)
if (currentLevel === 9) {
// Draw nebulae and asteroids
for (let nebula of nebulae) {
fill(nebula.color);
noStroke();
ellipse(nebula.x, nebula.y, nebula.size, nebula.size);
}
for (let asteroid of asteroids) {
fill(asteroid.color);
stroke(asteroid.color.levels[0] + 50);
strokeWeight(1);
ellipse(asteroid.x, asteroid.y, asteroid.size, asteroid.size);
asteroid.x += asteroid.speedX;
asteroid.y += asteroid.speedY;
if (asteroid.x > TOWN_WIDTH) asteroid.x = -asteroid.size;
if (asteroid.x < -asteroid.size) asteroid.x = TOWN_WIDTH;
let screenTop = -camY;
let screenBottom = -camY + height;
if (asteroid.y > screenBottom + height) asteroid.y = screenTop - height;
if (asteroid.y < screenTop - height) asteroid.y = screenBottom + height;
}
} else if (currentLevel === 11) {
drawLavaFlows();
drawTownElements();
} else if (currentLevel === 12) {
drawJungleFoliage();
drawTownElements();
} else if (currentLevel === 13) {
drawDeepSeaCreatures();
} else if (currentLevel === 14) {
drawAlienObjects();
drawTownElements();
} else if (currentLevel === 17) {
drawTownElements();
drawAshParticles();
} else if (currentLevel === 18) {
drawTownElements();
drawSnowParticles();
} else if (currentLevel === 19) {
drawTownElements();
if (glitchActive) {
push();
noFill();
stroke(random(255), random(255), random(255), 100);
strokeWeight(random(1, 5));
line(random(TOWN_WIDTH), random(-camY, -camY + height), random(TOWN_WIDTH), random(-camY, -camY + height));
pop();
}
} else if (currentLevel !== 8 && currentLevel !== 20 && currentLevel !== 15) {
drawTownElements();
}
if (currentLevel === 6 && !diamondFound && chasingUFO) {
let targetX = -camX + width / 2;
let targetY = -camY + height / 2;
let moveVec = createVector(targetX - chasingUFO.x, targetY - chasingUFO.y);
moveVec.normalize().mult(chasingUFO.speed);
chasingUFO.x += moveVec.x;
chasingUFO.y += moveVec.y;
chasingUFO.x += sin(frameCount * 0.05) * 5;
chasingUFO.y += cos(frameCount * 0.04) * 5;
drawUFO(chasingUFO.x, chasingUFO.y, chasingUFO.size, color(255, 0, 0, 180), color(255, 255, 0));
}
if (currentLevel === 6 && petUFO) {
let targetX = -camX + width / 2;
let targetY = -camY + height / 2;
petUFO.x = lerp(petUFO.x, targetX, 0.05);
petUFO.y = lerp(petUFO.y, targetY, 0.05);
drawUFO(petUFO.x, petUFO.y, petUFO.size, petUFO.bodyColor, petUFO.lightColor);
}
if (!diamondFound) {
if (currentLevel === 8) {
drawOceanFishingElements();
} else if (currentLevel === 7) {
if (diggingAnimationActive) {
let elapsed = millis() - diggingStartTime;
let alpha = map(elapsed, 0, diggingDuration, 200, 0);
let digSize = map(elapsed, 0, diggingDuration, 10, diamondSize * 1.5);
fill(139, 69, 19, alpha);
noStroke();
ellipse(diamondX, diamondY + diamondSize / 4, digSize, digSize / 2);
if (elapsed > diggingDuration) {
diggingAnimationActive = false;
diamondFound = true;
diamondOsc.start(0, 880, 0.5);
diamondOsc.amp(0, 0.5, 0.2);
diamondOsc.stop(0.7);
setTimeout(() => { triggerLevel7Win(); }, 2000);
}
} else {
drawFootballDiamond(diamondX, diamondY, diamondSize);
}
} else if (currentLevel === 6) {
drawUFO(diamondX, diamondY, diamondSize, color(0, 255, 255), color(255, 255, 0));
} else if (currentLevel === 9) {
fill(0, 255, 255);
noStroke();
ellipse(diamondX, diamondY, diamondSize, diamondSize);
} else if (currentLevel === 20) {
push();
translate(-camX + width / 2, -camY + height / 2);
drawInfiniteVoidDiamond(0, 0, diamondSize);
pop();
} else {
fill(0, 255, 255);
noStroke();
ellipse(diamondX, diamondY, diamondSize, diamondSize);
}
} else {
textAlign(CENTER, CENTER);
textSize(64);
fill(0);
if (gameCompleted) {
text("You Won the Ultimate Diamond Hunt!", -camX + width / 2, -camY + height / 2);
if (diamondRock) {
if (currentLevel === 6) {
drawUFO(diamondRock.x, diamondRock.y, diamondRock.size, color(0, 255, 255), color(255, 255, 0));
} else if (currentLevel === 7) {
drawFootballDiamond(diamondRock.x, diamondRock.y, diamondRock.size);
} else if (currentLevel === 8) {
drawSushi(diamondRock.x, diamondRock.y, diamondRock.size);
}
}
} else {
text("You Found the Diamond!", -camX + width / 2, -camY + height / 2);
}
}
if (gameCompleted) {
for (let i = confetti.length - 1; i >= 0; i--) {
confetti[i].update();
confetti[i].display();
if (confetti[i].isOffScreen()) {
confetti.splice(i, 1);
}
}
}
if (postWinAnimationActive) {
for (let i = grabbingPeople.length - 1; i >= 0; i--) {
let person = grabbingPeople[i];
if (person.state === 'movingToRock') {
let moveVec = createVector(person.targetX - person.x, person.targetY - person.y);
moveVec.normalize().mult(person.speed);
person.x += moveVec.x;
person.y += moveVec.y;
let d = dist(person.x, person.y, person.targetX, person.targetY);
if (d < person.speed * 2) {
person.state = 'grabbing';
if (diamondRock) {
diamondRock.size *= 0.9;
if (diamondRock.size < 5) diamondRock = undefined;
}
person.targetX = random(0, TOWN_WIDTH);
person.targetY = -camY - height;
person.speed = random(5, 10);
}
} else if (person.state === 'grabbing') {
person.state = 'leaving';
} else if (person.state === 'leaving') {
let moveVec = createVector(person.targetX - person.x, person.targetY - person.y);
moveVec.normalize().mult(person.speed);
person.x += moveVec.x;
person.y += moveVec.y;
if (person.y < -camY - BLOCK_SIZE || person.y > -camY + height + BLOCK_SIZE ||
person.x < -camX - BLOCK_SIZE || person.x > -camX + width + BLOCK_SIZE) {
grabbingPeople.splice(i, 1);
}
}
if (person) {
fill(person.color);
noStroke();
rect(person.x, person.y, person.bodyW, person.bodyH);
ellipse(person.x + person.bodyW / 2, person.y - person.headSize / 2, person.headSize, person.headSize);
}
}
if (grabbingPeople.length === 0) {
postWinAnimationActive = false;
}
}
}