Skip to content
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
61 changes: 46 additions & 15 deletions script.js
Original file line number Diff line number Diff line change
Expand Up @@ -70,15 +70,19 @@ function spawnPest() {
word: word,
typed: "",
position: 100,
speed: 0.2 + Math.random() * 0.2,
speed: (0.2 + currentStage * 0.1) + Math.random() * 0.2,
typedSpan: typedSpan,
untypedSpan: untypedSpan
};
activePests.push(pestObj);
}

function updatePests(deltaTime) {
activePests.forEach((pest, i) => {
// Fix #23: Stop loop if hp <= 0 to prevent negative values
if (hp <= 0) return;

for (let i = activePests.length - 1; i >= 0; i--) {
const pest = activePests[i];
pest.position -= pest.speed * deltaTime;
pest.element.style.left = pest.position + "vw";

Expand All @@ -88,8 +92,10 @@ function updatePests(deltaTime) {
pest.element.remove();
activePests.splice(i, 1);
updateHP();
// Fix #23: Check immediately after damage to prevent multiple hits
if (hp <= 0) break;
}
});
}
}

function updateHP() {
Expand Down Expand Up @@ -130,17 +136,6 @@ function handleKeyPress(event) {
}, 200);

if (pest.hp <= 0) {
score += 100;
showPopup(pest.element, "+100", "score");
pest.element.remove();
activePests.splice(i, 1);

document.getElementById("boss-hp-container").style.display = "none";

// Boss defeated = menang!
showEndScreen("Selamat! Kamu Menang!");
}
if (pest.hp <= 0) {
score += 100;
showPopup(pest.element, "+100", "score");
pest.element.remove();
Expand Down Expand Up @@ -208,6 +203,36 @@ function showPopup(targetElement, text, type) {

document.addEventListener("keydown", handleKeyPress);

// Fix #15: Pause game when tab loses focus
let gamePaused = false;
document.addEventListener('visibilitychange', () => {
if (document.hidden) {
gamePaused = true;
// Pause all game timers
clearInterval(pestInterval);
// Pause BGM
const bgm1 = document.getElementById("bgm-stage1");
const bgm2 = document.getElementById("bgm-stage2");
const bgm3 = document.getElementById("bgm-stage3");
bgm1.pause(); bgm2.pause(); bgm3.pause();
} else {
if (gameStarted && gamePaused) {
gamePaused = false;
// Resume game loop
lastTime = performance.now();
requestAnimationFrame(gameLoop);
// Resume pest spawning based on stage
if (currentStage === 1) {
pestInterval = setInterval(spawnPest, 3000);
} else if (currentStage === 2) {
pestInterval = setInterval(spawnPest, 2000);
}
// Resume BGM
playBGM(currentStage);
}
}
});

function gameLoop(currentTime) {
const deltaTime = currentTime - lastTime;
updatePests(deltaTime / 16);
Expand Down Expand Up @@ -458,10 +483,16 @@ function toggleMute() {
}

function showEndScreen(message) {
// Fix #17: Save score to localStorage before showing end screen
const highScore = localStorage.getItem('kebunketik_highScore') || 0;
if (score > highScore) {
localStorage.setItem('kebunketik_highScore', score);
}

document.getElementById("game-container").style.display = "none";
document.getElementById("end-screen").style.display = "flex";
document.getElementById("end-message").innerText = message;
document.getElementById("final-score").innerText = "Skor: " + score;
document.getElementById("final-score").innerText = "Skor: " + score + " | High Score: " + Math.max(score, highScore);

// Hentikan BGM
const bgm1 = document.getElementById("bgm-stage1");
Expand Down