WASD/Left Stick to Move | Click/Right Stick to Shoot | 'B'/RT for Bomb | 'F' for Fullscreen
FPS: 0
Enemies Alive: 0

GEOMETRY WARS

Defend the grid.

for (let i = 0; i < e.changedTouches.length; i++) { const touch = e.changedTouches[i]; if (!virtualSticks[stickName].active || virtualSticks[stickName].id === touch.identifier) { virtualSticks[stickName].active = true; virtualSticks[stickName].id = touch.identifier; const rect = zone.getBoundingClientRect(); const centerX = rect.left + rect.width / 2; const centerY = rect.top + rect.height / 2; let dx = touch.clientX - centerX; let dy = touch.clientY - centerY; const dist = Math.hypot(dx, dy); if (dist > maxDist) { dx = (dx / dist) * maxDist; dy = (dy / dist) * maxDist; } knob.style.transform = `translate(calc(-50% + ${dx}px), calc(-50% + ${dy}px))`; virtualSticks[stickName].deltaX = dx / maxDist; virtualSticks[stickName].deltaY = dy / maxDist; } } }; const handleEnd = (e) => { e.preventDefault(); for (let i = 0; i < e.changedTouches.length; i++) { if (virtualSticks[stickName].id === e.changedTouches[i].identifier) { virtualSticks[stickName].active = false; virtualSticks[stickName].id = null; virtualSticks[stickName].deltaX = 0; virtualSticks[stickName].deltaY = 0; knob.style.transform = `translate(-50%, -50%)`; } } }; zone.addEventListener('touchstart', handleTouch, { passive: false }); zone.addEventListener('touchmove', handleTouch, { passive: false }); zone.addEventListener('touchend', handleEnd, { passive: false }); zone.addEventListener('touchcancel', handleEnd, { passive: false }); } setupJoystick('left-joystick', 'left', 'left-knob'); setupJoystick('right-joystick', 'right', 'right-knob'); const mobilePauseZone = document.getElementById('mobile-pause-zone'); if (mobilePauseZone) { mobilePauseZone.addEventListener('touchstart', (e) => { e.preventDefault(); initAudio(); if (gameActive) { togglePause(); } else if (!gameOverScreen.classList.contains('hidden')) { resetGame(true); // Triggers continue } else if (!startScreen.classList.contains('hidden')) { startScreen.classList.add('hidden'); mainMenu.classList.remove('hidden'); if (!musicPlaying) sounds.startMusic(); } else if (!mainMenu.classList.contains('hidden')) { resetGame(false); } }, { passive: false }); } const mobileBombActionBtn = document.getElementById('mobile-bomb-btn'); if (mobileBombActionBtn) { mobileBombActionBtn.addEventListener('touchstart', (e) => { e.preventDefault(); useBomb(); }, { passive: false }); } startBtn.addEventListener('click', () => { initAudio(); startScreen.classList.add('hidden'); mainMenu.classList.remove('hidden'); if (!musicPlaying) sounds.startMusic(); }); startGameBtn.addEventListener('click', () => { initAudio(); resetGame(false); }); settingsBtn.addEventListener('click', () => { mainMenu.classList.add('hidden'); settingsMenu.classList.remove('hidden'); }); function openQrcodeToast() { const qrImg = document.getElementById('qrcode-img'); if (!qrImg.hasAttribute('src')) { let urlToEncode = window.location.href; if (urlToEncode.startsWith('file://')) { urlToEncode = 'https://everyonelovespepsicola.github.io/geometrywars/'; } qrImg.src = `https://api.qrserver.com/v1/create-qr-code/?size=200x200&data=${encodeURIComponent(urlToEncode)}`; } qrcodeToast.classList.remove('hidden'); } settingsQrcodeBtn.addEventListener('click', () => { openQrcodeToast(); }); pauseQrcodeBtn.addEventListener('click', () => { openQrcodeToast(); }); closeQrcodeBtn.addEventListener('click', () => { qrcodeToast.classList.add('hidden'); }); settingsBackBtn.addEventListener('click', () => { settingsMenu.classList.add('hidden'); mainMenu.classList.remove('hidden'); }); continueBtn.addEventListener('click', () => { initAudio(); resetGame(true); }); retryBtn.addEventListener('click', () => { initAudio(); resetGame(false); }); pollGamepadsForMenus(); function pollGamepadsForPause() { if (gamepadIndex !== null) { const gp = navigator.getGamepads()[gamepadIndex]; if (gp && gp.buttons[9] && gp.buttons[9].pressed) { if (!startButtonPressed) { if (gameActive && (isPaused || frame > 10)) togglePause(); startButtonPressed = true; } } else { startButtonPressed = false; } } requestAnimationFrame(pollGamepadsForPause); } // Build the cached images before the game starts buildRenderCache(); pollGamepadsForPause();